目录
一. 排序查询
二. 聚合函数
三. 分组查询
四. 分页查询
五. 总结
六. 基础查询
七. 条件查询
一. 排序查询
-
语法:
ORDER BY 子句
*ORDER BY 排序字段1,排序字段2... 排序方式
-
排序方式:
*ASC
:升序,默认
*DESC
:降序 -
注意:
* 如果有多个排序条件,则前边的条件值一样时,才会判断第二条件
*SELECT * FROM student ORDER BY math ASC, english DESC;
– 按照数学成绩排名,如果数学成绩一 样,则按照英语成绩排名倒序。
二. 聚合函数
概述:将一列数组作为一个整体,进行纵向的计算。
count
:计算个数- 一般选择非空的列:主键,推荐使用
count(*)
相当于行数,在统计结果的时候,不会忽略列值为NULL。不推荐使用
max
:计算最大值min
:计算最小值sum
:计算和avg
:计算平均值
注意:聚合函数的计算,会排除null值,不计算在内!
解决方案:
1. 选择不包含null的列计算
2. IFNULL函数
-- 聚合函数使用
SELECT COUNT(name) FROM student;
SELECT COUNT(english) FROM student;
SELECT COUNT(IFNULL(english,0)) FROM student; -- 如果english字段为空,则用0代替,然后在计算数量
SELECT COUNT(*) FROM student;
SELECT MAX(math) FROM student;
SELECT MIN(math) FROM student;
SELECT SUM(math) FROM student;
SELECT SUM(english) FROM student; -- english 成绩为null的,不计算在内
SELECT AVG(math) FROM student;
三. 分组查询
- 语法:
GROUP BY
分组字段 - 注意:
- 分组之后,查询的字段:分组字段,要么聚合函数,添加其他字段没有意义
WHERE
和HAVING
的区别?- WHERE 在分组之前进行限定:如果不满足这个条件,则不参与分组
HAVING 在分组之后进行限定:如果不满足结果,则不会被查询出来 - WHERE 后不可以跟聚合函数,
HAVING 可以进行聚合函数的判断
- WHERE 在分组之前进行限定:如果不满足这个条件,则不参与分组
-- 分组查询
-- 需求:按照性别分组,分别查询男/女同学的平均分
SELECT sex,AVG(math) FROM student GROUP BY sex;
-- 需求:按照性别分组,分别查询男/女同学的平均分、人数。
SELECT sex, AVG(math), COUNT(id) FROM student GROUP BY sex;
-- 需求:按照性别分组,分别查询男/女同学的平均分、人数。要求:分数低于70的人,不参与分组
SELECT sex, AVG(math), COUNT(id) FROM student WHERE math>=70 GROUP BY sex;
-- 需求:按照性别分组,分别查询男/女同学的平均分、人数。要求:1. 分数低于70的人,不参与分组; 2. 分组之后,人数要大于2个人
SELECT sex, AVG(math), COUNT(id) FROM student WHERE math>=70 GROUP BY sex HAVING COUNT(id) > 2;
-- 人数是 COUNT(id) 的别名,开发中我们一般要使用英文来命名别名。
SELECT sex, AVG(math), COUNT(id) 人数 FROM student WHERE math>=70 GROUP BY sex HAVING 人数 > 2;
四. 分页查询
- 语法:
LIMIT 开始的索引,每页查询的条数;
- 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
- 分页操作是一个“方言”,只能 LIMIT 语法只能在 MySQL 中使用;
-- 分页查询
SELECT * FROM student LIMIT 0,3; -- 第 1 页
SELECT * FROM student LIMIT 3,3; -- 第 2 页
-- 公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
SELECT * FROM student LIMIT 6,3; -- 第 3 页
五. 总结
select
字段列表
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
六. 基础查询
- 多个字段的查询
SELECT 字段1,字段2... FROM 表名
- 注意:如果查询所有字段,则可以使用 * 来替换字段列表
- 去除重复
DISTINCT
- 计算列
- 一般可以使用四则运算来计算一些列的值。(一般只会进行数值型的计算)
- IFNULL(表达式1,表达式2):NULL 参与的运算,计算结果都为 NULL
- 表达式1:哪个字段需要判断是否为NULL
- 如果该字段为NULL后的替换值
- 起别名
AS
:也可以省略
七. 条件查询
- WHERE 字句后跟条件
- 运算符
> 、< 、<= 、>= 、= 、<>
- BETWEEN…AND
- IN( 集合)
- LIKE:模糊查询
- 占位符:
- _:单个任意字符
- %:0个或者多个任意字符
- 占位符:
- IS NULL
- AND 或 &&
- OR 或 ||
- NOT 或 !
1. 条件查询
SELECT * FROM student;
2. 查询年龄大于50岁的人数
SELECT * FROM student WHERE age >= 50;
3. 查询年龄等于 50 的人
SELECT * FROM student WHERE age = 50;
4. 查询年龄不等于 50 的人
SELECT * FROM student WHERE age != 50;
SELECT * FROM student WHERE age <> 50;
5. 查询年龄大于等于30小于等于40的人
SELECT * FROM student WHERE age >= 30 AND age <= 40;
SELECT * FROM student WHERE age >= 30 && age <= 40; -- 不推荐
SELECT * FROM student WHERE age BETWEEN 30 AND 40;
6. 查询年龄 50岁,40,45岁 的信息
SELECT * FROM student WHERE age = 50 OR age = 40 OR age = 45;
SELECT * FROM student WHERE age IN(50,40,45);
7. 查询英语缺考的人。NULL 值不能使用 = != 做判断
SELECT * FROM student WHERE english IS NULL;
8. 查询英语有成绩的人
SELECT * FROM student WHERE english IS NOT NULL;
-- 模糊查询
SELECT * FROM student WHERE name LIKE '马%';
-- 查询第二个字是 化 的人
SELECT * FROM student WHERE name LIKE '_化%';
-- 查询姓名是三个字的人
SELECT * FROM student WHERE name LIKE '___';
-- 查询姓名中,包含 一 的人
SELECT * FROM student WHERE name LIKE '%一%'; -- 常用