1. 分组查询
当遇到“每”时一般需要考虑分组查询;
比如“公司每个部门有多少人;” “公司有多少男员工,有多少女员工” 这种都需要用到分组查询;
语法: select sum(salary),dept_id from person group by dept_id
首先创建一张表:
create table person( id int not null auto_increment primary key, name varchar(50) not null, age int not null, sex char(2) not null, salary int not null, dept_id int not null) select * from person insert into person values(1,"xuanxuan",22,"女",20000,1),(2,"xixi",23,"女",10000,1),(3,"dongdong",24,"男",17000,1),(4,"haha",25,"男",19000,2),(5,"hehe",25,"男",22000,2),(6,"menmeng",24,"女",16000,2),(7,"duoduo",25,"男",22000,3),(8,"haohao",24,"男",19000,3) select * from person
运行结果:
1. 查询每个部门薪资总额,并且显示部门信息:----需要用到分组查询:
select sum(salary),dept_id from person group by dept_id; # 按照det_id分组,查询每个部门薪资总额
运行结果:
2. 分组查询还可以加条件: 查询薪资总额大于45000的所有部门----需要用到分组查询(按照部门分组,计算每一部门的薪资总额)+条件(部门薪资总额大于45000的)
select sum(salary),dept_id from person group by dept_id having sum(salary)>45000; # 先按照部门分组,计算每一个部门的总薪资,然后加上条件 薪资总额大于45000的才显示,配合group by 使用的条件是having
(其实相当于where 只不过where优先级大于group by 所以不能放在group by后面,只能使用having与group by配合使用)
运行结果:
3. 如果想要查看每个部门的最大薪资是多少:
select max(salary),dept_id from person group by dept_id; # 查看每一个部门的最大薪资
运行结果:
4. 如果想查看每一个部门的平均薪资(avg(salary)),并且显示部门的人员信息:
如果是:(不正确解法:)
select avg(salary),name,dept_id from person group by dept_id; # 查看每一部门的平均薪资,但是这样直接name放在这里,并不会显示该组内所有人员信息,只会显示一个(类似扑克牌分组堆叠,只会显示最上面那个)
运行结果:
所以正确做法应该是:(在需要显示组内全部信息的字段加上group_concat(要组内全部显示的信息))
select avg(salary),group_concat(name),dept_id from person group by dept_id;
运行结果:
小作业:查询平均薪资大于20000的部门,并且看该部门员工都有谁:(用到分组查询+条件+显示组内某一字段全部信息)
select sum(salary),group_concat(name),dept_id from person where name is not null group by dept_id order by sum(salary) limit 0,5
运行结果:
2. 分页显示:需要用到limit 关键字,第一个参数是起始从哪一条开始,第二个参数是一页一共显示多少条
select * from person limit 0,4; # 查看表person,从第一条开始显示,总共显示条; select * from person limit 4,5; # 从第五条开始显示,一共显示5条(5-8)
运行结果:
3. SQL执行顺序
执行顺序是:
from person(看哪一张表) ---> where name is not null(条件)--->group by(按照什么分组)---having(分组查询条件)---select(查询)---order by (按照什么排序)--limit(显示)
首先先看是哪一张表from person,然后where看下条件,接着看分组group by 然后看分组的条件 having 然后select查询 接着对查询到的结果排序order 排序结束显示limit;
4. 作业(待完成)
http://www.cnblogs.com/wangfengming/articles/7944029.html
http://www.cnblogs.com/wangfengming/articles/7889786.html