第一题-(P132)
1.首先从给的输出答案可以看出,有三个字段,而用group by时,select后面只能跟分组函数和用于分组的 字段,很明显ename并不是分组函数,所以直接否定用group by。
2.内连接,且有一个连接的表是新创建出来的。并且注意重命名的使用。
第二题-(P133)
注意:每个人都是他们本门里面比部门平均工资要高的人。
第三题-(P134)
知识点:from 后面如果是一个select语句产生的新表,则此表一定要有个名字,用‘as xxxx’来进行命名。
join之后就是一张表,里面的字段都可以使用,不用像上面一样当作一张临时表。
本质上是join-on是在group by之前执行的。
第四题-(P135)
方法1: 排序+limit
方法2: max()
方法3:表的自连接(最牛逼的思维方法!)
第五题
方法1:建立临时表,用排序+limit
方法2:max函数
第六题
第七题
平均工资最低的一定是等级最低的。 ——可以找出最低等级
找出每个部门的平均工资的等级,然后与最低等级相等即可。
select s.grade,temp.avgsal,temp.dname from salgrade s join (select avg(sal) avgsal ,dname,d.deptno from emp e join dept d on e.deptno = d.deptno group by d.deptno) temp on temp.avgsal between s.losal and s.hisal;
第八题
比普通员工的最高薪水还要高的一定是领导!!!
select sal,ename,empno from emp where sal > ( select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null));
第九题
第十题
知识点:limit X,Y中,X是从0开始的,表示第一个数据。
第十一题
第十二题
第十四题
select e.ename as ‘员工名字’,ifnull(temp.ename,’没有上级’) as ‘上级名字’
from emp e left join emp temp
on e.mgr = temp.empno
第十五题
这样写很麻烦。
直接一个多次连接即可。
> select a.ename ,a.hiredate ,b.ename,b.hiredate ,d.dname
-> from emp a
-> left join emp b
-> on a.mgr = b.empno
-> join dept d
-> on a.deptno = d.deptno
-> where a.hiredate < b.hiredate;
第十六题
select d.dname ,e.* from dept d left join emp e on e.deptno = d.deptno;
第十七题
select count() ,d.dname
from dept d
left join emp e
on e.deptno = d.deptno
group by d.dname
having count() >= 5;
第十八题
select * from emp where sal > (select sal from emp where ename = ‘smith’);
第十九题
select e.ename,d.dname,temp.amount
from emp e join dept d
on e.deptno = d.deptno
join (select count(*) amount,deptno from emp group by deptno) temp
on temp.deptno = e.deptno
where e.job =’clerk’;
第二十题
select min(sal) ,job,count(*) from emp group by job having min(sal) > 1500 ;
第二十二题
select e.ename,d.dname,a.ename,s.grade
from emp e left join emp a
on e.mgr = a.empno
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
where e.sal >(select avg(sal) avgsal from emp);
第二十三题
select e.ename,d.dname from emp e join dept d
on e.deptno = d.deptno
where e.job = ( select job from emp where ename = ‘scott’) and e.ename <> ‘scott’;
第二十四题
select ename,sal from emp
where sal in ( select distinct sal from emp where deptno = ‘30’) and deptno <> ‘30’;
第二十五题
select e.ename,e.sal,d.dname
from emp e join dept d
on e.deptno = d.deptno
where e.sal > (select max(sal) from emp where deptno = ‘30’);
第二十六题
平均服务期限:就是服务期限的平均值。
计算日期的年差函数:TimeStampDiff(间隔类型,前一个日期,后一个日期);
间隔类型:second minute,hour,day,week,month,quarter,year
第二十七题
select e.ename,d.dname,e.sal from emp e join dept d on d.deptno = e.deptno
第二十八题
注意:可以按照多个字段进行分组,这些分组字段都可以写在select中。
select d.deptno,d.loc,d.dname,count(*)
from emp e right join dept d
on e.deptno = d.deptno
group by d.deptno,d.dname,d.loc;
第二十九题
select * from emp e
join (select job,min(sal) minsal from emp group by job) temp
on e.job =temp.job and e.sal =temp.minsal;
第三十题
select min(sal),deptno
from emp e join (select distinct mgr from emp where mgr is not null) temp
on e.empno = temp.mgr
group by e.deptno;
第三十一题
select ename,sal*12 from emp order by sal ;
第三十二题
第三十三题
select sum(sal),count(*),d.dname from emp e right join dept d on e.deptno = d.deptno where d.dname like ‘%S%’ group by d.dname