DQL的基本语法分为五个部分已经学习完毕了,接下来运用所掌握的DQL语句的语法来完成两个案例。
1. 案例一
案例:根据需求完成员工管理的条件分页查询
分析:根据输入的条件,查询第1页数据
-
在员工管理的列表上方有一些查询条件:员工姓名、员工性别,员工入职时间(开始时间~结束时间),这一看就是个范围查询
-
姓名:张
-
性别:男
-
入职时间:2000-01-01 ~ 2015-12-31
-
-
除了查询条件外,在列表的下面还有一个分页条,这就涉及到了分页查询
-
查询第1页数据(每页显示10条数据)
-
-
基于查询的结果,按照修改时间进行降序排序
结论:条件查询 + 分页查询 + 排序查询
SQL语句代码:
-- 案例1:按需求完成员工管理的条件分页查询 -- 根据输入条件,查询第一页数据,每页展示10条记录
-- 输入条件:
-- 姓名:张
-- 性别:男
-- 入职时间:2000-01-01 2015-12-31
-- 模糊匹配的含义指的是只要包含张就可以了,倒序排序就是降序(DESC)
-- 按住Ctrl + Alt + L:对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 10;
总结:在完成该案例的时候,一定要去参照页面原型和需求文档来编写对应的SQL语句,因为在 页面原型以及需求文档当中,就会清晰的描述对应的查询规则是什么样子的,我们只需要 根据需求来完成SQL语句的编写就可以。
1.9.2 案例二
案例:根据需求完成员工信息的统计
案例二:根据需求完成员工信息的统计,主要包括两项:第一项是员工性别的统计,第二项是员工职位的统计。这类的需求我们也叫图形报表,就是来做数据统计,然后将统计好的数据以可视化的形式展示出来。
左边的是饼状图,在这幅图当中就展示出来了当前企业男性员工多少人,女性员工多少人,要以这种饼状图的形式直观的展示出来。其实这个需求也非常简单,我们只需要统计男性员工和女性员工多少人就可以了,我们把数据查询出来之后,返回给前端程序,前端程序再借助一些现成的组件报表库就可以完成报表的渲染展示了。图形报表组件就比较多了,我们就以百度开源的ECharts为例来做一个简单的分析,ECharts是百度开源的一款可视化的组件库,现在已经是Apache的孵化项目,所以我们可以看到域名现在是apache.org,在JS代码当中data属性指代的就是这个图形报表所展示的数据来源。做报表最重要最核心的就是数据。
思考:那这一块儿的数据从哪儿来呢?
回答:这里的数据是从数据库当中查询出来的。
分析:以上信息统计在开发中也叫图形报表(将统计好的数据以可视化的形式展示出来)
员工性别统计:以饼状图的形式展示出企业男性员人数和女性员工人数
只要查询出男性员工和女性员工各自有多少人就可以了
员工职位统计:以柱状图的形式展示各职位的在岗人数
只要查询出各个职位有多少人就可以了
分组查询 + 聚合函数
-- 案例2-1:根据需求,完成员工性别信息的统计 -- count(*)
select gender,count(*) from tb_emp group by gender;
-- 前端组件最终所需要的是男性员工多少人,女性员工多少人,我们还需要在SQL语句当中将1转化为男性员工,2转化为女性员工
-- 提问:此时怎么将1转化为男性员工,2转化为女性员工呢?
-- 回答:我们可以借助于MySQL当中提供的一个流程控制函数叫if(),在if()这个流程控制函数当中我们可以传递三个参数
-- 第一个需要传递一个条件表达式,第二个参数指代的是条件表达式为true的取值,第三个代表的是条件表达式为false的取值
-- 也就是说,它会根据条件表达式进行一个判断,如果条件表达式为true取第二个值,如果条件表达式为false取第三个值
-- if(条件表达式,true取值,false取值),使用if条件判断进行转换
-- if(表达式, tvalue, fvalue) :当表达式为true时,取值tvalue;当表达式为false时,取值fvalue
-- 那此时我们就可以基于if()这个流程控制函数把这块儿的SQL语句进行一个改造
select if(gender = 1,'男性员工', '女性员工') as 性别,count(*) as 人数 from tb_emp group by gender;
-- 案例2-2:根据需求,完成员工职位信息的统计
select job,count(*) from tb_emp group by job;
-- job,说明: 1 班主任 ,2 讲师, 3 学工主管, 4 教研主管
-- 提问:这里怎么进行职位的转换呢?
-- 回答:这里我们可以借助于MySQL当中提供的另外一个流程控制函数叫case来解决
-- case的语法:在case之后跟上一个表达式,后面跟上一个关键字when,如果这个表达式的值为1,后面再加上一个关键字then取结果1...
-- 后面还可以继续加when...then...,后面再加上一个else,就代表如果前面的这些表达式都没有匹配上的那我就取最后的这个默认值
-- 最后语法结束来一个end
-- case 表达式 when 值1 then 结果1 when 值2 then 结果2 ... else result end
-- 该语法与Java当中的switch语句有些类似
-- case 表达式 when 值1 then 结果1 [when 值2 then 结果2 ...] [else result] end
-- 接下来就基于case这个流程控制函数对这里的SQL语句进行一个改造
-- 直接在job前面加上一个case,这个job字段就是这个表达式
select
(case job when 1 then '班主任' when 2 then '讲师' when 3 then '学工主管' when 4 then '教研主管' else '无业游民' end) 职位
, count(*) as 人数
from tb_emp
group by job;
DQL语句小结:
第一个部分,基本查询,在基本查询当中我们主要来指定从哪一张表当来查询返回哪些字段,多个字段之间使用逗号分隔,如果我们想给这个字段起别名,只需要在字段之后跟上关键字as,as之后跟上别名就可以。
第二个部分条件查询,在where关键字之后跟上条件列表,在构建条件时最重要就是使用各种各样的运算符,比如像范围查询的between....and....,like模糊匹配,判断null值 is null等等。如果要组装多个条件,还要使用and或者or连接。
第三个部分分组查询group by,两点注意事项:1.在分组之后查询返回的字段一般为分组字段和聚合函数。2.关于where和having的区别:where是在分组之前执行,而having是在分组之后执行,而且where之后不能使用聚合函数,而having可以。
第四个部分排序查询order by,在order by之后来指定排序的字段和排序的方式。如果是多字段排序,中间使用逗号分隔,后面再指定第二个字段。只有当第一个字段值相同时,才会根据第二个字段来排序。
最后一个部分就是分页查询,对应的关键字是limit,limit之后跟上两个参数,一个参数是起始索引,另外一个参数是每页展示记录数。起始索引默认是从0开始的。
起始索引 = (页码 - 1) * 每页展示的记录数
DQL语句是整个SQL语句当中使用最为频繁最为重要的SQL语句!!!