学习SQL server的视频来源于B站的郝斌老师,视频完全免费
题目:把工资大于所有员工中工资最低的前三个人的姓名,工资,部门编号,部门名称,工资等级输出
这道题,有好多不同的理解,我这里只是其一【我理解的是从所有员工中刨去工资最低的那三个人】
正确做法:
-- 正确做法:
select E.ename "员工姓名",E.sal "员工工资",D.deptno "部门编号",D.dname "部门名称", S.grade "工资等级"
from emp E
join dept D
on E.deptno = D.deptno
join salgrade S
on E.sal between S.losal and S.hisal
where E.sal > (select max(temp.three_sal)
from (select top 3 sal "three_sal" from emp order by sal) temp)
order by "员工工资"
开始我是纯手写的,因为没有一定的实验环境,上面的结果是后来放在电脑上测试过的【SQL server 2012】
需要说明的一点是:在上面的代码里,不难看到,最后的where处,有两个select嵌套了,嵌套后的select形成的临时表一定一定要加别名,不加会报错,而且就报语法错误,服了,找了半个小时才找到原因。。我后来才加的别名 “temp”
其实这道题本身不难,但是我是刚学,自己的做法显得很乱且没有头绪,后来结合老师在最后where那里的点睛,写好了正确答案。
这是我最初写的代码,错误很多,所以也放到这里,作为自己学SQL的一个记录吧
下面的是我最初学习时用到的,仅用于我个人自己学习记录,已经测试过了下面是报错的
个人想法:
select temp2.ename "员工姓名",temp2.sal "员工工资",temp2.deptno "部门编号",D.dname "部门名称", S.grade "工资等级"
from(
select max(temp.sal) "max_sal"
from(
select temp.ename "三个员工姓名",temp.sal "three_sal",temp.deptno "三个人的部门编号",D.dname "部门名称", S.grade "工资等级"
from(
select top 3 ename , sal, deptno
from emp
order by sal
) temp
join dept D
on temp.deptno = D.deptno
join salgrade S
on temp.sal between S.losal and S.hisal
) temp1
)temp2
join dept D1
on temp.deptno = D.deptno
join salgrade S1
on temp.sal between S.losal and S.hisal
where emp.sal > temp2.max_sal