English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
PostgreSQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。
在 PostgreSQL 中,JOIN 有五种连接类型:
CROSS JOIN :交叉连接
INNER JOIN:内连接
LEFT OUTER JOIN:左外连接
RIGHT OUTER JOIN:右外连接
FULL OUTER JOIN:全外连接
接下来让我们创建两张表 COMPANY 和 DEPARTMENT。
创建 COMPANY 表(下载 COMPANY SQL 文件 ),数据内容如下:
w3codeboxdb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
我们往表里添加几条数据:
INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00); INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00); INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
此时,COMPANY 表的记录如下:
id | name | age | address | salary ----+-------+-----+--------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 8 | Paul | 24 | Houston | 20000 9 | James | 44 | Norway | 5000 10 | James | 45 | Texas | 5000 (10 rows)
创建一张 DEPARTMENT 表,添加三个字段:
CREATE TABLE DEPARTMENT( ID INT PRIMARY KEY NOT NULL, DEPT CHAR(50) NOT NULL, EMP_ID INT NOT NULL );
向 DEPARTMENT 表插入三条记录:
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
交叉连接(CROSS JOIN)把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,则结果表有 x*y 行。
由于交叉连接(CROSS JOIN)有可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。
下面是 CROSS JOIN 的基础语法:
SELECT ... FROM table1 CROSS JOIN table2 ...
基于上面的表,我们可以写一个交叉连接(CROSS JOIN),如下所示:
w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT;
得到结果如下:
w3codeboxdb=# SELECT EMP_ID, NAME, DEPT FROM COMPANY CROSS JOIN DEPARTMENT; emp_id | name | dept --------+-------+-------------------- 1 | Paul | IT Billing 1 | Allen | IT Billing 1 | Teddy | IT Billing 1 | Mark | IT Billing 1 | David | IT Billing 1 | Kim | IT Billing 1 | James | IT Billing 1 | Paul | IT Billing 1 | James | IT Billing 1 | James | IT Billing 2 | Paul | Engineering 2 | Allen | Engineering 2 | Teddy | Engineering 2 | Mark | Engineering 2 | David | Engineering 2 | Kim | Engineering 2 | James | Engineering 2 | Paul | Engineering 2 | James | Engineering 2 | James | Engineering 7 | Paul | Finance
INNER JOIN (JOIN interne) combine deux tables (table1 et table2) pour créer une nouvelle table de résultats. La requête combinera les table1 Chaque ligne est comparée avec la table2 Chaque ligne est comparée pour trouver toutes les paires de lignes qui satisfont le predicat de jointure.
Lorsque les valeurs des colonnes de A et B correspondent au predicat de jointure, les valeurs des colonnes de chaque paire de correspondance sont combinées en une ligne de résultat.
Le INNER JOIN (JOIN interne) est le type de jointure le plus courant et le type par défaut.
Le mot-clé INNER est optionnel.
Voici la syntaxe du INNER JOIN (JOIN interne) :
SELECT table1.column1, table2.column2... FROM table1 INNER JOIN table2 ON table1.common_filed = table2.common_field;
Basé sur les tables ci-dessus, nous pouvons écrire une jointure interne, comme suit :
w3codeboxdb=# 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 7 | James | Finance (3 rows)
Les jointures externes sont une extension des jointures internes. Le standard SQL définit trois types de jointures externes: LEFT, RIGHT et FULL, PostgreSQL prend en charge tous ces types.
Pour le LEFT OUTER JOIN, d'abord exécuter une jointure interne. Ensuite, pour la table T1 de toute ligne qui ne satisfait pas la table T2 Chaque ligne de la condition de jointure, où T2 Les colonnes de qui contiennent des valeurs null ajouteront également une ligne de jointure. Par conséquent, les tables jointes dans T1 Dans chaque ligne, il y a au moins une ligne.
Voici la syntaxe de base du LEFT OUTER JOIN :
SELECT ... FROM table1 LEFT OUTER JOIN table2 ON conditional_expression ...
Basé sur les deux tables ci-dessus, nous pouvons écrire une jointure externe gauche, comme suit :
w3codeboxdb=# 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 7 | James | Finance | James | | David | | Paul | | Kim | | Mark | | Teddy | | James | (10 rows)
Tout d'abord, exécutez la jointure interne. Ensuite, pour la table T2de toute ligne qui ne satisfait pas la table T1de chaque ligne qui satisfait la condition de jointure, où T1Les valeurs vides dans la colonne ajoutent également une ligne de jointure. Cela est opposé à la jointure gauche; pour T2de chaque ligne, la table de résultat a toujours une ligne.
Voici la syntaxe de base du joint externe droit (RIGHT OUT JOIN) :
SELECT ... FROM table1 RIGHT OUTER JOIN table2 ON conditional_expression ...
Sur la base des deux tables ci-dessus, nous créons un joint externe droit :
w3codeboxdb=# 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 | James | Finance (3 rows)
Tout d'abord, exécutez la jointure interne. Ensuite, pour la table T1 de toute ligne qui ne satisfait pas la table T2 de toute ligne qui satisfait la condition de jointure pour chaque ligne dans T2 Les colonnes où il y a des valeurs null dans T2 de toute ligne qui ne satisfait pas la condition de jointure avec T1 de toute ligne qui satisfait la condition de jointure pour chaque ligne dans T1 Les colonnes contenant des valeurs null sont incluses dans le résultat.
Voici la syntaxe de base de l'union externe :
SELECT ... FROM table1 FULL OUTER JOIN table2 ON conditional_expression ...
Sur la base des deux tables ci-dessus, vous pouvez créer un joint externe :
w3codeboxdb=# 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 | James | Finance | James | | David | | Paul | | Kim | | Mark | | Teddy | | James | (10 rows)