---多表聯合查詢:
--當需要擷取的資料分布在多張中,考慮使用聯合查詢
--SQL92方式
--SQL99方式
----------------------------------------------------------------
--SQL99多表查詢
--注意1:依然可以給表添加别名
--注意2:如果使用on或者usering關鍵對結果進行篩選,必須使用inner join作用表與表的連接配接,其中inner可以省略
--注意3:外連接配接的 outer關鍵字可以省略不寫
--注意4:依然可以繼續使用分組,having ,排序等
--笛卡爾積:使用cross join 關鍵字
---select 内容 from 表名 cross join
select * from emp cross join dept
select * from emp ,dept
--篩選
--查詢員工姓名,工作,薪資,
--等值篩選的對比
select e.ename,e.job,e.sal,d.deptno from emp e inner join dept d on e.deptno = d.deptno
select e.ename,e.job ,e.sal,d.deptno from emp e,dept d where e.deptno=d.deptno
--自然連接配接:使用關鍵字 natural join
--使用:select 内容 from 表名 natural join 表名
--二者在自連接配接方面是有一些差別的
select * from emp e1,emp d2
select * from emp natural join dept
select * from emp dept部門名稱
--特點1:底層先笛卡爾積,然後按照所有的同名同值字段自動進行等值篩選。
--問題1:如果隻想按照部分字段結果篩選怎麼辦?
--問題2:如果想按照字段名不同,但是值相同進行等值篩選怎麼辦?
select * from emp natural join dept
--解決1:使用using關鍵字
--作用1:指明使用指定的字段對聯合查詢的結果進行等值篩選
--注意:指明的字段必須是兩表的同名同值字段
--使用:select 内容 from 表名 inner join 表名 using(字段名,字段名,....)
select * from emp inner join dept using(deptno)
select * from emp inner join dept using(deptno)
--解決2:使用on關鍵字進行自定義連接配接條件篩選(等值篩選,不等值篩選)
--注意:普通篩選條件使用where進行篩選,不要使用on進行。好處:SQL語句的閱讀性變強。
--使用:select 内容 from 表名 inner join 表名 on 連接配接條件 where 普通篩選條件
--等值連接配接的對比
select * from emp e inner join dept d on e.deptno = d.deptno
select * from emp inner join dept on emp.deptno=dept.deptno where sal>2000
select * from emp e ,dept d where e.deptno = d.deptno
select * from emp e,dept d where e.deptno=e.deptno and sal>'2000'
select * from emp e inner join dept d on e.deptno = d.deptno where sal>'2000'
--不等值連接配接的對比
select * from emp e,salgrade s where e.sal>s.losal and e.sal<s.hisal
select * from emp e inner join salgrade s on e.sal>s.losal and e.sal<s.hisal
--外連接配接:
--左外連接配接:select 内容 from 表名 left outer join 表名 on 連接配接條件
--查詢員工姓名,工作,薪資,部門名稱及沒有部門的員工資訊
select e.ename,e.job,e.sal,d.deptno from emp e,dept d where e.deptno = d.deptno
select e.ename,e.job,e.sal,e.deptno,d.deptno from emp e inner join dept d on e.deptno = d.deptno
--左外連結
select e.ename,e.job,e.sal,d.deptno from emp e,dept d where e.deptno = d.deptno(+)
select e.ename,e.job,e.sal,e.deptno,d.deptno from emp e left outer join dept d on e.deptno = d.deptno
select * from emp e left outer join dept d on e.deptno=d.deptno
--右外連接配接:select 内容 from 表名 right outer join 表名 on 連接配接條件
--查詢員工姓名,工作,薪資,部門名稱及沒有員工的部門資訊
select e.ename,e.job,e.sal,d.deptno,e.deptno from emp e right outer join dept d on e.deptno = d.deptno
select e.ename,e.job,e.sal,d.deptno,e.deptno from emp e,dept d where e.deptno(+) = d.deptno
select * from emp e right outer join dept d on e.deptno=d.deptno
--全外連接配接:select 内容 from 表名 full outer join 表名 on 連接配接條件
select * from emp e full outer join dept d on e.deptno=d.deptno
--外連接配接有差別
select e.ename,e.job,e.sal,e.deptno,d.deptno from emp e full outer join dept d on e.deptno = d.deptno
select e.ename,e.job,e.sal,e.deptno,d.deptno from emp e , dept d where e.deptno = d.deptno
--自連接配接:
--查詢員工及其上級上司姓名
--自連接配接
select e1.ename,e1.empno,e2.mgr from emp e1,emp e2 where e1.empno = e2.mgr
select e1.ename,e1.empno,e2.mgr from emp e1 inner join emp e2 on e1.empno = e2.mgr
select e1.*,e2.ename from emp e1 inner join emp e2 on e1.mgr=e2.empno