Oracle多表关联查询

select e.empno, e.ename, d.deptno, d.dname
  from emp e, dept d
 where e.deptno = d.deptno;

在上述sql语句中先执行 from 后执行select和where  如果使用了别名的话以后引用表都要使用别名不然会报错  别名最长为30个字符 

内连接

select e.empno, e.ename, d.deptno, d.dname
  from emp e
  join dept d
    on e.deptno = d.deptno
from 后直接接两张表名 系统会将两张表做笛卡尔乘积操作  会生成一张笛卡尔积中间表 (这张表相当于两个集合做乘操作 参考两个集合相乘) 如果两张表都很大的话中间表就会很大 会占用很大的内存空间

如果使用join操作 会优先判断 是否符合 join 后所接on的条件  使生成结果不会太大

外连接  分为left outer join          right outer join      full outer join

内链接只能查询到符合条件的结果  左外连接可以使某一张表或两张表的数据完全显示出来

left join 和right join还可以用(+)来代替

(+)应放在缺少相应信息的一边

左连接的主表是join左边的表 为主表  内容会全部显示

select e.empno, e.ename, d.deptno, d.dname from emp e left join dept d on e.deptno = d.deptno ; 

左外链接的加号写法

select e.empno, e.ename, d.deptno, d.dname from emp e, dept d where e.deptno = d.deptno(+);


 

上图为执行之后的结果  由表格可知  第十五条数据 的e.deptno 为空不符合 连接条件  但还是显示出来了

右连接

右连接的主表是join右边的表 为主表  内容会全部显示

select e.empno, e.ename, d.deptno, d.dname from emp e right join dept d on e.deptno = d.deptno ;

右外链接的加号写法

select e.empno, e.ename, d.deptno, d.dname from emp e, dept d where e.deptno(+) = d.deptno 

dept表中deptno = 40 的 在emp表中没有与之对应的数据 但在右连接中可以完全显示dept表中的数据

完全外连接

相当于做左连和右连后去重值

select e.empno, e.ename, d.deptno, d.dname from emp e full join dept d on e.deptno = d.deptno ; 

自然连接

会对表总具有相同列明的做自动连接

select *  from emp e natural join dept   ;

限定多 不实用  仅做了解

自连接

自己和自己做连接 以scott 的emp表为例  mgr字段为该员工的 领导编号 该表中存在主从关系 

又因要查询所有员工的领导及其编号所以在下面用左连接

select em2.empno 领导的员工编号,
       em2.ename 领导姓名,
       em1.empno 员工导编号,
       em1.ename 员工姓名,
       em1.mgr   对应领导的员工编号
  from emp em1
  left join emp em2
    on em1.mgr = em2.empno
 order by em2.empno ;

交叉连接  

做两张表的笛卡尔积

select * from emp cross join dept

基本用不到  作为了解
 

总结一下

内连接 

只筛选符合条件的

外链接

分为左外右外和完全外链接

左外显示符合条件的 以及左表不符合条件的  右表只有符合条件的

剩下两种略

自连接

自己和自己做连接  因为用的都是一张表(本身)所以一定要用别名


 

猜你喜欢

转载自blog.csdn.net/xutao_ccu/article/details/84986009