PostgreSQL - JOINS联接

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 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

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 |