多表關聯查詢(ORACLE版)


前言:這幾天學習oracle,把自己對於關聯查詢的理解,記錄下。如有錯誤請指正!

交叉連接:

交歡連接又稱為“笛卡兒積連接”,是兩個或多個表之間的無條件連接。一個表中所有的記錄與其它表的所有的記錄進行連接。

如果進行連接的表中的數據行數分別為“n1,n2、n3”,那么交叉連接后結果集中有n1xn2xn3條記錄。

一、內連接

內連接是種常用的關聯查詢方式,使用inner join來實現,其中inner是可以省略的語法如下:

內連接的標准語法

select colums_list

from table_name1 [inner] join table_name2

on join_codition

參數說明:

  • colums_list :字段列表
  • table_name1和table_name2:是兩個要實現內聯接的表名
  • join_condition:實現內連接的條件表達式

內連接語法:Oracle擴展的連接方式

SELECT table1.column,talbe2.column[,…]

FROM table1,table2[,…]

WHERE condition;

例如:

SQL> select e.empno 員工號,e.ename 員工姓名,e.job 職務,d.dname
  2  from emp e inner join dept d
  3  on e.deptno = d.deptno;
------------------------------------------------或者-------------------------------------------------------------------------------
SQL> select e.empno 員工號,e.ename 員工姓名,e.job 職務,d.dname
  2    from emp e ,dept d where e.deptno = d.deptno;

  員工號 員工姓名             職務               DNAME                        
---------- -------------------- ------------------ ---------------------------- 
      7369 SMITH                CLERK              RESEARCH                     
      7499 ALLEN                SALESMAN           SALES                        
      7521 WARD                 SALESMAN           SALES                        
      7566 JONES                MANAGER            RESEARCH                     
      7654 MARTIN               SALESMAN           SALES                        
      7698 BLAKE                MANAGER            SALES                        
      7782 CLARK                MANAGER            ACCOUNTING                   
      7788 SCOTT                ANALYST            RESEARCH                     
      7839 KING                 PRESIDENT          ACCOUNTING                   
      7844 TURNER               SALESMAN           SALES                        
      7876 ADAMS                CLERK              RESEARCH                     

    員工號 員工姓名             職務               DNAME                        
---------- -------------------- ------------------ ---------------------------- 
      7900 JAMES                CLERK              SALES                        
      7902 FORD                 ANALYST            RESEARCH                     
      7934 MILLER               CLERK              ACCOUNTING                   

已選擇14行。

 

二、外連接

外連接分為:左外連接和右外連接、完全連接

  1. A、左外連接:關鍵字為left outer join 或者 left join

  2. 語法:

1、標准SQL語句的連接方式

SELECT table1.column, table2.column[,…]

FROM table1 LEFT JOIN table2[,]

