一、查询语句执行顺序
查询语句执行顺序from->where->group by->having->select->order by
当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
--执行where子句查找符合条件的数据;
--使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
--在返回集字段要么包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。
--having 子句中的每一个元素也必须出现在select列表中。(如2题)有些数据库例外,如oracle.
--having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
--having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。
二、例题
1、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序。
create table emp(
id int primary key auto_increment,
name varchar(50),
salary bigint,
deptin int
);
insert into emp values(null,‘zs‘,1000,1),(null,‘ls‘,1100,1),(null,‘ww‘,1100,1),(null,‘zl‘,900,1),
(null,‘zs2‘,1000,2),(null,‘ls2‘,900,2),(null,‘ww2‘,1000,2),(null,‘zl2‘,900,2);
错误写法:salary不能放在having子句中!
select deptin, count(*) from emp group by deptin having salary>avg(salary) order by deptin;
正确写法:
select emp.deptin, count(*) from emp, (select deptin,avg(salary) avg from emp group by deptin) temp
where emp.deptin=temp.deptin and salary>avg
group by emp.deptin order by emp.deptin;