--连表查询
--当要查询的数据来自与不同的表|数据源,就可以使用连表查询
--语法: 92 99
--92
--笛卡尔积 : 对乘
--select 数据 from 数据源1,数据源2...;
--注意:
--查询同名字段需要指明出处
--查询所有员工信息,这个员工所在的部门信息
--查询的数据: 员工信息,部门信息
--数据的来源: emp dept
select * from emp,dept;
--表连接条件
--等值连接
select e.*,d.* from emp e,dept d where e.deptno=d.deptno;
select e.empno,d.dname,e.deptno from emp e,dept d where e.deptno=d.deptno;
--查询10,30部门的员工 信息以及所在部门信息
select e.*,d.* from emp e,dept d where e.deptno=d.deptno and e.deptno in(10,30) order by sal;
--等值连接条件的字段一般为主外键关联关系或者同名字段,但是主要类型相同就可
select * from emp e,dept d where e.ename=d.dname;
--非等值连接
--查询员工的信息以及工资等级信息
select grade from salgrade where 1500 between losal and hisal;
select * from emp e,salgrade s where e.sal between s.losal and s.hisal;
--自连接
--一张包作为2个身份,自己与自己连接
--查询由上级存在的员工信息以及上级经理人信息
--数据: 员工信息,经理人信息
--来源: 员工表emp e1, 经理人表 emp e2
select * from emp e1,emp e2 where e1.mgr=e2.empno;
--内连接: 满足连接条件才保留,不满足连接条件不保留
--所有员工的员工信息以及上级经理人信息
--需求: 员工表中数据无论是否满足连接条件都要显示
--外连接 : 主表中的数据无论是否满足连接条件都显示
--左外连接: 左连接 表连接的位置,主表 在左边
--右外连接: 右连接 表连接的位置,主表 在右边
--员工表作为主表
--在连接条件的位置,主表的对面添加(+)
select * from emp e1,emp e2 where e1.mgr=e2.empno(+); --> 左连接
select * from emp e2,emp e1 where e1.mgr=e2.empno(+); --> 右连接
回顾
--select 数据(*|字段,字段|伪列) from 数据源(表|结果集|视图) where 行过滤条件 group by 分组字段 having 组过滤条件 order by 排序字段;
--92语法 select 数据(*|字段,字段|伪列) from 数据源1,数据源2.. where 行过滤条件 and 表连接条件 group by 分组字段 having 组过滤条件 order by 排序字段;
--多表连接
--查询30部门员工信息以及员工所在部门信息以及员工薪资登记信息
--连接之后过滤
select * from emp e,dept d,salgrade s where e.deptno=d.deptno and e.sal between s.losal and s.hisal and e.deptno = 30;
--99链表查询
--笛卡尔积 cross join
select * from emp e,dept d; --92
select deptno from emp e cross join dept d; --99
--查询30部门的员工信息
select * from emp where deptno = 30;
--查询30部门的部门信息
select * from dept where deptno = 30;
--连接之前过滤
select * from (select * from emp where deptno = 30) cross join (select * from dept where deptno = 30);
--连接条件
--等值连接
--自然连接 natural join 自动根据同名字段,主外键关联关系 字段做等值连接
select deptno from emp e natural join dept d;
--注意: 在自然连接中同名字段不能指明出处
--join using(自动做等值连接的同名字段)...
select deptno from emp e inner join dept d using(deptno);
--注意: 在join using中同名字段不能指明出处
--非等值连接
--数据源1 join 数据源2 on 表连接条件 可以做等值,可以做非等值
select e.deptno from emp e join dept d on e.deptno = d.deptno;
--查询员工信息以及员工工资等级信息
select * from emp e inner join salgrade s on e.sal between s.losal and s.hisal;
--查询员工信息以及所在部门信息以及员工工资等级信息,以及上级经理人信息
select *
from emp e
join dept d
on e.deptno = d.deptno
join salgrade s
on e.sal between s.losal and s.hisal
join emp e2
on e.mgr = e2.empno
where deptno in (10,30);
--内连接 : 满足连接条件才能显示 (inner) join
--外连接 : 有的表中的数据不满足连接条件也显示
--主表: 不满足连接条件也显示
--左连接 : left join
--右连接 : right join
--全连接 : full join 两张表都作为主表
select * from emp e1 full join emp e2 on e1.mgr=e2.empno;