黑马就业班(01.JavaSE Java语言基础\12.MySQL数据库)——part2:MySQL 表的约束与数据库设计(多表之间的3种关系、数据库设计范式)

1、主要内容
  这一章的主要内容如下

1. DQL:查询语句
		1. 排序查询
		2. 聚合函数
		3. 分组查询
		4. 分页查询

2. 约束
3. 多表之间的关系
4. 范式
5. 数据库的备份和还原

2、DQL查询语句
  排序查询
在这里插入图片描述

* 语法:order by 子句
	* order by 排序字段1 排序方式1 ,  排序字段2 排序方式2...

* 排序方式:
	* ASC:升序,默认的。
	* DESC:降序。

* 注意:
	* 如果有多个排序字段与排序条件,则当前边字段的条件值一样时,才会判断第二个字段的条件。

  聚合函数:将一列数据作为一个整体,进行纵向的计算。(前面我们介绍的是横向的计算)

1. count:计算个数
	1. 一般选择非空的列:主键
	2. count(*)
2. max:计算最大值
3. min:计算最小值
4. sum:计算和
5. avg:计算平均值

* 注意:聚合函数的计算,排除null值。
	解决方案:
		1. 选择不包含非空的列进行计算
		2. IFNULL函数

  分组查询

1. 语法:group by 分组字段;
2. 注意:
	1. 分组之后查询的字段:分组字段、聚合函数
	2. wherehaving 的区别?
		1. where 在分组之前进行限定,如果不满足条件,则不参与分组。having在分组之后进行限定,如果不满足结果,则不会被查询出来
		2. where 后不可以跟聚合函数,having可以进行聚合函数的判断。
		因为聚合函数的值是查询之后才有,而where是在查询之前判断。而having是在查询分组之后对分组限定,此时聚合函数以及查询出来,可以进行判断。

  分页查询

1. 语法:limit 开始的索引,每页查询的条数;
2. 公式:开始的索引 = (当前的页码 - 1* 每页显示的条数
	-- 每页显示3条记录 

	SELECT * FROM student LIMIT 0,3; -- 第1页
	
	SELECT * FROM student LIMIT 3,3; -- 第2页
	
	SELECT * FROM student LIMIT 6,3; -- 第3页

3. limit 是一个MySQL"方言"

  查询的相应代码如下

/*首先,我们创建一张新表stu,并插入数据*/
CREATE TABLE people (
 
id INT,-- 编号
 
NAME VARCHAR(20), -- 姓名
 
age INT, -- 年龄
 
sex VARCHAR(5),-- 性别
 
address VARCHAR(100),-- 地址
 
math INT, -- 数学
 
english INT -- 英语
);
INSERT INTO people(id,NAME,age,sex,address,math,english) VALUES (1,'马云',55,'男','
杭州',66,78),(2,'马化腾',45,'女','深圳',98,87),(3,'马景涛',55,'男','香港',56,77),(4,'柳岩',20,'女','湖南',76,65),
(5,'柳青',20,'男','湖南',86,NULL),(6,'刘德华',57,'男','香港',99,99),
(7,'马德',22,'女','香港',99,99),(8,'德玛西亚',18,'男','南京',56,65);

SELECT * FROM people; -- 查询整体新表

-- ----------------------------------------排序查询

-- 按照数学成绩升序排序(升序可以不写,默认排序方式是升序)
SELECT * FROM people ORDER BY math ASC;
-- 按照数学成绩降序排序
SELECT * FROM people ORDER BY math DESC;
-- 按照数学成绩升序排序,如果数学成绩一样,则按照英语成绩升序排名
SELECT * FROM people ORDER BY math ASC , english ASC;

-- ----------------------------------------聚合函数

-- 计算表里面一共有多少个学生(通过姓名)
SELECT COUNT(NAME) FROM people;

-- 计算表里面一共有多少个英语成绩
SELECT COUNT(english) FROM people; 
# 我们发现空的英语成绩没有被计算进来,既聚合函数的计算,排除null值。
# 这样不太合理,而我们统计个数如果缺少某一个,就显得不合理
-- IFNULL函数解决——将null值替换为0,这样计算个数的时候便会将其计算进来
SELECT COUNT(IFNULL(english,0)) FROM people;
-- 选择非空的列进行个数的计算:1)一般选择非空的列:主键 ;2)count(*)既只要某一行有一个数据不为null,就可以纵向加1
SELECT COUNT(*) FROM people;# count(*) 不推荐
SELECT COUNT(id) FROM people;# 主键(非null)推荐

-- 计算数学成绩最大值
SELECT MAX(math) FROM people;
-- 计算数学成绩平均值
SELECT AVG(math) FROM people;
-- 计算数学成绩之和
SELECT SUM(math) FROM people;

-- ----------------------------------------分组查询

-- 按照性别分组,然后分别查询男女同学的数学平均分
SELECT sex,AVG(math) AS '数学平均分' FROM people GROUP BY sex;
# 我们进行分组后查询的只能是:分组字段、聚合函数
# 假如我们按照sex进行分组,我们就是按“男”“女”将整体分为2组,分别将“男”“女”看为整体,再去查询个体信息(如name)就没有意义
# 如果我们分组后硬要查询个体信息,也只会显示“男”“女”2组2行(查询聚合函数也只会显示“男”“女”2组2行),这是没有意义的

-- 按照性别分组,然后分别查询男女同学的数学平均分,男女的人数
SELECT sex,AVG(math),COUNT(id) FROM people GROUP BY sex;

-- 按照性别分组,然后分别查询男女同学的数学平均分,男女的人数。要求:分数低于70分不参与分组
-- 既限定参加分组的条件
SELECT sex,AVG(math),COUNT(id) FROM people WHERE math>70 GROUP BY sex;# 在分组之前限定参与分组的条件

-- 想看分组之后人数大于2个人的组(既分组之后,对所分的组再进行条件限定)
SELECT sex,AVG(math),COUNT(id) FROM people WHERE math>70
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值