分组
group by 根据谁分组,可以求这个组的最大值,最小值,平均值,求和,但是这个求出来的值只是和分组字段对应
并不和其他任何字段对应,这个时候查出来的所有其它字段都不生效
select post,group_concat(emp_name) from employee group by post;
select podt,group_concat(emp_name) from employee group by post;
聚合函数
count 求个数
select sex,count(id) from employee group by sex;
max 求最大值
select post,max(salary) from employee group by post;
min 求最小值
select post,min(salary) from employee group by post;
sum 求和
avg 求平均
select sex,avg(salary) from employee group by sex;
select sex,count(age) from employee group by sex;
having 过滤语句
在having条件中可以使用聚合函数,where中不行。
select post,avg(salary) from employee group by post having avg(salary)>10000; 平均薪资大于10000的部门
适合去筛选符合条件的莫一组数据,而不是某一行数据。
先分组在过滤:求平均薪资大于xx的部门,求人数大于xx的性别,求大于xx人的年龄段。
select age,count(id) from employee group by age having count(id)>5;
select sex,count(id) from employee group by sex having count(id)>5;
select post,group_concat(emp_name),count(id) from employee group by post having count(id)<2;
根据薪资多少进行排序 order by 默认是升序(asc) desc降序
select * from employee order by salary; 从小到大
select * from employee order by salary desc; 从大到小
select * from employee order by age,salary; 根据年龄从小到大排。
select * from employee order by age,salary; 当年龄相同时,依照薪资从小到大排。
取出薪资排名最高的人 limit 1
select emp_name,salary from employee order by salary desc limit 1;
limit m,n limit m,offset n 两个一样
从m+1项开始,取n项
如果不写m,m默认为0
select emp_name,salary from employee order by salary desc limit 1,3; 取第2,3,4名的薪资
查询条件的流程顺序:
1.执行from 表
2.执行where条件 根据筛选符合条件的行 select emp_name as name from employee where name= 'egon'; 执行失败 应为select 是在第五步才执行
3.group by 分组
4.having 过滤条件 根据分组之后的内容进行组的过滤
5.select 字段
6.order by 排序 select emp_name as name,age as a from employee order by a;可以执行
7.limit m,n 取从m+1开始的钱n条
、
where条件中不能使用select字段的重命名
order by后者having可以使用select字段的重命名
主要是order by在select语句之后才执行
having经过了mysql的特殊处理,使得它能够感知到select于语句中的重命名
扩展
select now( )
在执行select语句的时候,实际上是通过where,group by,having这几个语句锁定对应的行,然后循环每一行执行select语句