ON table1.column <operator> table2.column[,…];

  1. 2、Oracle擴展的連接方式

    SELECT table1.column, table2.column[,…]

    FROM table1, table2[,…]

    WHERE table1.column <operator>

    table2.column(+)[…];

  2. 例如:

  3. SQL> select e.empno,e.ename,e.job,d
      2  .dname
      3   from emp e left join dept d
      4  on e.deptno = d.deptno;
    -----------------------------------------------------------或者----------------------------------------------------------------------------------
    SQL> select e.empno,e.ename,e.job,d.dname
      2  from emp e,dept d
      3  where e.deptno = d.deptno(+);
    
         EMPNO ENAME                JOB                DNAME                        
    ---------- -------------------- ------------------ ---------------------------- 
          7934 MILLER               CLERK              ACCOUNTING                   
          7839 KING                 PRESIDENT          ACCOUNTING                   
          7782 CLARK                MANAGER            ACCOUNTING                   
          7902 FORD                 ANALYST            RESEARCH                     
          7876 ADAMS                CLERK              RESEARCH                     
          7788 SCOTT                ANALYST            RESEARCH                     
          7566 JONES                MANAGER            RESEARCH                     
          7369 SMITH                CLERK              RESEARCH                     
          7900 JAMES                CLERK              SALES                        
          7844 TURNER               SALESMAN           SALES                        
          7698 BLAKE                MANAGER            SALES                        
    
         EMPNO ENAME                JOB                DNAME                        
    ---------- -------------------- ------------------ ---------------------------- 
          7654 MARTIN               SALESMAN           SALES                        
          7521 WARD                 SALESMAN           SALES                        
          7499 ALLEN                SALESMAN           SALES                        
          9527 LIKE                 PRINTER
  4. B、右外連接:關鍵字為right outer join 或者 right join

  5. 1、標准SQL語句的連接方式

    SELECT table1.column, table2.column[,…]

    FROM table1 RIGHT JOIN table2[,…]

    ON table1.column <operator> table2.column[…];

  6. 例如:

  7. 2、Oracle擴展的連接方式

    語法:

  8. SELECT table1.column, table2.column[,…]

    FROM table1, table2[,…]

    WHERE table1.column (+)<operator>

    table2.column[…];

  9. 例如:

  10. SQL> select e.empno,e.ename,e.job,d
      2  .dname
      3   from emp e left join dept d
      4  on e.deptno = d.deptno;
    -------------------------------------------------------------或者--------------------------------------------------------------------
    SQL> select e.empno,e.ename,e.job,d.dname
      2  from emp e,dept d
      3  where e.deptno (+)= d.deptno;
    
     EMPNO ENAME                JOB                DNAME                        
    ---------- -------------------- ------------------ ---------------------------- 
          7369 SMITH                CLERK              RESEARCH                     
          7499 ALLEN                SALESMAN           SALES                        
          7521 WARD                 SALESMAN           SALES                        
          7566 JONES                MANAGER            RESEARCH                     
          7654 MARTIN               SALESMAN           SALES                        
          7698 BLAKE                MANAGER            SALES                        
          7782 CLARK                MANAGER            ACCOUNTING                   
          7788 SCOTT                ANALYST            RESEARCH                     
          7839 KING                 PRESIDENT          ACCOUNTING                   
          7844 TURNER               SALESMAN           SALES                        
          7876 ADAMS                CLERK              RESEARCH                     
    
         EMPNO ENAME                JOB                DNAME                        
    ---------- -------------------- ------------------ ---------------------------- 
          7900 JAMES                CLERK              SALES                        
          7902 FORD                 ANALYST            RESEARCH                     
          7934 MILLER               CLERK              ACCOUNTING                   
                                                       OPERATIONS                   
    
    已選擇15行。
  11. C、完全連接:關鍵字為full outer join 或者 full join

  12. 在Oracle數據庫中,全外連接的表示方式為

    SELECT table1.column, table2.column[,…]

    FROM table1 FULL JOIN table2[,…]

    ON table1.column1 = table2.column2[…];

  13. 例如:

  14. SQL> select e.empno,e.ename,d.deptno,d.dname from emp e full join dept d on d.deptno = e.deptno;
    
         EMPNO ENAME                    DEPTNO DNAME                                
    ---------- -------------------- ---------- ----------------------------9528 LIKE                                                                 
          7369 SMITH                        20 RESEARCH                             
          7499 ALLEN                        30 SALES                                
          7521 WARD                         30 SALES                                
          7566 JONES                        20 RESEARCH                             
          7654 MARTIN                       30 SALES                                
          7698 BLAKE                        30 SALES                                
          7782 CLARK                        10 ACCOUNTING                           
          7788 SCOTT                        20 RESEARCH                             
          7839 KING                         10 ACCOUNTING                           
    
         EMPNO ENAME                    DEPTNO DNAME                                
    ---------- -------------------- ---------- ----------------------------         
          7844 TURNER                       30 SALES                                
          7876 ADAMS                        20 RESEARCH                             
          7900 JAMES                        30 SALES                                
          7902 FORD                         20 RESEARCH                             
          7934 MILLER                       10 ACCOUNTING                           
                                            40 OPERATIONS                           
    
    已選擇17行。
  15.  

    1. 注:左外連接其實就是:將左邊表中的數據全部顯示出不無論在其連接表中是否有對應的數據,如果沒有與之對應的連接表的值為NULL。
      1.     右外連接是:指在內連接的基礎上,將連接操作符右側表中不符合連接條件的記錄加入結果集中,與之對應的連接操作符左側表列用NULL填充。
      2.      完全連接是:全外連接:指在內連接的基礎上,將連接操作符兩側表中不符合連接條件的記錄全部加入結果集中。

對於(+)操作符:

  • 當使用(+)操作符執行外連接時,應當將該操作符放在顯示較少行(完全滿足連接條件行)一端。
  • (+)操作符只能出現在where子句中,並且不能與outer join語法同時使用。
  • 當使用(+)操作符執行外連接時,如果在where語句中包含多個條件,則必須在所有的條件中都包含(+)操作符。
  • (+)操作符只能適用於列,而不能適用於表達式。
  • (+)操作符不能與or和in操作符一起使用。
  • (+)操作符只能用於左外連接和右外連接,不能用於實現完全連接。
  • (+)所在位置的另一則為連接方向,而且如果后面有條件都要注意(+)位置

三、自連接

在應用開發中,用戶可能擁有“自引用式”的外鍵,“自引用式”外鍵是指表中的一個列可以是該表主鍵的一個外鍵。

例如:

SQL> select em2.ename 管理者,em1.ename 下屬員工
  2  from emp em1 left join emp em2
  3  on em1.mgr = em2.empno
  4  order by em1.mgr;

管理者               下屬員工                                                   
-------------------- --------------------                                       
JONES                FORD                                                       
JONES                SCOTT                                                      
BLAKE                JAMES                                                      
BLAKE                TURNER                                                     
BLAKE                MARTIN                                                     
BLAKE                WARD                                                       
BLAKE                ALLEN                                                      
CLARK                MILLER                                                     
SCOTT                ADAMS                                                      
KING                 CLARK                                                      
KING                 BLAKE                                                      

管理者               下屬員工                                                   
-------------------- --------------------                                       
KING                 JONES                                                      
FORD                 SMITH                                                      
                     KING                                                       
                     LIKE                                                       
                     EAST                                                       

已選擇16行。

四、交叉連接

交叉連接的執行結果是一個笛卡兒積,那么這種查詢結果是非常冗余的,但可以通過where子句來過濾。

QL> select count(*) from emp;

  COUNT(*)                                                                      
----------                                                                      
        16                                                                      

SQL> select count(*) from dept;

  COUNT(*)                                                                      
----------                                                                      
         4                                                                      

SQL> select count(*) from emp cross join dept;

  COUNT(*)                                                                      
----------                                                                      
        64


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM