00104 SQL查詢進階2:多表聯合查詢JOIN

**

一、引言

**
關係型數據庫的精髓就在於,它以不同的表作爲數據單元儲存不同的數據,同時又在不同表之間建立聯繫,把表內的數據鏈接起來。
數據庫的這一特性,一方面縮減了單個表的規模,防止了大量的數據冗餘,另一方面也導致我們無法通過查詢一個表得到我們想要的所有數據。
舉個例子,我們在一個student表中存儲學生的姓名、學號、性別等基本信息,而在grades表中存儲學生的語文和數學成績,那怎麼才能知道每一條成績是哪個學生的呢?我們在grades表中也加入了一列,用來存儲學生的學號。
所以,當我們想知道張三的語文成績時,首先要從student表得到張三的學號001,然後在grades表中查找學號列爲001的那一行,從而得到成績。在這一過程中,我們所作的工作,就是把兩個表通過它們之間的公用字段(字段就是列)連接了起來。
SQL語言提供了把幾個表連起來的關鍵字,用於把不同表的數據連起來,得到我們想要的結果,這個關鍵字就是JOIN。

二、JOIN的基本語法

 SELECT table1.column1, table2.column2 
     FROM table1 XX join table2... 
     ON
     table1.column_name= table2.column_name

在上述語句中我們留出了XX,是因爲JOIN有幾種不同的形式,分別代表不同的結合方式:

爲了方便理解,我們先給出一個概念,請把每個表想象成一個集合,JOIN操作就是在進行集合運算。

內部結合INNER JOIN

也就是取兩個表的交集

SELECT table1.column1, table2.column2 
    FROM table1 INNER JOIN table2... 
    ON table1.column_name= table2.column_name

簡化代碼——給表起個別名:

SELECT 1.column1, 2.column2 
    FROM table1 1
         INNER JOIN table2 2
    WHERE 1.column_name= 2.column_name

內部結合又可以分爲以下兩種情況:

  • 等值結合:利用兩個表通用字段的相等來實現結合
    • WHERE table1.column_name = table2.column_name
  • 不等值結合:利用兩個表通用字段的不相等來實現結合
    • WHERE table1.column_name != table2.column_name
    • 不等值結合常常會找出很多沒用的數據,它可以和等值結合連起來用來驗錯,比如說身份證號相等但是姓名不等的,那就是錯誤數據,以此爲條件查詢看有沒有結果,有就是有錯

外部結合OUTER JOIN:

外部結合包括三種情況:

SELECT table1.column1, table2.column2 
    FROM table1 LEFT/RIGHT/FULL [OUTER] JOIN table2 
    ON table1.column_name= table2.column_name

LEFT,RIGHT,FULL JOIN其實都是外部結合,因爲outer是可以不寫的,所以學習時常常會導致困擾,總的來講只有內部結合和外部結合兩大類,而外部結合又分爲左連接LEFT、右連接RIGHT、全連接FULL三種

  • 左連接:顯示左表全部數據,右表只顯示符合where條件的 ——左表+交集

  • 右連接:顯示右表全部數據,左表只顯示符合where條件的 ——右表+交集

  • 全連接:where誰也不影響——並集

當然,外部結合也可以分等值和不等值,就看結合條件怎麼寫了。

總結成如下口訣

(某大神博客裏寫的,並非原創)
左連接where隻影向右表
右連接where隻影響左表
全連接where誰也不影響
內連接where影響左右表

自結合:

通過給一個表賦兩個別名,從而可以將它視作兩個表來進行結合。
首先再重申一次,JOIN從整體來講只有內連接和外連接兩大類,自結合其實只是一種特殊情況,可以說,它是從另一個分類維度來看的,而不是和內連接、外連接並行的維度。所以,自結合可以是內部結合,也可以是外部結合。

SELECT 1.column1, 2.column1 
    FROM table1 1 INNER/LEFT/RIGHT/FULL JOIN table1 2 
    ON 1.column2=2.column1
 /1和2都是同一個表table1的別名

比如說一個企業職工信息表jobinfo,記錄了職工姓名name、編號code、職位position、上級supercode,但是上級給出的是上級的編號而不是姓名。
當我們想要查詢每個職工對應的上級姓名時,我們可以返回兩列職工姓名,而讓第二列職工姓名對應的編號,等於第一列職工姓名對應的上級編號,這樣就得出了每個職工上級職工的姓名。
寫成代碼就是:

SELECT 1.code,1.name,1.supercode,2.name
    FROM jobinfo 1 
    LEFT JOIN jobinfo 2 
    ON  1.supercode=2.code
/注意這裏我們用的是LEFT JOIN,從而返回1表中的所有行,不管該員工到底有沒有對應的上級。
/如果變成INNER JOIN, CEO這種沒有上級的員工(也就是supercode字段爲空),就不會出現在返回結果中。

TIPS:

內部結合還有另一種常用語法:

 SELECT table1.column1, table2.column2 
     FROM table1, table2... 
     WHERE table1.column_name= table2.column_name

對於初學者來講這種語法似乎更友好。但是我認爲使用上面給出的語法能夠幫助學習時更好的區分內部結合和外部結合的概念。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章