天天看點

兩表聯合查詢【SQL92與SQL99的對比】

---多表聯合查詢:
  --當需要擷取的資料分布在多張中,考慮使用聯合查詢
    --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