内联查询
--多表联合查询:在查询中如果所需的数据来自多张表,那么就需要多表联合查询
--多表联合的联合方式分为:
/*(1):内联(inner join ) :在结果集中仅仅显示那些符合连接条件的数据
select ... from 表1 [inner] join 表2 on 表1和表2进行连接的依据
where
group by
order by
*/
--查询员工的编号,姓名,工资,所在部门名
select empno,ename,sal ,dname
from emp inner join dept on emp.deptno = dept.deptno
--因为emp表中JONES在DEPT中没有对应记录(即不满足连接条件所以不会被放入结果集)
--查询员工的编号,姓名,工资,和工资等级
select empno,ename,sal,grade
from emp inner join salgrade on sal between losal and hisal
--查询从事 CLERK工作的员工的编号,姓名,工资,和工资等级
select empno,ename,sal,grade
from emp inner join salgrade on sal between losal and hisal
where job='CLERK'
--查询员工的编号,姓名,工资,工资等级和部门名称
select empno,ename,sal,grade,dname
from emp join salgrade on sal between losal and hisal
join dept on emp.deptno = dept.deptno
--子查询 :提供一个数值(一行一列) 提供一个集合(一列)
--子查询,可以将查询结果看成一张临时表(如果将查询结果看成一张表那么select后的计算列必须起别名)
--查询部门信息以及该部门下的员工人数
select dept.*,rs from dept join
(select deptno,count(*) as rs from emp group by deptno) t
on dept.deptno = t.deptno
--查询部门人数大于4人的部门信息以及部门人数
--思路1:先联合,再过滤
select dept.*,rs from dept
join (select deptno,count(*) as rs from emp group by deptno) t
on dept.deptno = t.deptno
where rs >4
--思路2:先过滤,再联合
select dept.*,rs from dept
join (select deptno,count(*) as rs from emp group by deptno having count(*)>4) t
on dept.deptno = t.deptno
/*子查询的作用
在SQL中可以由另一个查询提供
1、一个值(一行一列)
2、一个集合(一列)
3、一张临时表(计算列起别名)
*/
外联查询
/*(2):外联( left|right outer join ):
在将符合连接条件的数据放入结果集的基础上,
还要将(join 的左侧或右侧)的表中不满足连接条件的信息
也要放入结果,对则表中的数据用null补齐
(即外联就是确保将某一侧表中记录都放入结果集,原则是能符合连接条件就连接,不符合连接条件
就将本侧表的数据放入结果集对侧表的数据用null补齐)
*/
--显示所有员工的员工编号,员工姓名,工资,和所在部门名称(如果该员工没有分配部门则显示临时部门)
select empno,ename,sal, dname from emp left outer join dept on emp.deptno = dept.deptno
select empno,ename,sal, dname from dept right outer join emp on emp.deptno = dept.deptno
--查询所有部门信息以及部门员工人数,如果该部门没有员工则人数显示0
select dept.*,nvl(rs,0) as 人数 from dept left outer join
(select deptno,count(*) as rs from emp group by deptno) t
on dept.deptno = t.deptno
select * from dept
内联和外联的区别
内联查询仅将符合条件的数据放入结果集,外联查询是将符合条件的结果放入结果集,不符合的结果也放入结果集用null补齐,如果是left outer join 则将左表数据全放入结果集,right outer join则将右表数据全放入结果集