PostgreSQL

PostgreSQL 知识量:10 - 51 - 182

5.2 多表查询><

内连接- 5.2.1 -

在 PostgreSQL 中,可以使用内连接(INNER JOIN)来检索两个或多个表之间的相关记录。内连接基于指定的连接条件返回匹配的行。

以下是使用内连接的示例:

假设有两个表:employees 和 departments。employees 表包含员工信息,而 departments 表包含部门信息。想要获取每个员工的姓名和他们所在的部门名称。

SELECT employees.name, departments.department_name    
FROM employees    
INNER JOIN departments ON employees.department_id = departments.id;

上述查询将返回满足连接条件的员工姓名和部门名称。这里,使用内连接将 employees 表和 departments 表连接在一起,连接条件是 employees.department_id 与 departments.id 相等。

也可以使用其他类型的内连接,如 NATURAL JOIN,它基于两个表之间的同名列进行连接:

SELECT *      
FROM employees    
NATURAL JOIN departments;

上述查询将基于 employees 表和 departments 表中的同名列进行内连接,并返回匹配的记录。

外连接- 5.2.2 -

可以使用外连接(OUTER JOIN)来检索两个或多个表之间的相关记录,以及未匹配的记录。外连接允许获取连接条件满足和未满足的行。

外连接分为三种:左外连接、右外连接、全外连接。对应SQL为LEFT/RIGHT/FULL OUTER JOIN。通常省略outer这个关键字,写成:LEFT/RIGHT/FULL JOIN。外连接在左外连接和右外连接时都会以一张表为基表,该表的内容会全部显示,然后加上两张表匹配的内容。

1. 使用 LEFT JOIN 的示例:

假设有两个表:employees 和 departments。employees 表包含员工信息,而 departments 表包含部门信息。想要获取每个员工的姓名、他们所在的部门名称,以及未分配到任何部门的员工姓名。

SELECT employees.name, departments.department_name    
FROM employees    
LEFT JOIN departments ON employees.department_id = departments.id;

上述查询将返回满足连接条件的员工姓名和部门名称,以及未分配到任何部门的员工姓名。这里,使用左外连接将 employees 表和 departments 表连接在一起,连接条件是 employees.department_id 与 departments.id 相等。左外连接将返回左表(employees)的所有记录,以及与右表(departments)匹配的记录。如果左表的记录在右表中没有匹配的记录,则相应的列将包含 NULL 值。

2. 使用 RIGHT JOIN 的示例:

SELECT employees.name, departments.department_name    
FROM employees    
RIGHT JOIN departments ON employees.department_id = departments.id;

上述查询将返回满足连接条件的员工姓名和部门名称,以及未分配到任何部门的部门名称。这里,使用右外连接将 employees 表和 departments 表连接在一起。右外连接将返回右表(departments)的所有记录,以及与左表(employees)匹配的记录。如果右表的记录在左表中没有匹配的记录,则相应的列将包含 NULL 值。

3. 使用 FULL OUTER JOIN 的示例:

SELECT employees.name, departments.department_name    
FROM employees    
FULL OUTER JOIN departments ON employees.department_id = departments.id;

上述查询将返回满足连接条件的员工姓名和部门名称,以及未分配到任何部门的员工姓名和部门名称。这里,使用全外连接将 employees 表和 departments 表连接在一起。全外连接将返回两个表的所有记录,并根据连接条件进行匹配。如果某个表的记录在另一个表中没有匹配的记录,则相应的列将包含 NULL 值。

需要注意的是,在使用外连接时,需要确保连接条件正确,以便只返回相关的记录。此外,还要注意处理 NULL 值的情况,因为在外连接中,未匹配的记录可能会导致某些列包含 NULL 值。

交叉连接- 5.2.3 -

可以使用交叉连接(CROSS JOIN)来返回两个表的笛卡尔积。交叉连接将左表的每一行与右表的每一行进行组合,产生一个结果集,其中包含所有可能的行组合。

以下是使用交叉连接的示例:

假设有两个表:employees 和 departments。employees 表包含员工信息,而 departments 表包含部门信息。想要获取每个员工与每个部门的组合。

SELECT *      
FROM employees    
CROSS JOIN departments;

上述查询将返回一个结果集,其中包含每个员工与每个部门的组合。结果集中的每一行都是左表(employees)的一行与右表(departments)的一行的组合。

需要注意的是,交叉连接可能会产生非常大的结果集,特别是当涉及的表非常大时。