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
进行查询:
1 | SELECT e.name, d.department_name |
结果:
name | department_name |
---|---|
Alice | HR |
Bob | Sales |
Charlie | HR |
LEFT JOIN 示例
如果我们想要列出所有员工及其部门,即使某些员工没有部门信息,我们可以使用LEFT JOIN
:
1 | SELECT e.name, d.department_name |
结果:
name | department_name |
---|---|
Alice | HR |
Bob | Sales |
Charlie | HR |
Daniel | NULL |
RIGHT JOIN 示例
如果我们想列出所有部门及其员工信息(即便在某些部门没有员工),可以使用RIGHT JOIN
:
1 | SELECT e.name, d.department_name |
结果:
name | department_name |
---|---|
Alice | HR |
Bob | Sales |
NULL | Marketing |
FULL JOIN 示例
如果我们想列出所有员工和所有部门的信息(即便在某些情况下没有匹配),可以使用FULL JOIN
:
1 | SELECT e.name, d.department_name |
结果:
name | department_name |
---|---|
Alice | HR |
Bob | Sales |
Charlie | HR |
Daniel | NULL |
NULL | Marketing |
CROSS JOIN 示例
最后,假设我们想获得所有员工与所有部门的组合,可以使用CROSS JOIN
:
1 | SELECT e.name, d.department_name |
结果:
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
进行查询。
接下来,我们将在下一章节中深入探讨聚合函数,进一步丰富我们的数据查询技巧。
20 数据查询之使用JOIN