面试经常遇到的问题
子查询就是select 语句中嵌套另一个select语句
(可以看做临时表)
#求哪些人的工资比平均工资高
select ename,sal from tmp where sal>(select avg(sal) from tmp);
**
错误的代码
**
select ename,deptno from tmp where sal in
(select max(sal) from tmp group by deptno );
这里结束写为什么用in而不是用=,=是单行查询,而子查询中的语句的功能是多行查询,使用=会报错
如果部门1中有2部门的最高工资,那么1部门这个人也会显示出来
正确的代码
select ename,sal from emp
join
(select max(sal) max_sal,deptno from emp group by deptno) t
on
(emp.sal=t.max_sal and emp.deptno=t.deptno)
表链接还可以用字链接的方式
看题
#运用一条select语句,查出一个人的名字和他所在部门的经理的名字
#想象成两张表
select e1.ename emp,e2.ename mgr from emp e1,emp e2 where e1.mgr=e2.empno
但是缺失了king的数据,因为他没有mgr,于是,可以优化sql
select e1.ename emp,e2.mgr from emp e1 left join emp e2
on e1.mgr=e2.ename
#左链接/左外链接的意思是把左边这个表的多余的数据取出来
#右链接/右外链接的意思是把左边这个表的多余的数据取出来