PostgreSQL 联接子句用于组合数据库中两个或多个表的记录. JOIN是一种通过使用每个表共有的值组合来自两个表的字段的方法.
PostgreSQL中的连接类型是 :
CROSS JOIN
INNER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
在我们继续之前,让我们考虑两个表,公司和部门.我们已经看到INSERT语句填充COMPANY表.所以,让我们假设在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
CROSS JOIN
CROSS JOIN将第一个表的每一行与第二个表的每一行匹配.如果输入表分别具有x和y列,则结果表将具有x + y列.因为CROSS JOIN有可能生成非常大的表,所以必须注意只在适当的时候使用它们.
以下是CROSS JOIN的语法;
SELECT ... FROM table1 CROSS JOIN table2 ...
基于以上表格,我们可以写下一个CROSS JOIN,如下所示;
testdb = #EEC EMP_ID,NAME,DEPT FROM COMPANY CROSS JOINMENT;
上面给出的查询将产生以下结果 :
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通过组合两个表的列值(table1)创建一个新的结果表和table2)基于连接谓词.该查询将table1的每一行与table2的每一行进行比较,以查找满足join-predicate的所有行对.当满足连接谓词时,table1和table2的每对匹配行的列值将合并到结果行中.
INNER JOIN是最常见的连接类型,是默认的连接类型.您可以选择使用INNER关键字.
以下是INNER JOIN的语法;
SELECT table1.column1, table2.column2...FROM table1INNER JOIN table2ON 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
LEFT OUTER JOIN
OUTER JOIN是INNER JOIN的扩展. SQL标准定义了三种类型的OUTER JOIN:LEFT,RIGHT和FULL,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中每行的结果表总是有一行.
以下是RIGHT 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的列中添加具有空值的连接行.此外,对于不满足T1中任何行的连接条件的T2的每一行,添加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 |