现有employee 表,表中有 员工编号(id) 员工名字 (name) 员工工资(salary) 员工部门(deptid), 按要求用一条SQL语句完成
create table employee (id int primary key auto_increment,name varchar(50),salary bigint,deptid int);
插入实验数据:
mysql> insert into employee values(null,'zs',1000,1),(null,'ls',1100,1),(null
,'ww',1100,1),(null,'zl',900,1) ,(null,'zl',1000,2), (null,'zl',900,2) ,(null,'z
l',1000,2) , (null,'zl',1100,2);
建议不要在别名点出列名时加单引号,有的地方会报错,不信的可以将下面的sql都加上单引号试试。1、查出每个部门高于部门平均工资的员工名单
SELECT avsalary,name FROM employee el , (SELECT deptid tid, AVG(salary) avsalary FROM employee GROUP BY deptid) e WHERE el.deptid=e.tid AND el.salary > e.avsalary ;
SELECT name FROM employee el RIGHT JOIN (SELECT deptid tid, AVG(salary) avsalary FROM employee GROUP BY deptid) e ON el.deptid=e.tid AND el.salary > e.avsalary ;
2、列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序
SELECT COUNT(*),deptid FROM employee el , (SELECT deptid tid, AVG(salary) avsalary FROM employee GROUP BY deptid) e WHERE el.deptid=e.tid AND el.salary > e.avsalary GROUP BY deptid ORDER BY deptid ;
SELECT COUNT(*),deptid FROM employee921 el RIGHT JOIN (SELECT deptid tid, AVG(salary) avsalary FROM employee921 GROUP BY deptid) e ON el.deptid=e.tid AND el.salary > e.avsalary GROUP BY deptid ORDER BY deptid;
3.求每个部门工资不小于1000的人员的平均值;
select avg(salary) from employee where salary>=1000 ;
4查询平均工资高于1000的部门
SELECT AVG(el.salary) avsalary,el.`deptid` FROM employee el GROUP BY el.deptid HAVING AVG(el.salary)>1000
having只能用在group by之后,对分组后的结果进行筛选(即使用having的前提条件是分组)。
2.where肯定在group by 之前,即也在having之前。
3.where后的条件表达式里不允许使用聚合函数(count(),sum(),avg(),max(),min()),而having可以。
四、当一个查询语句同时出现了where,group by,having,order by的时候,执行顺序和编写顺序是:
1.执行where xx对全表数据做筛选,返回第1个结果集。
2.针对第1个结果集使用group by分组,返回第2个结果集。
3.针对第2个结果集中的每1组数据执行select xx,有几组就执行几次,返回第3个结果集。
4.针对第3个结集执行having xx进行筛选,返回第4个结果集。
5.针对第4个结果集排序。