/*算出员工的平均工资*/ select e.*,avg(e.salary) salarysum from employee e group by e.departmentNo; /*根据部门编号分组,列出部门名称,部门编号,部门人数,部门内最大薪水,部门内最小薪水,部门内薪水差,部门内平均工资*/ select d.departmentName,e.departmentNo,count(e.employeeId) employeeNum,max(e.salary) maxsalary,min(e.salary) minsalary,max(e.salary)-min(e.salary) salarydiff,avg(e.salary) avgsalary from department d,employee e where e.departmentNo=d.departmentNo group by e.departmentNo; /*列出员工编号,员工姓名,员工薪水,公司平均工资,员工工资与平均工资差别,评语*/ select e.employeeNo,e.employeeName,e.salary,(select avg(salary) from employee) comavgsalary,e.salary-(select avg(salary) from employee) salarydiff, case when abs(e.salary-(select avg(salary) from employee)) >300 then 'big diff' when abs(e.salary-(select avg(salary) from employee)) >=100 then 'a little diff' when abs(e.salary-(select avg(salary) from employee)) <100 then 'almost ignore' end classify from employee e /*查询出员工的薪水,将其与部门的平均薪水、公司的平均薪水作比较并作出评语。*/ select e.salary, (select avg(salary) from employee where departmentNo = e.departmentNo) deptavg, (select avg(salary) from employee) comavg, e.salary-(select avg(salary) from employee where departmentNo = e.departmentNo) deptdiff, e.salary-(select avg(salary) from employee) companydiff, case when abs(e.salary-(select avg(salary) from employee where departmentNo = e.departmentNo)) >300 then 'big diff' when abs(e.salary-(select avg(salary) from employee where departmentNo = e.departmentNo)) >=100 then 'a little diff' when abs(e.salary-(select avg(salary) from employee where departmentNo = e.departmentNo)) <100 then 'almost ignore' end comparewithdept, case when abs(e.salary-(select avg(salary) from employee)) >300 then 'big diff' when abs(e.salary-(select avg(salary) from employee)) >=100 then 'a little diff' when abs(e.salary-(select avg(salary) from employee)) <100 then 'almost ignore' end comparewithcom from employee e /*员工编号,员工名称,部门编号,部门平均工资,部门最大工资,部门最小工资,部门内工资差*/ select e.employeeNo,e.employeeName,e.departmentNo,e.salary,(select avg(salary) from employee where departmentNo = e.departmentNo) deptavg,(select max(salary) from employee where departmentNo = e.departmentNo) maxsalary, (select min(salary) from employee where departmentNo = e.departmentNo) minsalary,(select max(salary)-min(salary) from employee where departmentNo = e.departmentNo) diffwithmaxandmin from employee e order by diffwithmaxandmin desc; /*假如有个好心的老板要消除两极分化,对大于平均工资的乘以0.95,小于平均工资的乘以1.05,等于的不调整。*/ SELECT e.employeeNo,e.employeeName,e.salary, case when e.salary>(select avg(salary) from employee) then e.salary*0.95 when e.salary=(select avg(salary) from employee) then e.salary when e.salary<(select avg(salary) from employee) then e.salary*1.05 end adjustsalary FROM employee e; /*查询部门编号最大部门的员工信息*/ select e.employeeNo,e.employeeName,e.departmentNo,e.salary FROM employee e where e.departmentNo in(select max(departmentNo) from department); /*剔除部门编号最大和最小的员工信息*/ SELECT e.employeeNo,e.employeeName,e.departmentNo,e.salary FROM employee e where e.departmentNo not in ((select max(departmentNo) from department),(select min(departmentNo) from department)); /*列出和平均工资相差超过300的员工信息*/ select e.employeeNo,e.employeeName,e.departmentNo,e.salary FROM employee e where abs(e.salary-(select avg(salary) from employee))>300 /*列出平均工资大于4500的分组*/ select e.employeeNo,e.employeeName,e.departmentNo,avg(e.salary) avgsalary FROM employee e group by e.departmentNo having avg(e.salary)>4500 /*按多字段分组*/ select e.employeeNo,e.employeeName,e.departmentNo,avg(e.salary) avgsalary FROM employee e group by e.departmentNo,e.employeeNo /*聚合统计,cube生成的结果显示了所选列中值的所有组合的聚合中,rollup生成的结果集显示了所选列中值的某个层次结构的聚合*/ select e.employeeNo,e.employeeName,e.departmentNo,avg(e.salary) avgsalary FROM employee e where e.salary>4500 group by e.departmentNo with rollup /*分组查询的排序,求出每个部门内的最大、最小工资及极差。按照极差的倒序排序*/ select e.departmentNo,max(e.salary) maxsalary,min(e.salary) minsalary,(max(e.salary)-min(e.salary)) diff FROM employee e group by e.departmentNo order by diff desc /*compute by MySQL不支持该语法*/ select e.employeeNo,e.employeeName,e.salary from employee e order by e.salary compute avg(e.salary),max(e.salary),min(e.salary) by e.salary /*区间查询,在between之前加一个not 可以反向选择*/ select * from employee where salary between (select min(salary) from employee where departmentNo = '1474') and (select MAX(salary) from employee where departmentNo='1915') /*多表嵌套子查询*/ select * from employee where salary > (select avg(salary) from employee where departmentNo in (select departmentNo from department where departmentNo like '%18%')) /*查询人数最多的部门名称,用了虚拟表查询。觉得太复杂了。可以简化一下就好了*/ select departmentName from department where departmentNo = (select departmentNo from (select departmentNo,count(*) employeeNum from employee group by departmentNo)temp where employeeNum = (select max(employeeNum) from (select departmentNo,count(*) employeeNum from employee group by departmentNo)temp)) /*判断是否存在薪水在4000-4200之间的员工。返回的结果不重要*/ select * from employee where exists (select * from employee where salary between 4000 and 4200) /*人话说一遍,列出薪水比部门编号为1296中任一员工高的信息。等价于列出比部门编号为1296最低工资高的员工信息,等价于 select * from employee where salary > (select min(salary) from employee where departmentNo ='1296');*/ select * from employee where salary > any(select salary from employee where departmentNo='1296'); /*改一下关键字any -> all 就等价于比部门编号为1296最高工资高的员工信息了。原意是比部门编号为1296所有员工工资都要高的员工信息。*/ select * from employee where salary > all(select salary from employee where departmentNo='1296') /*列出大于所有部门的平均工资的员工信息。省了去找最高部门平均工资的步骤。换成any好像就没什么意义了*/ select * from employee where salary > all(select avg(salary) from employee group by departmentNo) /*列出各个部门最高工资员工的信息*/ select e.* from employee e where e.salary in (select max(salary) from employee where departmentNo = e.departmentNo )