mySQL的简单调用 重点聚合函数和分组

mySQL的简单调用 重点聚合函数和分组

1、安装

1.1 终端连接

		>> 基本命令
		打开终端:win + r ,输入 cmd ,按回车
		window 系统:盘符切换:直接输入盘符 -> d:  并回车
		
		>> 连接 数据库
		mysql -u 用户名 -p	

2、数据库认识

2.1 数据库分类

		>> 关系型数据库(mysql)
		
		>> 非关系型数据库(mongodb、redis)

2.2 理解关系型数据库

		类比 表格。
		
		>> 关系型数据库中三种关系
			一对一关系
			一对多关系
			多对多关系

2.3 SQL 的认识

		>> 什么是 SQL
			一种用于管理关系型数据库、与数据库中的数据进行通讯的计算机标准语言。
			
		>> 语言组成
			数据定义语言(DDL)
			数据查询语言(DQL)
			数据操作语言(DML)
			数据控制语言(DCL)
			
		>> DBMS(数据库管理系统)
			数据库河西组成部分,主要完成对数据库的操作与管理。

3、mysql

3.1 创建数据库

		create database 数据库名;

3.2 创建表

		CREATE TABLE `students` (
		  `student_id` int(11) NOT NULL AUTO_INCREMENT,
		  `student_name` varchar(20) NOT NULL COMMENT '学生姓名',
		  PRIMARY KEY (`student_id`)
		) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

3.3 数据类型

		>> 整数类型
			tinyint -- 1字节
			int -- 4字节
			bigint -- 8字节
			
		>> 浮点数类型
			float(m,d) -- 小数,4字节,单精度
			double(m, d)  --  8字节,双精度
			decimal(m, d) 
			
		>> 字符类型
			char -- 固定长度(0~255)
			varchar -- 可变长度(0~65535)
			text -- 长文字
			
			假设 char(4)与varchar(4)的区别
			
		>> 日期
			date -- yyyy-mm-dd
			datetime -- yyyy-mm-dd hh:mm:ss
			time -- hh:mm:ss
			timestamp 时间戳

4、增删改操作

4.1 新增数据

		insert into 表名 values (列1值,列2值);
		insert into 表名 (列1, 列2) values (列1值,列2值); -- 指定列添加数据
		insert into 表名 values (列1值,列2值),(列1值,列2值) -- 同时添加多条数据

4.2 修改数据

		update 表名 set 列名1=新值, 列名2=新值 where 条件;

4.3 删除数据

		delete from 表名 where 条件;

5、数据完整性

5.1 实体完整性

	>> 主键:一般是当前表的 id
	  PRIMARY KEY 
	
	>> 唯一性
	  unique
	
	CREATE TABLE `students` (
	  `student_id` int(11),
	  `student_name` varchar(20) unique,
	  PRIMARY KEY (`student_id`) 
	) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

5.2 域完整性

	>> 非空约束
		`student_name` varchar(20) NOT NULL COMMENT '学生姓名',
	
	>> 默认值
	  `sex` tinyint(1) DEFAULT '1' COMMENT '1-男 2-女',

5.3 自定义完整性

	`student_id` int(11) NOT NULL AUTO_INCREMENT,
                         -- 不为空 自增

5.4 引用完整性

	>> 外键约束:表达表和表之间的关系
		-- 第一步:创建主表(外键要连接的表,即 班级表)
		
		-- 第二步:创建从表(发生依赖关系的表,即需要设置外键的表,即 学生表)
			CONSTRAINT `students_ibfk_1` FOREIGN KEY (`grades_id`) REFERENCES `grades` (`grades_id`)

– 添加"李四":
INSERT INTO students VALUES (NULL,‘李四’);

– 指定字段添加信息
INSERT INTO students(student_name) VALUES (‘王五’);

– 多条数据添加
INSERT INTO students(student_name) VALUES (‘麻子’),(‘刚娃子’);

– 如果更新的时候不写条件,将会更细所有的数据
UPDATE students SET student_name=‘李雷’;

– 更新指定条件
UPDATE students SET student_name=‘韩梅梅’ WHERE student_id=3;

– 删除id为6的数据
DELETE FROM students WHERE student_id=6;

– 不加条件,全删
DELETE FROM students;

– 删除所有数据,标识列恢复默认值
TRUNCATE TABLE students;

1、数据查询

1.1 基本语法

		select * | 列名
		from 表名
		DISTINCT 返回唯一不同的值
		[where 条件]
		[group by 分组名]
		[having 筛选条件]
		[order by 排序]
		[limit 限制结果数量]

