国庆节10月1日
--


DQL数据查询语言:基本查询、条件查询、聚合函数、分组、排序、分页的完整用法
DQL(Data Query Language):数据查询语言,用来查询数据库表中的记录。查询关键字为 SELECT。在业务系统中,查询是最常用、最重要的操作。
1SELECT 字段列表2FROM 表名列表3WHERE 条件列表4GROUP BY 分组字段列表5HAVING 分组后条件列表6ORDER BY 排序字段列表7LIMIT 分页参数1-- 查询指定字段2SELECT 字段1, 字段2 FROM 表名;3
4-- 查询所有字段5SELECT * FROM 表名;6
7-- 设置别名8SELECT 字段1 [AS] 别名1, 字段2 [AS] 别名2 FROM 表名;9
10-- 去除重复记录11SELECT DISTINCT 字段列表 FROM 表名;示例:
1SELECT name, entry_date FROM emp;2SELECT name AS 姓名, entry_date AS 入职日期 FROM emp;3SELECT DISTINCT job FROM emp;
*号查询所有字段,开发中尽量少用(不直观、影响效率)。
1SELECT 字段列表 FROM 表名 WHERE 条件列表;| 运算符 | 说明 |
|---|---|
> >= < <= = | 大小比较 |
<> 或 != | 不等于 |
BETWEEN ... AND ... | 在范围内(含边界) |
IN(...) | 多值匹配 |
LIKE | 模糊匹配(% 任意字符,_ 单个字符) |
IS NULL / IS NOT NULL | 空值判断 |
| 运算符 | 说明 |
|---|---|
AND 或 && | 逻辑与 |
OR 或 ` | |
NOT 或 ! | 逻辑非 |
示例:
1-- 姓名等于2SELECT * FROM emp WHERE name = '杨逍';3
4-- 薪资范围5SELECT * FROM emp WHERE salary <= 5000;6
7-- NULL 判断8SELECT * FROM emp WHERE job IS NULL;9SELECT * FROM emp WHERE job IS NOT NULL;10
11-- 不等12SELECT * FROM emp WHERE password <> '123456';13
14-- 日期范围15SELECT * FROM emp WHERE entry_date BETWEEN '2000-01-01' AND '2010-01-01';16
17-- IN 多值18SELECT * FROM emp WHERE job IN (2, 3, 4);19
20-- 模糊匹配21SELECT * FROM emp WHERE name LIKE '__'; -- 两个字22SELECT * FROM emp WHERE name LIKE '张%'; -- 姓张23SELECT * FROM emp WHERE name LIKE '%二%'; -- 包含"二"| 函数 | 功能 |
|---|---|
COUNT(字段) | 统计行数(忽略 NULL) |
SUM(字段) | 求和 |
MAX(字段) | 最大值 |
MIN(字段) | 最小值 |
AVG(字段) | 平均值 |
聚合函数会忽略 NULL 值。
COUNT(*)是统计总行数的推荐写法(MySQL 底层优化)。
示例:
1SELECT COUNT(*) FROM emp; -- 员工总数2SELECT AVG(salary) FROM emp; -- 平均薪资3SELECT MIN(salary) FROM emp; -- 最低薪资4SELECT MAX(salary) FROM emp; -- 最高薪资5SELECT SUM(salary) FROM emp; -- 薪资总额1SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段 [HAVING 分组后条件];示例:
1-- 按性别统计人数2SELECT gender, COUNT(*) FROM emp GROUP BY gender;3
4-- 分组前筛选 + 分组后过滤5SELECT job, COUNT(*)6FROM emp7WHERE entry_date <= '2015-01-01'8GROUP BY job9HAVING COUNT(*) >= 2;| 对比维度 | WHERE | HAVING |
|---|---|---|
| 执行时机 | 分组前过滤 | 分组后过滤 |
| 能否使用聚合函数 | 不能 | 可以 |
执行顺序:WHERE → 聚合函数 → HAVING
1SELECT 字段列表 FROM 表名 ORDER BY 字段1 [ASC|DESC], 字段2 [ASC|DESC] ...;ASC:升序(默认,可省略)DESC:降序示例:
1-- 按入职时间升序2SELECT * FROM emp ORDER BY entry_date;3
4-- 按入职时间降序5SELECT * FROM emp ORDER BY entry_date DESC;6
7-- 多字段排序:入职时间升序,相同时按更新时间降序8SELECT * FROM emp ORDER BY entry_date ASC, update_time DESC;1SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数;起始索引 = (页码 - 1) × 每页记录数示例:
1-- 第1页,每页5条2SELECT * FROM emp LIMIT 0, 5;3-- 等价简写4SELECT * FROM emp LIMIT 5;5
6-- 第2页,每页5条7SELECT * FROM emp LIMIT 5, 5;8
9-- 第3页,每页5条10SELECT * FROM emp LIMIT 10, 5;DQL 是业务系统中最核心的操作,网站/APP 的数据展示、搜索、报表导出等功能均依赖 DQL 实现。
NULL 判断只能用 IS NULL / IS NOT NULL,不能用 = NULL。SELECT 的字段通常仅限聚合函数和分组字段,查询其他字段无意义。LIMIT 是 MySQL 方言,不同数据库的分页语法不同。LIMIT 5 等价于 LIMIT 0, 5。1-- 创建 emp 表并插入测试数据,详见源文档 3.3.2 节。2-- 包含 30 条梁山好汉员工数据,覆盖性别、职位、薪资等多种筛选场景。如果你喜欢,那么欢迎来到我的世界!
了解更多暂未播放



"所有的相遇都是久别重逢。"—— 未知


