SQL 链接查询
链接查询
在 SQL 中,链接查询(Join Query)是将两个或多个表中的数据组合在一起的查询。通过使用不同的链接类型,可以实现不同的数据组合方式。以下是对链接查询的详细讲解,包括 INNER JOIN
、LEFT JOIN
、RIGHT JOIN
和 FULL JOIN
。
假设有两个表 employees
和 departments
,数据如下:
employees
表:
1 | Alice | Smith | 101 |
2 | Bob | Johnson | 102 |
3 | Charlie | Brown | NULL |
departments
表:
101 | Sales |
102 | Marketing |
1. INNER JOIN
INNER JOIN
是最基本的链接类型,它返回两个表中匹配的记录。JOIN
是 INNER JOIN
的简写形式。如果某个表中的记录在另一个表中没有匹配的记录,则这些记录不会出现在结果集中。
语法:
SELECT column1, column2, ...
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
示例:
查询所有员工及其所属部门:
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id;
结果:
1 | Alice | Smith | Sales |
2 | Bob | Johnson | Marketing |
2. LEFT JOIN
LEFT JOIN
返回左表(table1
)中的所有记录,即使右表(table2
)中没有匹配的记录。如果右表中没有匹配的记录,则结果集中右表的列将包含 NULL
。
语法:
SELECT column1, column2, ...
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
示例:
查询所有员工及其所属部门,即使某些员工没有分配部门:
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id;
结果:
1 | Alice | Smith | Sales |
2 | Bob | Johnson | Marketing |
3 | Charlie | Brown | NULL |
3. RIGHT JOIN
RIGHT JOIN
返回右表(table2
)中的所有记录,即使左表(table1
)中没有匹配的记录。如果左表中没有匹配的记录,则结果集中左表的列将包含 NULL
。
语法:
SELECT column1, column2, ...
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
示例:
查询所有部门及其员工,即使某些部门没有员工:
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT JOIN departments d
ON e.department_id = d.department_id;
结果:
1 | Alice | Smith | Sales |
2 | Bob | Johnson | Marketing |
NULL | NULL | NULL | NULL |
4. FULL JOIN
FULL JOIN
返回左表和右表中的所有记录,即使某些记录在另一表中没有匹配的记录。如果某表中没有匹配的记录,则结果集中该表的列将包含 NULL
。需要注意的是,FULL JOIN
在某些数据库系统(如 MySQL)中不支持。
语法:
SELECT column1, column2, ...
FROM table1
FULL JOIN table2
ON table1.column = table2.column;
示例:
查询所有员工及其所属部门,以及所有部门及其员工:
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
FULL JOIN departments d
ON e.department_id = d.department_id;
结果:
1 | Alice | Smith | Sales |
2 | Bob | Johnson | Marketing |
3 | Charlie | Brown | NULL |
NULL | NULL | NULL | NULL |
总结
通过使用不同的链接类型,可以实现不同的数据组合方式:
INNER JOIN
:返回两个表中匹配的记录。LEFT JOIN
:返回左表中的所有记录,右表中没有匹配的记录则为NULL
。RIGHT JOIN
:返回右表中的所有记录,左表中没有匹配的记录则为NULL
。FULL JOIN
:返回两个表中的所有记录,不匹配的记录则为NULL
。