1.2 查询操作的分类

		投影操作:指定查询的结果中能显示哪些列;
		
		选择操作:指定哪些行出现在结果中;
		
		排序操作:指定查询的结果以什么样的顺序显示

– 查询students表里的所有信息
SELECT DISTINCT garden FROM students;

– 查询学生信息且班级不重复
SELECT * FROM students;

– 选择某些列进行投影
SELECT student_name,age FROM students;

– 别名设置
SELECT student_name AS studentName,age FROM students;
– 简写
SELECT student_name studentName,age FROM students;

where 查询

>> 单条件
	= > < >=
	
>> 多条件
	and or
	
>> 范围
	between ... and ... / in / not in
	
>> 模糊查询
	like
	
	规则:
	%:任意长度任意字符
	_:任意单个字符

– 查询age>8的学生的 student_name,age的信息
SELECT student_name,age FROM students WHERE age>8;

– 查询age>8和sex=1的学生的 student_name,age的信息
SELECT student_name,age FROM students WHERE age>8 AND sex=1;

– 查询age在10和16之间的学生的 student_name,age信息
SELECT student_name,age FROM students WHERE age BETWEEN 10 AND 16;

– 查询grades_id不在(2,4)之间的学生的 student_name,age信息
SELECT student_name,age FROM students WHERE grades_id NOT IN (2,4);

– 找姓李
SELECT student_name,age FROM students WHERE student_name LIKE ‘李%’;

– 找王XX
SELECT student_name,age FROM students WHERE student_name LIKE ‘王__’;

– 带 四 这个字的 ‘%四%’

– 查询电话号码不为空
– is null
– is not null
SELECT student_name,age FROM students WHERE tel IS NOT NULL;

排序:
– 默认升序 asc
SELECT * FROM students ORDER BY age;

– desc 降序
SELECT * FROM students ORDER BY age DESC;

限制
limit 开始位置,指定行数
开始位置是从 0 开始的
SELECT * FROM students LIMIT 2,2;

聚合函数:(难点)

查询中经常会对数据进行统计,就需要用到聚合函数。
注意:
返回的是单行单列;
不能和普通列一起查询。

/
– 求数量:count()
SELECT COUNT(
) FROM students;

– 求男生的数量
SELECT COUNT(*) FROM students WHERE sex=1;

– 查询 age 非空的学生数量
SELECT COUNT(age) FROM students;

– 统计 grades_id 没有重复的数量
SELECT COUNT(DISTINCT grades_id) FROM students;

– 求平均值:avg
– 不会计算空值
SELECT AVG(age) FROM students;

– ifnull(字段, 指定值)
SELECT AVG(IFNULL(age, 0)) FROM students;

– 别名设置
SELECT AVG(IFNULL(age, 0)) studentAvg FROM students;

– 求最大值:max
SELECT MAX(age) FROM students;

– 求最小值:min
SELECT MIN(age) FROM students;

– 求和:sum
SELECT SUM(age) FROM students;

分组查询:(难点)

将表中的行进行分组,然后在每个分组上应用聚合函数。

– 每个班级有多少人
SELECT grades_id,COUNT(*) FROM students GROUP BY grades_id;

– 每个班级最老的年龄
SELECT grades_id,MAX(age) FROM students GROUP BY grades_id;

– 统计各个班级男女各多少人
SELECT grades_id,sex,COUNT(*) FROM students GROUP BY grades_id,sex;

– 分组统计各个年级的男生人数大于1的
SELECT grades_id,sex,COUNT()
FROM students
WHERE sex=1 – 发生在聚合之前
GROUP BY grades_id,sex
HAVING COUNT(
)>1; – having 是对聚合之后的数据进行筛选

– 分组统计各个年级的男生人数大于1的,并且按人数进行升序排列
SELECT grades_id,sex,COUNT(*) num
FROM students
WHERE sex=1
GROUP BY grades_id,sex
HAVING num>1
ORDER BY num;

– 分组统计各个年级的男生人数大于1的,并且按人数进行升序排列,然后分页显示
SELECT grades_id,sex,COUNT(*) num
FROM students
WHERE sex=1
GROUP BY grades_id,sex
HAVING num>1
ORDER BY num
LIMIT 0,1;

– 需求:返回学生 王五 的 班级名字
SELECT grades_id FROM students WHERE student_name=‘王五’;
– 子查询
SELECT * FROM grades WHERE grades_id=(SELECT grades_id FROM students WHERE student_name=‘王五’);
– 表联接
SELECT * FROM students
JOIN grades – 连接表
ON students.grades_id=grades.grades_id
WHERE students.student_name=‘王五’

上一篇:Java多态


下一篇:【C语言程序设计第四版】例9-3代码