数据库在这里:https://blog.csdn.net/NJYR21/article/details/79358938
!!!最近复习sql发现以下我自己写的代码里有逻辑错误或者写得不够简单清晰,我已经在自己的笔记上修改,但是这个人很懒!这个格式也很难调!所以请不要盲目相信下面的代码!等很闲很闲的时候我会来改掉!
常见用法记录:
- 每次写完语句,记的按;再运行。
- where的用法:
2.1 用于连接一对一或者多对一的关系。如果出现一对多的关系,使用多表join的功能。
2.2 where 条件1 and 条件2:表示同时满足条件1和条件2时的情况。
2.3 出现group by的时候,不能用where表示条件限定,应用having。
2.4 select e.deptno, d.dname from emp e where sal=1000
join dept d
on d.deptno=e.deptno;
这是错误的。从逻辑上,是想通过先筛选出sal=1000的deptno,然后join dept表,找到deptno对应的dname。但是,sql会看成emp表join里dept表,而不是select e.deptno, d.dname from emp e where sal=1000这个表。
解决方法是将where sal=1000弄成一个新表:select deptno from emp where sal = 1000,然后用emp来join这个新表,得到deptno,再join dept表,得到dname。
2.5 不可以用and代替where进行限定:select deptno from emp and sal = 3000是错误的,应改成select deptno from emp where sal = 3000。
题目详解:
- 每个部门取得最高薪水的职员姓名
select * from emp where sal in
(select max(Sal) from emp group by deptno);
select * from emp e join
(select deptno, max(sal) msal from emp group by deptno) b
on e.sal = b.msal
where e.deptno = b.deptno;
错误解法:
select ename from emp
where sal = (select deptno, max(sal) from emp group by deptno)
select * from emp e join
(select max(sal) msal from emp group by deptno) b
on e.sal = b.msal
where e.deptno = b.deptno;
select * from emp e join
(select max(sal) msal from emp group by deptno) b
on e.sal = b.msal
- 哪些人薪水在部门平均薪水之上
select * from emp
where sal > any (select avg(sal) from emp group by deptno);
select * from