- PostgreSQL 教程 (jiàochéng)
- PostgreSQL - 首頁 (shǒuyè)
- PostgreSQL - 概述 (gàishuò)
- PostgreSQL - 環境設定 (huánjìng shèzhì)
- PostgreSQL - 語法 (yǔfǎ)
- PostgreSQL - 資料型別 (shùjù lèixíng)
- PostgreSQL - 建立資料庫 (chuàngjiàn shùjùkù)
- PostgreSQL - 選擇資料庫 (xuǎnzé shùjùkù)
- PostgreSQL - 刪除資料庫 (shānchú shùjùkù)
- PostgreSQL - 建立表 (chuàngjiàn biǎo)
- PostgreSQL - 刪除表 (shānchú biǎo)
- PostgreSQL - 模式 (mòshì)
- PostgreSQL - 插入查詢 (chārù cháxún)
- PostgreSQL - 選擇查詢 (xuǎnzé cháxún)
- PostgreSQL - 運算子 (yùnsuànfú)
- PostgreSQL - 表示式 (biǎodáshì)
- PostgreSQL - WHERE 子句 (zìjù)
- PostgreSQL - AND & OR 子句 (zìjù)
- PostgreSQL - 更新查詢 (gēngxīn cháxún)
- PostgreSQL - 刪除查詢 (shānchú cháxún)
- PostgreSQL - LIKE 子句 (zìjù)
- PostgreSQL - LIMIT 子句 (zìjù)
- PostgreSQL - ORDER BY 子句 (zìjù)
- PostgreSQL - GROUP BY (zìjù)
- PostgreSQL - WITH 子句 (zìjù)
- PostgreSQL - HAVING 子句 (zìjù)
- PostgreSQL - DISTINCT 關鍵字 (guanjiàncí)
- 高階 PostgreSQL (gāojí)
- PostgreSQL - 約束 (yuēshù)
- PostgreSQL - 連線 (liánjiē)
- PostgreSQL - UNION 子句 (zìjù)
- PostgreSQL - NULL 值 (zhí)
- PostgreSQL - 別名語法 (biémíng yǔfǎ)
- PostgreSQL - 觸發器 (fāhuìqì)
- PostgreSQL - 索引 (sùyǐn)
- PostgreSQL - ALTER TABLE 命令 (mìnglìng)
- TRUNCATE TABLE 命令 (mìnglìng)
- PostgreSQL - 檢視 (shìtú)
- PostgreSQL - 事務 (shìwù)
- PostgreSQL - 鎖 (suǒ)
- PostgreSQL - 子查詢 (zǐ cháxún)
- PostgreSQL - 自動遞增 (zìdòng dìzēng)
- PostgreSQL - 許可權 (quánxiàn)
- 日期/時間函式 & 運算子 (yùnsuànfú)
- PostgreSQL - 函式 (hánshù)
- PostgreSQL - 常用函式 (chángyòng hánshù)
- PostgreSQL 介面 (jiēkǒu)
- PostgreSQL - C/C++
- PostgreSQL - Java
- PostgreSQL - PHP
- PostgreSQL - Perl
- PostgreSQL - Python
- PostgreSQL 資源 (zīyuán)
- PostgreSQL - 快速指南 (kuàisù zhǐnàn)
- PostgreSQL - 資源 (zīyuán)
- PostgreSQL - 討論 (tǎolùn)
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 |