20 数据查询之使用JOIN
在数据库操作中,JOIN是一种重要的查询方式,用来从多个表中联合获取数据。在前一章节中,我们学习了如何使用WHERE条件来筛选查询结果,而这一章我们将深入探讨JOIN的使用,以便从关联表中提取出我们所需的信息。
6.3.1 JOIN的类型
PostgreSQL支持多种JOIN类型,主要包括:
- INNER JOIN:返回两个表中匹配的记录。
 - LEFT JOIN(或称为
LEFT OUTER JOIN):返回左表中的所有记录及右表中匹配的记录,若右表没有匹配,则结果为NULL。 - RIGHT JOIN(或称为
RIGHT OUTER JOIN):返回右表中的所有记录及左表中匹配的记录,若左表没有匹配,则结果为NULL。 - FULL JOIN(或称为
FULL OUTER JOIN):返回两个表中的所有记录,若没有匹配,则结果为NULL。 - CROSS JOIN:返回左表和右表中的笛卡尔积。
 
以下,我们将通过具体案例来展示如何使用这些JOIN操作。
6.3.2 案例背景
假设我们有两个表:
employees(员工表):
| employee_id | name | department_id | 
|---|---|---|
| 1 | Alice | 1 | 
| 2 | Bob | 2 | 
| 3 | Charlie | 1 | 
| 4 | Daniel | NULL | 
departments(部门表):
| department_id | department_name | 
|---|---|
| 1 | HR | 
| 2 | Sales | 
| 3 | Marketing | 
INNER JOIN 示例
我们想查询所有在员工表中有的员工及其对应的部门名称。可以使用INNER JOIN进行查询:
SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;
结果:
| name | department_name | 
|---|---|
| Alice | HR | 
| Bob | Sales | 
| Charlie | HR | 
LEFT JOIN 示例
如果我们想要列出所有员工及其部门,即使某些员工没有部门信息,我们可以使用LEFT JOIN:
SELECT e.name, d.department_name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
结果:
| name | department_name | 
|---|---|
| Alice | HR | 
| Bob | Sales | 
| Charlie | HR | 
| Daniel | NULL | 
RIGHT JOIN 示例
如果我们想列出所有部门及其员工信息(即便在某些部门没有员工),可以使用RIGHT JOIN:
SELECT e.name, d.department_name
FROM employees e
RIGHT JOIN departments d ON e.department_id = d.department_id;
结果:
| name | department_name | 
|---|---|
| Alice | HR | 
| Bob | Sales | 
| NULL | Marketing | 
FULL JOIN 示例
如果我们想列出所有员工和所有部门的信息(即便在某些情况下没有匹配),可以使用FULL JOIN:
SELECT e.name, d.department_name
FROM employees e
FULL JOIN departments d ON e.department_id = d.department_id;
结果:
| name | department_name | 
|---|---|
| Alice | HR | 
| Bob | Sales | 
| Charlie | HR | 
| Daniel | NULL | 
| NULL | Marketing | 
CROSS JOIN 示例
最后,假设我们想获得所有员工与所有部门的组合,可以使用CROSS JOIN:
SELECT e.name, d.department_name
FROM employees e
CROSS JOIN departments d;
结果:
| name | department_name | 
|---|---|
| Alice | HR | 
| Alice | Sales | 
| Alice | Marketing | 
| Bob | HR | 
| Bob | Sales | 
| Bob | Marketing | 
| Charlie | HR | 
| Charlie | Sales | 
| Charlie | Marketing | 
| Daniel | HR | 
| Daniel | Sales | 
| Daniel | Marketing | 
6.3.3 小结
在本节中,我们详细讲解了JOIN的类型以及如何在PostgreSQL中使用它们来从多个表中获取联合数据。通过这些案例,你可以更好地理解如何在实际应用中利用JOIN进行查询。
接下来,我们将在下一章节中深入探讨聚合函数,进一步丰富我们的数据查询技巧。
