PostgreSQL - 連線 (liánjiē)



PostgreSQL 的連線 (liánjiē)子句用於組合資料庫中兩個或多個表中的記錄。連線是一種透過使用每個表中共同的值來組合兩個表中的欄位的方法。

PostgreSQL 中的連線型別包括:

  • 交叉連線 (Chāojiā liánjiē)
  • 內部連線 (Nèibù liánjiē)
  • 左外部連線 (Zuǒ wàibù liánjiē)
  • 右外部連線 (Yòu wàibù liánjiē)
  • 全外部連線 (Quán wàibù liánjiē)

在我們繼續之前,讓我們考慮兩個表,COMPANY 和 DEPARTMENT。我們已經看過用於填充 COMPANY 表的 INSERT 語句。所以讓我們假設 COMPANY 表中存在以下記錄:

 id | name  | age | address   | salary | join_date
----+-------+-----+-----------+--------+-----------
  1 | Paul  |  32 | California|  20000 | 2001-07-13
  3 | Teddy |  23 | Norway    |  20000 |
  4 | Mark  |  25 | Rich-Mond |  65000 | 2007-12-13
  5 | David |  27 | Texas     |  85000 | 2007-12-13
  2 | Allen |  25 | Texas     |        | 2007-12-13
  8 | Paul  |  24 | Houston   |  20000 | 2005-07-13
  9 | James |  44 | Norway    |   5000 | 2005-07-13
 10 | James |  45 | Texas     |   5000 | 2005-07-13

另一個表是 DEPARTMENT,其定義如下:

CREATE TABLE DEPARTMENT(
   ID INT PRIMARY KEY      NOT NULL,
   DEPT           CHAR(50) NOT NULL,
   EMP_ID         INT      NOT NULL
);

以下是用於填充 DEPARTMENT 表的 INSERT 語句列表:

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (1, 'IT Billing', 1 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (2, 'Engineering', 2 );

INSERT INTO DEPARTMENT (ID, DEPT, EMP_ID)
VALUES (3, 'Finance', 7 );

最後,DEPARTMENT 表中存在以下記錄:

 id | dept        | emp_id
----+-------------+--------
  1 | IT Billing  |  1
  2 | Engineering |  2
  3 | Finance     |  7

交叉連線 (Chāojiā liánjiē)

交叉連線 (CROSS JOIN) 將第一個表的每一行與第二個表的每一行匹配。如果輸入表分別具有 x 和 y 列,則結果表將具有 x+y 列。由於交叉連線 (CROSS JOIN) 可能會生成非常大的表,因此必須注意僅在適當的時候使用它們。

以下是交叉連線 (CROSS JOIN) 的語法:

SELECT ... FROM table1 CROSS JOIN table2 ...

基於上述表格,我們可以編寫一個交叉連線 (CROSS JOIN) 如下:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;

上述查詢將產生以下結果:

emp_id| name  |  dept
------|-------|--------------
    1 | Paul  | IT Billing
    1 | Teddy | IT Billing
    1 | Mark  | IT Billing
    1 | David | IT Billing
    1 | Allen | IT Billing
    1 | Paul  | IT Billing
    1 | James | IT Billing
    1 | James | IT Billing
    2 | Paul  | Engineering
    2 | Teddy | Engineering
    2 | Mark  | Engineering
    2 | David | Engineering
    2 | Allen | Engineering
    2 | Paul  | Engineering
    2 | James | Engineering
    2 | James | Engineering
    7 | Paul  | Finance
    7 | Teddy | Finance
    7 | Mark  | Finance
    7 | David | Finance
    7 | Allen | Finance
    7 | Paul  | Finance
    7 | James | Finance
    7 | James | Finance

內部連線 (Nèibù liánjiē)

內部連線 (INNER JOIN) 透過基於連線謂詞組合兩個表(table1 和 table2)的列值來建立一個新的結果表。查詢比較 table1 的每一行與 table2 的每一行,以查詢滿足連線謂詞的所有行對。當滿足連線謂詞時,table1 和 table2 的每一對匹配行的列值將組合到結果行中。

內部連線 (INNER JOIN) 是最常見的連線型別,也是預設的連線型別。您可以選擇使用 INNER 關鍵字。

以下是內部連線 (INNER JOIN) 的語法:

SELECT table1.column1, table2.column2...
FROM table1
INNER JOIN table2
ON table1.common_filed = table2.common_field;

基於上述表格,我們可以編寫一個內部連線 (INNER JOIN) 如下:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY INNER JOIN DEPARTMENT
        ON COMPANY.ID = DEPARTMENT.EMP_ID;

上述查詢將產生以下結果:

 emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering

左外部連線 (Zuǒ wàibù liánjiē)

外部連線 (OUTER JOIN) 是內部連線 (INNER JOIN) 的擴充套件。SQL 標準定義了三種類型的外部連線 (OUTER JOIN):左、右和全,PostgreSQL 支援所有這些。

對於左外部連線 (LEFT OUTER JOIN),首先執行內部連線 (INNER JOIN)。然後,對於在表 T1 中但不滿足與表 T2 中任何行的連線條件的每一行,將新增一個連線行,其中 T2 的列中包含 null 值。因此,連線表始終至少包含 T1 中每一行的一行。

以下是左外部連線 (LEFT OUTER JOIN) 的語法:

SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...

基於上述表格,我們可以編寫一個內部連線 (INNER JOIN) 如下:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY LEFT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

上述查詢將產生以下結果:

 emp_id | name  | dept
--------+-------+------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |

右外部連線 (Yòu wàibù liánjiē)

首先,執行內部連線 (INNER JOIN)。然後,對於在表 T2 中但不滿足與表 T1 中任何行的連線條件的每一行,將新增一個連線行,其中 T1 的列中包含 null 值。這是左連線的逆;結果表將始終包含 T2 中每一行的一行。

以下是右外部連線 (RIGHT OUTER JOIN) 的語法:

SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...

基於上述表格,我們可以編寫一個內部連線 (INNER JOIN) 如下:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY RIGHT OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

上述查詢將產生以下結果:

 emp_id | name  | dept
--------+-------+--------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance

全外部連線 (Quán wàibù liánjiē)

首先,執行內部連線 (INNER JOIN)。然後,對於在表 T1 中但不滿足與表 T2 中任何行的連線條件的每一行,將新增一個連線行,其中 T2 的列中包含 null 值。此外,對於在 T2 中但不滿足與表 T1 中任何行的連線條件的每一行,將新增一個在 T1 的列中包含 null 值的連線行。

以下是全外部連線 (FULL OUTER JOIN) 的語法:

SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...

基於上述表格,我們可以編寫一個內部連線 (INNER JOIN) 如下:

testdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY FULL OUTER JOIN DEPARTMENT
   ON COMPANY.ID = DEPARTMENT.EMP_ID;

上述查詢將產生以下結果:

 emp_id | name  | dept
--------+-------+---------------
      1 | Paul  | IT Billing
      2 | Allen | Engineering
      7 |       | Finance
        | James |
        | David |
        | Paul  |
        | Mark  |
        | Teddy |
        | James |
廣告 (guǎnggào)
© . All rights reserved.