目录
- 一、概述
- 二、数据准备
- 三、基础查询
- 四、条件查询
- 五、聚合函数
- 六、分组查询
- 七、排序查询
- 八、分页查询
- 九、DQL执行顺序
一、概述
主要用于对数据的查询操作,使用的关键字SELECT
SELECT 字段列表 FROM 表名 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组后条件列表 ORDER BY 排序字段 LIMIT 分页参数
二、数据准备
CREATE TABLE `tb_user` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '编号',
`name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL COMMENT '姓名',
`age` int DEFAULT NULL COMMENT '年龄',
`gender` varchar(1) COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '性别',
`kssj` datetime DEFAULT NULL COMMENT '开始时间',
`jssj` datetime DEFAULT NULL COMMENT '结束时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表'
INSERT INTO `mysql_demo`.`tb_user` (`id`, `name`, `age`, `gender`, `kssj`, `jssj`) VALUES (1, '张三', 12, '0', '2024-08-18 21:19:07', '2024-08-19 21:19:51');
INSERT INTO `mysql_demo`.`tb_user` (`id`, `name`, `age`, `gender`, `kssj`, `jssj`) VALUES (2, '李四', 34, '0', '2024-08-14 21:20:09', '2024-08-15 21:20:13');
INSERT INTO `mysql_demo`.`tb_user` (`id`, `name`, `age`, `gender`, `kssj`, `jssj`) VALUES (3, '王五', 32, '0', '2024-08-09 21:20:27', NULL);
INSERT INTO `mysql_demo`.`tb_user` (`id`, `name`, `age`, `gender`, `kssj`, `jssj`) VALUES (4, '赵六', 77, '0', '2024-08-10 21:20:59', NULL);
INSERT INTO `mysql_demo`.`tb_user` (`id`, `name`, `age`, `gender`, `kssj`, `jssj`) VALUES (6, '张三', 55, '1', NULL, NULL);
三、基础查询
查询多个字段 — 不推荐
SELECT * FROM tb_user;
查询多个字段 — 推荐
SELECT id,`name`,age,gender,kssj,jssj FROM tb_user;
设备别名
SELECT `name` AS '姓名' FROM tb_user;
去重
SELECT DISTINCT `name` AS '姓名' FROM tb_user;
四、条件查询
比较运算符 | 功能 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
< | 小于等于 |
= | 等于 |
<> 或 != | 不等于 |
BETWEEN…AND… | 在某个范围之内(含最小、最大值) |
IN(…) | 枚举,多选一 |
LIKE | 模糊查询,_匹配当个字符 %匹配多个字符 |
IS NULL | 是NULL |
逻辑运算符 | 功能 |
---|---|
AND 或 && | 并且 |
OR | 或者 |
NOT 或 ! | 不是 |
条件查询 年龄大于20
SELECT * FROM tb_user WHERE age > 20;
查询没有开始结束时间的数据
SELECT * FROM tb_user WHERE kssj IS NULL OR jssj IS NULL;
查询年龄在20-40之间的数据
SELECT * FROM tb_user WHERE age BETWEEN 20 AND 40;
查询姓名不是张三的数据
SELECT * FROM tb_user WHERE `name` <> '张三';
查询李四、王五的数据
SELECT * FROM tb_user WHERE `name` IN ('李四', '王五');
查询姓名为4个字的用户数据
SELECT * FROM tb_user WHERE `name` LIKE '____';
查询最后一个字符是四的数据
SELECT * FROM tb_user WHERE `name` LIKE '%四';
五、聚合函数
将一列数据作为一个整体,进行纵向计算。在数据函数中所有的NULL值是不进行运算的
函数 | 功能 |
---|---|
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
统计员工数量
SELECT COUNT(*) FROM tb_user;
查询员工的最大年龄
SELECT MAX(age) FROM tb_user;
查询员工的最小年龄
SELECT MIN(age) FROM tb_user;
查询员工的平均年龄
SELECT AVG(age) FROM tb_user;
查询员工年龄之和
SELECT SUM(age) FROM tb_user;
六、分组查询
语法
SELECT 查询字段 FROM 表名 WHERE 查询条件 GROUP BY 分组字段 HAVING 分组后过滤条件
WHERE与HAVING的区别
- 执行的时机不同:WHERE发生在分组之前,HAVING发生在分组之后。
- 判断条件不同:WHERE不能对聚合函数进行判断,HAVING可以
按照性别分组:查询平均年龄
SELECT gender,AVG(age) FROM tb_user GROUP BY gender;
按照性别分组:查询男生与女生的数量
SELECT gender,COUNT(id) FROM tb_user GROUP BY gender;
查询年龄大于18岁的员工 并且 按照工作地址分组 获取员工数量大于3的地址
SELECT dz, COUNT(id) dz_count FROM tb_user WHERE age >= 18 GROUP BY dz HAVING dz_count >=3;
注意:分组之后,查询的字段一般为聚合函数和分组字段,查询其他的字段没有任何意义,其余字段默认查询的是第一条数据。
七、排序查询
语法
SELECT 查询条件 FROM 表名 ORDER BY 排序字段1 排序方式1,排序字段2 排序方式2;
方法 | 含义 |
---|---|
ASE | 升序 |
DESC | 降序 |
根据年龄排序倒叙,姓名升序
SELECT * FROM tb_user ORDER BY age DESC, `name` ASC;
注意:多字段排序,先按照第一个条件排序,再按照之后的条件一次排序
八、分页查询
语法
SELECT 查询条件 FROM 表名 LIMIT 起始索引, 查询记录数;
注意:
- 起始索引从0开始,起始索引 =(查询页数 - 1)* 每页记录数
- 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL使用的是LIMIT
- 如果查询的是第一页数据,起始索引可以省略,直接写成 LIMIT 10