SQL LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN 详解(四)
- 数据库
- 8天前
- 6热度
- 0评论
在处理多表数据时,SQL 提供了多种连接方式来帮助我们从不同的表中提取所需的数据。本文将详细介绍 LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN 的使用方法、语法和应用场景,并通过实际示例帮助你更好地理解和应用这些连接方式。
什么是 SQL 连接?
SQL 连接是一种用于组合多个表中相关数据的操作。通过连接,我们可以从多个表中获取数据,并根据特定的条件将这些数据合并在一起。常见的连接类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN。
SQL LEFT JOIN
LEFT JOIN 是一种常用的连接方式,它会返回左表中的所有记录,即使右表中没有匹配的记录。如果右表中没有匹配的记录,结果集中右表的列将被填充为 NULL。
语法
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;或:
SELECT column_name(s)
FROM table1
LEFT OUTER JOIN table2
ON table1.column_name = table2.column_name;注释:在某些数据库中,LEFT JOIN 也称为 LEFT OUTER JOIN。
- table1:左表(主表),LEFT JOIN 会保留该表的所有记录。
- table2:右表(从表),如果没有匹配的数据,用 NULL 填充对应的列。
- ON table1.column_name = table2.column_name:指定连接条件,通常是两个表的共同字段。
特点
- 返回左表中的所有记录,即使右表没有匹配的数据。
- 如果右表没有匹配的记录,结果中该行右表字段为 NULL。
示例
假设我们有两个表:Customers 和 Orders。
Customers 表:
| CustomerID | Name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
| 4 | David |
Orders 表:
| OrderID | CustomerID | Product |
|---|---|---|
| 101 | 1 | Laptop |
| 102 | 2 | Smartphone |
使用 LEFT JOIN 查询
SELECT Customers.Name, Orders.Product
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;查询输出结果:
| Name | Product |
|---|---|
| Alice | Laptop |
| Bob | Smartphone |
| Charlie | NULL |
| David | NULL |
解释:LEFT JOIN 返回了 Customers 表中的所有记录。对于 Charlie 和 David,由于在 Orders 表中没有匹配的 CustomerID,它们对应的 Product 列为 NULL。
SQL RIGHT JOIN
RIGHT JOIN 与 LEFT JOIN 类似,但其行为相反:RIGHT JOIN 会返回右表中的所有记录,即使左表中没有匹配的记录。如果左表中没有匹配的记录,结果集中左表的列将被填充为 NULL。
语法
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;或:
SELECT column_name(s)
FROM table1
RIGHT OUTER JOIN table2
ON table1.column_name = table2.column_name;注释:在某些数据库中,RIGHT JOIN 也称为 RIGHT OUTER JOIN。
- table1:左表。
- table2:右表,RIGHT JOIN 会保留该表的所有记录。
- ON table1.column_name = table2.column_name:指定连接条件,通常是两个表的共同字段。
特点
- 保留右表的所有记录:即使左表中没有匹配的记录,也会在结果中包含右表的所有记录。
- 左表未匹配时填充 NULL:如果左表中没有对应的记录,用 NULL 填充左表的列。
示例
假设我们有两个表:Employees 和 Departments。
Employees 表:
| EmployeeID | Name | DepartmentID |
|---|---|---|
| 1 | Alice | 10 |
| 2 | Bob | 20 |
| 3 | Charlie | NULL |
Departments 表:
| DepartmentID | DepartmentName |
|---|---|
| 10 | HR |
| 20 | IT |
| 30 | Finance |
使用 RIGHT JOIN 查询
SELECT Employees.Name, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;查询输出结果:
| Name | DepartmentName |
|---|---|
| Alice | HR |
| Bob | IT |
| NULL | Finance |
解释:RIGHT JOIN 返回了 Departments 表中的所有记录。对于 DepartmentID = 30 的记录,由于 Employees 表中没有匹配数据,其 Name 列为 NULL。
SQL FULL OUTER JOIN
FULL OUTER JOIN 是一种连接方式,用于同时保留两个表中所有的记录,即使其中一方没有匹配项。如果某条记录在一张表中存在,而在另一张表中没有匹配项,则该记录的缺失列会以 NULL 填充。
语法
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;- table1、table2:需要进行连接的两个表。
- ON table1.column_name = table2.column_name:指定连接条件,通常是两个表的共同字段。
- column_name(s):从两个表中选择需要的字段。
特点
- 返回两个表的并集:包含所有匹配和未匹配的记录。
- 未匹配的记录填充 NULL:如果某条记录在一张表中没有匹配项,则其对应的字段以 NULL 表示。
- 对等性:FULL OUTER JOIN 包含了 LEFT JOIN 和 RIGHT JOIN 的结果。
示例
假设我们有两个表:Students 和 Courses。
Students 表:
| StudentID | Name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
Courses 表:
| CourseID | StudentID | CourseName |
|---|---|---|
| 101 | 1 | Math |
| 102 | 2 | Science |
| 103 | 4 | History |
使用 FULL OUTER JOIN 查询
SELECT Students.StudentID, Students.Name, Courses.CourseName
FROM Students
FULL OUTER JOIN Courses
ON Students.StudentID = Courses.StudentID;查询输出结果:
| StudentID | Name | CourseName |
|---|---|---|
| 1 | Alice | Math |
| 2 | Bob | Science |
| 3 | Charlie | NULL |
| 4 | NULL | History |
解释:
- StudentID = 1 和 2 是交集部分,两表中都有数据。
- StudentID = 3 存在于 Students 表,但在 Courses 表中没有匹配,CourseName 列为 NULL。
- StudentID = 4 存在于 Courses 表,但在 Students 表中没有匹配,Name 列为 NULL。
演示数据库
在本教程中,我们将使用 RUNOOB 样本数据库。以下是 Websites 和 access_log 表的数据。
Websites 表:
| id | name | url | alexa | country |
|---|---|---|---|---|
| 1 | https://www.google.cm/ | 1 | USA | |
| 2 | 淘宝 | https://www.taobao.com/ | 13 | CN |
| 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN |
| 4 | 微博 | http://weibo.com/ | 20 | CN |
| 5 | https://www.facebook.com/ | 3 | USA | |
| 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND |
access_log 表:
| aid | site_id | count | date |
|---|---|---|---|
| 1 | 1 | 45 | 2016-05-10 |
| 2 | 3 | 100 | 2016-05-13 |
| 3 | 1 | 230 | 2016-05-14 |
| 4 | 2 | 10 | 2016-05-14 |
| 5 | 5 | 205 | 2016-05-14 |
| 6 | 4 | 13 | 2016-05-15 |
| 7 | 3 | 220 | 2016-05-15 |
| 8 | 5 | 545 | 2016-05-16 |
| 9 | 3 | 201 | 2016-05-17 |
| 10 | 6 | 111 | 2016-03-19 |
SQL LEFT JOIN 实例
以下 SQL 语句将返回所有网站及其访问量(如果有的话)。
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
LEFT JOIN access_log
ON Websites.id = access_log.site_id
ORDER BY access_log.count DESC;查询输出结果:
| name | count | date |
|---|---|---|
| 545 | 2016-05-16 | |
| 菜鸟教程 | 220 | 2016-05-15 |
| 230 | 2016-05-14 | |
| 菜鸟教程 | 201 | 2016-05-17 |
| 205 | 2016-05-14 | |
| 微博 | 13 | 2016-05-15 |
| 淘宝 | 10 | 2016-05-14 |
| 45 | 2016-05-10 | |
| 菜鸟教程 | 100 | 2016-05-13 |
| stackoverflow | NULL | NULL |
SQL RIGHT JOIN 实例
以下 SQL 语句将返回网站的访问记录。
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
RIGHT JOIN access_log
ON Websites.id = access_log.site_id
ORDER BY access_log.count DESC;查询输出结果:
| name | count | date |
|---|---|---|
| 545 | 2016-05-16 | |
| 菜鸟教程 | 220 | 2016-05-15 |
| 230 | 2016-05-14 | |
| 菜鸟教程 | 201 | 2016-05-17 |
| 205 | 2016-05-14 | |
| 微博 | 13 | 2016-05-15 |
| 淘宝 | 10 | 2016-05-14 |
| 45 | 2016-05-10 | |
| 菜鸟教程 | 100 | 2016-05-13 |
| NULL | 111 | 2016-03-19 |
SQL FULL OUTER JOIN 实例
以下 SQL 语句将返回所有网站及其访问记录,无论是否匹配。
SELECT Websites.name, access_log.count, access_log.date
FROM Websites
FULL OUTER JOIN access_log
ON Websites.id = access_log.site_id
ORDER BY access_log.count DESC;查询输出结果:
| name | count | date |
|---|---|---|
| 545 | 2016-05-16 | |
| 菜鸟教程 | 220 | 2016-05-15 |
| 230 | 2016-05-14 | |
| 菜鸟教程 | 201 | 2016-05-17 |
| 205 | 2016-05-14 | |
| 微博 | 13 | 2016-05-15 |
| 淘宝 | 10 | 2016-05-14 |
| 45 | 2016-05-10 | |
| 菜鸟教程 | 100 | 2016-05-13 |
| stackoverflow | NULL | NULL |
| NULL | 111 | 2016-03-19 |
总结
通过本文,我们详细介绍了 LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN 的使用方法、语法和应用场景。这些连接方式在处理多表数据时非常有用,可以帮助我们从不同表中提取所需的数据,并根据特定的条件将这些数据合并在一起。希望本文能帮助你更好地理解和应用这些 SQL 连接方式。