python学习笔记 day43 分组查询+ SQL执行顺序

  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

 

posted @ 2018-10-28 21:47  写的BUG代码少  阅读(272)  评论(0编辑  收藏  举报