第一题-(P132)

1.png
1.首先从给的输出答案可以看出,有三个字段,而用group by时,select后面只能跟分组函数和用于分组的 字段,很明显ename并不是分组函数,所以直接否定用group by。
2.内连接,且有一个连接的表是新创建出来的。并且注意重命名的使用。

第二题-(P133)

2.png
注意:每个人都是他们本门里面比部门平均工资要高的人。

第三题-(P134)

知识点:from 后面如果是一个select语句产生的新表,则此表一定要有个名字,用‘as xxxx’来进行命名。
3.png
截屏2022-06-04 22.18.41.png
join之后就是一张表,里面的字段都可以使用,不用像上面一样当作一张临时表。
本质上是join-on是在group by之前执行的。

第四题-(P135)

方法1: 排序+limit
截屏2022-02-20 上午2.08.41.png
方法2: max()
截屏2022-02-20 上午2.09.31.png
方法3:表的自连接(最牛逼的思维方法!)
截屏2022-02-20 上午2.17.32.png

第五题

方法1:建立临时表,用排序+limit
截屏2022-02-20 上午2.25.56.png
方法2:max函数

第六题

截屏2022-02-21 上午2.31.33.png

第七题

平均工资最低的一定是等级最低的。 ——可以找出最低等级

找出每个部门的平均工资的等级,然后与最低等级相等即可。

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));

第九题

截屏2022-02-21 上午2.40.58.png

第十题

知识点:limit X,Y中,X是从0开始的,表示第一个数据。
截屏2022-02-21 上午2.44.03.png

第十一题

知识点:date数据类型是可以直接排序的。
截屏2022-02-21 上午2.46.42.png

第十二题

截屏2022-06-05 00.36.40.png

第十四题

select e.ename as ‘员工名字’,ifnull(temp.ename,’没有上级’) as ‘上级名字’
from emp e left join emp temp
on e.mgr = temp.empno

第十五题截屏2022-06-05 01.10.53.png

这样写很麻烦。
直接一个多次连接即可。
> 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

第三十四题