PostgreSQL JOINS子句
PostgreSQL的聯接(Joins)子句用於從兩個或多個數據庫中的表的記錄相結合。一個JOIN是一種手段,從兩個表中使用常見於每個值相結合的字段。
在PostgreSQL的Join 類型是::
-
CROSS JOIN
-
INNER JOIN
-
LEFT OUTER JOIN
-
RIGHT OUTER JOIN
-
FULL OUTER JOIN
在我們開始之前,讓我們考慮兩個表COMPANY 和DEPARTMENT。我們已經看到了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
另一張表是部門有以下定義:
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 );
最後,我們已經按照部門表中的記錄列表:
id | dept | emp_id ----+-------------+-------- 1 | IT Billing | 1 2 | Engineering | 2 3 | Finance | 7
CROSS JOIN
交叉連接匹配的第一個表與第二個表中的每一行的每一行。如果輸入表,結果表x和y列,分彆有X + Y列。由於交叉聯接有可能產生非常大的表,必須謹慎,隻在適當的時候使用它們。
以下是CROSS JOIN的語法:
SELECT ... FROM table1 CROSS JOIN table2 ...
根據上麵的表上,我們可以寫一個交叉連接如下:
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
INNER JOIN
INNER JOIN創建一個新的結果表,通過結合兩個表(表1和表2)根據聯接謂詞的列值。查詢比較table1中的每一行,每一行表2,找到所有對滿足連接謂詞的行。當聯接謂詞滿足table1和table2每個對相匹配的行,列的值合並成一個結果行。
內部聯接聯接類型是最常見的,並且是默認的聯接類型。您可以使用可選INNER關鍵字。
以下是INNER JOIN的語法:
SELECT table1.column1, table2.column2... FROM table1 INNER JOIN table2 ON table1.common_filed = table2.common_field;
根據上麵的表,我們可以寫一個內部聯接如下:
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
LEFT OUTER JOIN
OUTER JOIN是一個擴展的INNER JOIN。 SQL標準定義了三種類型的外聯接:左,右,並充分和PostgreSQL支持所有這些。
LEFT OUTER JOIN的情況下,先進行內部聯接。然後,表T1中的每一行並不滿足連接條件的T2表中的任何行,參加行加上T2的列中的空值。因此,加入表總是至少有一個排T1中的每一行。
以下是LEFT OUTER JOIN的語法:
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
根據上麵的表上,我們可以寫一個內部聯接如下:
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 |
RIGHT OUTER JOIN
首先,進行內部聯接。然後,T2表中的每一行並不滿足連接條件的在T1表中的任何行,參加行添加T1的列中的空值。這是跟左連接相反的,將永遠有一個結果表行T2中的每一行。
以下是LEFT OUTER JOIN的語法:
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
根據上麵的表上,我們可以寫一個內部聯接如下:
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
FULL OUTER JOIN
首先,進行內部聯接。然後,表T1中的每一行並不滿足連接條件的T2表中的任何行,參加行加上T2的列中的空值。此外,T2的每一行並不滿足連接條件的T1中的任何行,在T1的列用空值添加一個連接行。
以下是FULL OUTER JOIN的語法:
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
根據上麵的表上,我們可以寫一個內部聯接如下:
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 |