连接

收藏144

阅读10263

更新时间2025-08-21

PostgreSQL Joins 子句用于组合数据库中两个或多个表的记录。 JOIN 是一种通过使用每个表共有的值来组合两个表中的字段的方法。

PostgreSQL 中的连接类型是 −

  • 交叉连接
  • 内部连接
  • 左外连接
  • 右外连接
  • 完全外连接

在继续之前,让我们考虑两个表,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 |

相关

视频

RELATED VIDEOS

更多

免费

phpStudy极速入门视频教程

免费

Midjourney基础课程
初级 Midjourney基础课程

11149次学习

收藏

免费

极客学院Git使用视频教程

免费

尚观shell视频教程
高级 尚观shell视频教程

15709次学习

收藏

免费

尚观Linux入门视频教程
初级 尚观Linux入门视频教程

42887次学习

收藏

免费

尚观Linux初级视频教程
初级 尚观Linux初级视频教程

40264次学习

收藏

免费

尚观Linux中级视频教程
中级 尚观Linux中级视频教程

48298次学习

收藏

免费

尚观Linux高级视频教程
高级 尚观Linux高级视频教程

41982次学习

收藏

科技资讯

更多

精选课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

61.7万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

39.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

70.9万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

61.6万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

23万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

33.9万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

125万人学习

关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号