java笔试数据库

现有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个结果集排序。





你可能感兴趣的:(数据库,数据库)