【MySQL3】DQL | 数据查询语言 前言DQLData Query Language 数据查询语言是 MySQL 开发使用频率最高的语句核心关键字SELECT。完整书写顺序SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT六大查询分类基础查询、条件查询、聚合函数、分组查询、排序查询、分页查询一、测试环境准备emp 员工表所有案例均基于 emp 员工表先执行建表、删表语句插入测试数据练习。sql-- 如果表存在先删除 DROP TABLE IF EXISTS emp; -- 创建员工表 CREATE TABLE emp ( id INT COMMENT 员工编号, workno VARCHAR(10) COMMENT 工号, name VARCHAR(10) COMMENT 姓名, gender CHAR(1) COMMENT 性别, age TINYINT COMMENT 年龄, idcard CHAR(18) COMMENT 身份证号, workaddress VARCHAR(50) COMMENT 工作地址, entrydate DATE COMMENT 入职日期 ) COMMENT 员工信息表; -- 自行插入测试数据即可练习 INSERT INTO emp VALUES (1,001,张三,男,22,6101xxxx,西安,2020-01-10), (2,002,李华,女,19,6102xxxx,北京,2021-03-15), (3,003,王五五,男,30,NULL,西安,2019-11-20);二、基础查询1. 核心语法sql-- 查询指定字段 SELECT 字段1,字段2,字段3 FROM 表名; -- 查询所有字段 SELECT * FROM 表名;开发规范禁止使用SELECT *只查需要的字段提升查询性能。2. 字段别名 AS关键字AS可省略别名中文建议加单引号sql-- 完整写法 SELECT workaddress AS 工作地址 FROM emp; -- 简写写法省略AS SELECT workaddress 工作地址 FROM emp;3. 去重 DISTINCT去除查询结果中重复的数据sql-- 查询所有不重复的工作地址并起别名 SELECT DISTINCT workaddress 工作地址 FROM emp;4. 实操案例sql-- 1. 查询姓名、工号、年龄 SELECT name, workno, age FROM emp; -- 2. 查询全部员工信息仅测试使用 SELECT * FROM emp; -- 3. 查询员工工作地址设置别名 SELECT workaddress AS 工作地址 FROM emp; -- 4. 查询所有不重复工作地址 SELECT DISTINCT workaddress 工作地址 FROM emp;三、条件查询 WHERE1. 语法sqlSELECT 字段列表 FROM 表名 WHERE 条件列表;2. 常用运算符表格分类运算符说明比较运算符 ! / 大于、小于、等于、不等于范围BETWEEN ... AND闭区间最小值在前最大值在后多选一IN(值1,值2,值3)匹配括号内任意一个值模糊匹配LIKE _ %_匹配单个任意字符%匹配任意多个字符空值判断IS NULL / IS NOT NULL判断字段是否为 NULL不能用 NULL逻辑运算符AND()、OR()、NOT(!)且、或、非3. 全套实操案例sql-- 1. 查询年龄等于88的员工 SELECT * FROM emp WHERE age 88; -- 2. 查询年龄小于20 SELECT * FROM emp WHERE age 20; -- 3. 年龄小于等于20 SELECT * FROM emp WHERE age 20; -- 4. 无身份证号idcard为NULL SELECT * FROM emp WHERE idcard IS NULL; -- 5. 有身份证号 SELECT * FROM emp WHERE idcard IS NOT NULL; -- 6. 年龄不等于88 SELECT * FROM emp WHERE age ! 88; SELECT * FROM emp WHERE age 88; -- 7. 年龄15~20包含两端两种写法 SELECT * FROM emp WHERE age 15 AND age 20; SELECT * FROM emp WHERE age BETWEEN 15 AND 20; -- 8. 女员工 且 年龄小于25 SELECT * FROM emp WHERE gender 女 AND age 25; -- 9. 年龄是18/20/40其中一个 SELECT * FROM emp WHERE age IN(18,20,40); -- 10. 姓名两个字两个下划线 SELECT * FROM emp WHERE name LIKE __; -- 11. 身份证最后一位是x SELECT * FROM emp WHERE idcard LIKE %x;四、聚合函数纵向统计1. 概念将一整列数据作为整体纵向计算只返回一行统计结果NULL值不参与运算。2. 常用聚合函数表格函数作用COUNT(字段/*)统计记录行数MAX(字段)求最大值MIN(字段)求最小值AVG(字段)求平均值SUM(字段)求和3. 语法sqlSELECT 聚合函数(字段) FROM 表名 [WHERE 条件];4. 案例sql-- 1. 统计员工总数量 SELECT COUNT(*) FROM emp; -- 2. 统计员工平均年龄 SELECT AVG(age) FROM emp; -- 3. 最大年龄 SELECT MAX(age) FROM emp; -- 4. 最小年龄 SELECT MIN(age) FROM emp; -- 5. 西安地区员工年龄总和 SELECT SUM(age) FROM emp WHERE workaddress 西安;五、分组查询 GROUP BY HAVING1. 完整语法sqlSELECT 分组字段,聚合函数 FROM 表名 [WHERE 分组前过滤条件] GROUP BY 分组字段 [HAVING 分组后过滤条件];2. WHERE 和 HAVING 核心区别执行时机WHERE分组之前过滤原始行不满足条件的数据直接不参与分组HAVING分组之后对分组统计结果过滤。聚合函数支持WHERE不能写聚合函数HAVING可以使用聚合函数。执行顺序WHERE → 聚合计算 → HAVING3. 开发注意分组后SELECT只能查询分组字段 聚合函数查询其他普通字段无业务意义。4. 实操案例sql-- 1. 按性别分组统计男女员工数量 SELECT gender, COUNT(*) FROM emp GROUP BY gender; -- 2. 按性别分组统计男女平均年龄 SELECT gender, AVG(age) FROM emp GROUP BY gender; -- 3. 先筛选年龄45员工按地址分组筛选人数≥3的地址 -- 给count结果起别名HAVING可直接使用别名 SELECT workaddress, COUNT(*) addr_count FROM emp WHERE age 45 GROUP BY workaddress HAVING addr_count 3;六、排序查询 ORDER BY1. 语法sqlSELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式, 字段2 排序方式;2. 排序规则ASC升序默认可省略DESC降序不可省略多字段排序先按第一个字段排序值相同再按第二个字段排序。3. 案例sql-- 1. 年龄升序 SELECT * FROM emp ORDER BY age ASC; SELECT * FROM emp ORDER BY age; -- ASC省略 -- 2. 入职时间降序 SELECT * FROM emp ORDER BY entrydate DESC; -- 3. 年龄升序年龄相同则入职时间降序 SELECT * FROM emp ORDER BY age ASC, entrydate DESC;七、分页查询 LIMITMySQL 方言1. 语法sqlSELECT 字段 FROM 表名 LIMIT 起始索引, 每页记录数;2. 关键规则起始索引从0开始计算公式起始索引 (页码 - 1) * 每页条数查询第一页时起始索引 0 可省略简写LIMIT 条数LIMIT 是 MySQL 独有语法Oracle、SQL Server 分页语法不同。3. 案例每页 10 条sql-- 第1页0~9条 SELECT * FROM emp LIMIT 0,10; SELECT * FROM emp LIMIT 10; -- 简写 -- 第2页10~19条 SELECT * FROM emp LIMIT 10,10;八、综合 DQL 实战练习题sql-- 1. 查询20/21/22/23岁女性员工 SELECT * FROM emp WHERE gender 女 AND age IN(20,21,22,23); -- 2. 男员工年龄20~40姓名三个字 SELECT * FROM emp WHERE gender 男 AND age BETWEEN 20 AND 40 AND name LIKE ___; -- 3. 统计年龄小于60岁的男女员工人数 SELECT gender, COUNT(*) FROM emp WHERE age 60 GROUP BY gender; -- 4. 查询≤35岁员工姓名年龄年龄升序同年龄入职时间降序 SELECT name, age FROM emp WHERE age 35 ORDER BY age ASC, entrydate DESC; -- 5. 20-40岁男性按年龄升序、入职升序取前5条 SELECT * FROM emp WHERE gender 男 AND age BETWEEN 20 AND 40 ORDER BY age ASC, entrydate ASC LIMIT 5;九、DQL 书写顺序 VS 真实执行顺序重点难点1. 开发者书写顺序记忆顺序SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT2. MySQL 引擎真实执行顺序决定别名、语法报错FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT3. 关键结论踩坑点WHERE执行早于SELECTWHERE 中不能使用 SELECT 定义的别名ORDER BY执行在SELECT之后可以使用字段别名sql-- 验证执行顺序WHERE不能用别名ORDER BY可以 SELECT name ename, age eage FROM emp e WHERE age 15 ORDER BY eage ASC; -- 错误写法WHERE ename 张三 直接报错十、全文知识点总结基础查询指定字段、SELECT *、AS别名、DISTINCT去重开发避免*条件查询 WHERE各类比较运算符、BETWEEN AND、IN、LIKE模糊匹配、IS NULL空值判断聚合函数COUNT/MAX/MIN/AVG/SUM纵向统计单列分组 GROUP BYHAVINGWHERE 分组前过滤HAVING 分组后过滤HAVING 支持聚合函数排序 ORDER BYASC升序、DESC降序支持多字段先后排序分页 LIMITMySQL 专属索引公式(页码-1)*每页条数执行顺序FROM 最先LIMIT 最后WHERE 不能用 SELECT 别名完整 DQL 模板sqlSELECT [DISTINCT] 字段1 [AS 别名], 聚合函数(字段) FROM 表名 WHERE 分组前行过滤条件 GROUP BY 分组字段 HAVING 分组后聚合过滤条件 ORDER BY 排序字段 ASC/DESC LIMIT 起始索引, 每页条数;