例項解析外連線 內連線 自連線 全連線

賀子_DBA時代發表於2014-08-01

1. 首先看兩個測試表的結構

1HR@ENMOEDU> desc employees    #1

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 EMPLOYEE_ID                               NOT NULL NUMBER(6)

 FIRST_NAME                                         VARCHAR2(20)

 LAST_NAME                                 NOT NULL VARCHAR2(25)

 EMAIL                                     NOT NULL VARCHAR2(25)

 PHONE_NUMBER                                       VARCHAR2(20)

 HIRE_DATE                                 NOT NULL DATE

 JOB_ID                                    NOT NULL VARCHAR2(10)

 SALARY                                             NUMBER(8,2)

 COMMISSION_PCT                                     NUMBER(2,2)

 MANAGER_ID                                         NUMBER(6)

 DEPARTMENT_ID                                      NUMBER(4)

2HR@ENMOEDU>  desc departments   #2

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 DEPARTMENT_ID                             NOT NULL NUMBER(4)

 DEPARTMENT_NAME                           NOT NULL VARCHAR2(30)

 MANAGER_ID                                         NUMBER(6)

 LOCATION_ID                                        NUMBER(4)

1利用上面兩個表做連線  連線條件是 DEPARTMENT_ID 可以這樣理解連線  你想在一個結果中同時顯示EMPLOYEE_IDLAST_NAMEDEPARTMENT_NAME 你會發現 上面兩個表都不同時存在上述三個欄位,這時你只有做連線了   

1)內連線:如圖所示

如果你想得到這樣的結果:顯示員工姓名,員工編號,部門名字  表1DEPARTMENT_ID等於表2DEPARTMENT_ID等於,則輸出DEPARTMENT_ID=n對應的EMPLOYEE_IDLAST_NAMEDEPARTMENT_NAME。否則不返回結果。這時候你就用內連線, 格式為:表1 join 2   on  1.DEPARTMENT_ID=2.DEPARTMENT_ID

所以應該這樣來完成任務:HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a join departments b on a.department_id=b.department_id;

 

EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME

----------- ------------------------- ------------------------------

        200 Whalen                    Administration

        201 Hartstein                 Marketing

        202 Fay                       Marketing

        114 Raphaely                  Purchasing

        119 Colmenares                Purchasing

        115 Khoo                      Purchasing

        116 Baida                     Purchasing

        117 Tobias                    Purchasing

2)外連線:如圖

                                                      

如果你想要得到 所有的 表1中的 員工姓名,員工編號  連線條件還是department_id ,就算是條件不符合  也要把表1中的想顯示的資料也顯示出來  這樣你就應該用外連線,若表2中沒有符合條件的則補空   你就應該用外連線,(一個都不能少)

左外連線:A left join B   右外連線:A right join B    可以這樣 記憶   左外連線中寫在左邊的表是那個內容多的(也就是A表一個都不能少的) 右外連線中寫在右邊的表內容多(也就是B表一個都不能少)   這樣你就會發現  A left join B  結果就等於   B  right join  A

看例子:左連線 表a內容多  有補空

HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a left join departments b on a.department_id=b.department_id;  

 EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME

----------- ------------------------- ------------------------------

        112 Urman                     Finance

        111 Sciarra                   Finance

        110 Chen                      Finance

        109 Faviet                    Finance

        108 Greenberg                 Finance

        206 Gietz                     Accounting

        205 Higgins                   Accounting

        178 Grant

右連線:HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a right join departments b on a.department_id=b.department_id;

EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME

----------- ------------------------- ------------------------------

        108 Greenberg                 Finance

        111 Sciarra                   Finance

        112 Urman                     Finance

        113 Popp                      Finance

        109 Faviet                    Finance

        206 Gietz                     Accounting

        205 Higgins                   Accounting

                                      Treasury

                                      Corporate Tax

                                      Control And Credit

                                      Shareholder Services

全外連線:就是倆表都一個也不能少

HR@ENMOEDU> select a.employee_id,a.last_name,b.department_name from employees a full join departments b on a.department_id=b.department_id;

EMPLOYEE_ID LAST_NAME                 DEPARTMENT_NAME

----------- ------------------------- ------------------------------

        168 Ozer                       Sales

        169 Bloom                     Sales

        170 Fox                       Sales

        171 Smith                      Sales

        172 Bates                      Sales

        173 Kumar                     Sales

        174 Abel                       Sales

        175 Hutton                     Sales

        176 Taylor                      Sales

        177 Livingston                  Sales

        178 Grant                                  #右補空

         190 Gates                     Shipping

        191 Perkins                   Shipping

        192 Bell                      Shipping

        193 Everett                   Shipping

        194 McCain                    Shipping

        195 Jones                     Shipping

        196 Walsh                     Shipping

        197 Feeney                    Shipping

                                      NOC            #坐補空

                                      Manufacturing

                                      Government Sales

3)自連線:其實是內連線的一種特殊情況,只不過要連線的倆個表 是同一個表,比如說  你要得到比其經理來的早的員工的標號。那就只能用自連線了  

思路 把一個employees 表看成員工表a  再把另一個 employees 表看成經理表b  連線條件是員工表的經理編號=經理表員工編號   具體看下邊:

HR@ENMOEDU> select a.EMPLOYEE_ID from employees a join employees b on a.MANAGER_ID=b.EMPLOYEE_ID  where a.hire_date

 

EMPLOYEE_ID

-----------

        122

        114

        102

        108

        205

        204

        203

        200

        105

        109

        185

總結:仔細思考一下 發現能用子查詢得到的結果,都可以用連線來做,但反過來就不一定了,例如自連線中的例子,你要想用子查詢 那就複雜了  本人暫時沒辦法用子查詢得到結果。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-1244016/,如需轉載,請註明出處,否則將追究法律責任。

相關文章