目录
案例一:员工管理的条件分页查询
需求分析
- 查询条件:根据员工姓名(支持模糊匹配)、性别(精确查询)、入职时间(范围查询)进行搜索。员工姓名输入“张”,性别选择“男”,入职时间选择“2000年1月1号”到“2015年12月31号”。
- 分页要求:查询第一页数据,每页展示10条记录,并根据最后修改时间(
update_time
)进行倒序排序。
SQL语句编写与执行
- 构建查询条件
- 模糊匹配姓名:使用
LIKE
关键字,在姓名前或后添加通配符(这里使用%
),如name LIKE '%张%'
。 - 精确匹配性别:性别字段
gender
为“男”,对应值为1,所以条件为gender = 1
。 - 范围查询入职时间:使用
BETWEEN AND
,即entrydate BETWEEN '2000-01-01' AND '2015-12-31'
。 - 组合条件:多个条件之间使用
AND
连接,完整的WHERE
子句为WHERE name LIKE '%张%' AND gender = 1 AND hire_date BETWEEN '2000-01-01' AND '2015-12-31'
。
- 模糊匹配姓名:使用
- 添加分页与排序
- 分页查询:使用
LIMIT
关键字,第一页起始索引为0,每页展示10条记录,所以LIMIT 0, 10
。 - 排序操作:根据
update_time
倒序排序,使用ORDER BY update_time DESC
。将分页和排序添加到查询语句中,完整的SQL语句为:
- 分页查询:使用
代码及运行结果
SELECT *
FROM tb_emp
WHERE name LIKE '%张%'
AND gender = 1
AND entrydate BETWEEN '2000-01-01' AND '2015-12-31'
ORDER BY update_time DESC
LIMIT 0, 10;
- 执行结果:执行该语句,返回满足条件的10条记录,员工姓名包含“张”,性别为男,入职时间在指定范围内,且按更新时间倒序排列。若查询第二页,将起始索引改为10(根据公式“起始索引=(页码 - 1)×每页展示记录数”计算得出),即
LIMIT 10, 10
,再次执行可获取第二页数据。
案例二:员工信息统计(报表统计)
员工性别统计
需求分析
统计男性员工和女性员工的人数,以饼状图形式展示,需将查询结果中的性别代码(1和2)转换为对应的文字(男性员工、女性员工)。
SQL语句编写与执行
使用分组查询和聚合函数:
根据性别字段gender
进行分组,使用COUNT(*)
统计每组人数。查询语句为
SELECT gender, COUNT(*)
FROM tb_emp
GROUP BY gender;
执行结果返回性别代码及对应的人数(如1, 24
表示男性员工有24人,2, 5
表示女性员工有5人)。
使用IF
函数转换性别代码:
为将性别代码转换为文字,使用IF
函数。IF
函数语法为IF(条件表达式, 值1, 值2)
,根据gender
的值进行判断,如果gender = 1
,则返回“男性员工”,否则返回“女性员工”。修改后的查询语句为
SELECT IF(gender = 1, '男性员工', '女性员工') AS 性别, COUNT(*)
FROM tb_emp
GROUP BY gender;
执行后返回结果为“男性员工, 24”和“女性员工, 5”,并添加别名“性别”使结果更清晰。
员工职位统计
需求分析
统计班主任、讲师、教研主管、学工主管各职位的人数,对于未分配职位的情况进行单独统计,需将职位代码(1、2、3、4)转换为对应的职位名称。
SQL语句编写与执行
分组聚合查询:根据职位字段job
进行分组,使用COUNT(*)
统计每组人数。初始查询语句为
SELECT job, COUNT(*)
FROM tb_emp
GROUP BY job;
执行结果返回职位代码及对应人数(如1, 5
等)。
使用CASE
语句转换职位代码:由于职位代码需转换为名称,且分支较多,使用CASE
语句。CASE
语句语法为CASE WHEN 条件1 THEN 值1 WHEN 条件2 THEN 值2... ELSE 默认值 END
。
根据job
的值进行判断,当job = 1
时返回“班主任”,job = 2
时返回“讲师”,job = 3
时返回“学工主管”,job = 4
时返回“教研主管”,否则返回“未分配职位”。修改后的查询语句为:
SELECT CASE
WHEN job = 1 THEN '班主任'
WHEN job = 2 THEN '讲师'
WHEN job = 3 THEN '学工主管'
WHEN job = 4 THEN '教研主管'
ELSE '未分配职位'
END AS 职位,
COUNT(*)
FROM tb_emp
GROUP BY job;
执行后返回各职位名称及对应的人数,如“班主任, 5”等,为报表展示提供了准确数据。
总结与回顾
DQL 语句重点回顾
- DQL 语句主要包含基本查询、条件查询、分组查询、排序查询和分页查询五个部分。
- 基本查询指定查询表和返回字段,可设置字段别名,多个字段用逗号分隔。
- 条件查询通过
WHERE
添加条件,使用多种运算符构建条件,多个条件用AND
或OR
连接,注意空值判断用IS NULL
或IS NOT NULL
。 - 分组查询用
GROUP BY
指定分组字段,HAVING
进行分组后条件过滤,查询返回字段通常为分组字段和聚合函数,WHERE
在分组前过滤且不能使用聚合函数,HAVING
在分组后过滤且可使用聚合函数。 - 排序查询用
ORDER BY
指定排序字段和方式(升序ASC
或降序DESC
,默认升序),多字段排序时,第一个字段值相同才按第二个字段排序。 - 分页查询用
LIMIT
指定起始索引和每页记录数,起始索引从 0 开始,计算公式为 “起始索引 =(页码 - 1)× 每页展示记录数”。
流程控制函数应用
在案例中使用了IF
和CASE
两个流程控制函数。IF
函数根据条件返回不同值,用于简单的二选一判断;CASE
语句类似Java
中的switch
,可进行多条件分支判断,根据表达式的值返回不同结果,增强了查询结果的可读性和可用性。
实际应用要点
编写 DQL 语句时,需根据业务需求准确选择查询类型和构建条件。
如在员工管理系统中,根据用户输入的不同查询条件生成相应的条件查询语句,实现精准数据检索。在数据统计报表中,合理运用分组查询和聚合函数获取统计数据,并通过流程控制函数处理数据格式,使其符合报表展示要求。
END
学习自:黑马程序员——JavaWeb课程