- PostgreSQL 教程
- PostgreSQL - 主页
- PostgreSQL - 概述
- PostgreSQL - 环境设置
- PostgreSQL - 语法
- PostgreSQL - 数据类型
- PostgreSQL - 创建数据库
- PostgreSQL - 选择数据库
- PostgreSQL - 删除数据库
- PostgreSQL - 创建表
- PostgreSQL - 删除表
- PostgreSQL - 架构
- PostgreSQL - 插入查询
- PostgreSQL - 选择查询
- PostgreSQL - 运算符
- PostgreSQL - 表达式
- PostgreSQL -Where 子句
- PostgreSQL - AND & OR 子句
- PostgreSQL - 更新查询
- PostgreSQL - 删除查询
- PostgreSQL - Like 子句
- PostgreSQL - 限制条款
- PostgreSQL - Order By 子句
- PostgreSQL - 分组依据
- PostgreSQL - With 子句
- PostgreSQL -having 子句
- PostgreSQL - 独特的关键字
- 高级 PostgreSQL
- PostgreSQL - 约束
- PostgreSQL - 连接
- PostgreSQL - 联合条款
- PostgreSQL - NULL 值
- PostgreSQL - 别名语法
- PostgreSQL - 触发器
- PostgreSQL - 索引
- PostgreSQL - 更改表命令
- 截断表命令
- PostgreSQL - 视图
- PostgreSQL - 事务
- PostgreSQL - 锁
- PostgreSQL - 子查询
- PostgreSQL - 自动增量
- PostgreSQL - 权限
- 日期/时间函数和运算符
- PostgreSQL - 函数
- PostgreSQL - 有用的函数
- PostgreSQL 有用资源
- PostgreSQL - 快速指南
- PostgreSQL - 有用的资源
- PostgreSQL - 讨论
PostgreSQL - 连接
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
交叉连接
交叉连接将第一个表的每一行与第二个表的每一行相匹配。如果输入表分别具有 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 |