PostgreSQL - JOINS

  • 简述

    PostgreSQLJoins子句用于组合数据库中两个或多个表的记录。JOIN 是一种通过使用每个表共有的值来组合两个表中的字段的方法。
    PostgreSQL 中的连接类型是 -
    • 交叉连接
    • 内部连接
    • 左外连接
    • 右外连接
    • FULL 外连接
    在继续之前,让我们考虑两个表,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
    
  • 交叉连接

    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
    
  • 内部连接

    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
    
  • 左外连接

    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 |
    
  • 正确的外部连接

    首先,执行内连接。然后,对于表 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
    
  • 完整的外部连接

    首先,执行内连接。然后,对于表 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 |