SQL LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN 详解(四)

在处理多表数据时,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 表

CustomerIDName
1Alice
2Bob
3Charlie
4David

Orders 表

OrderIDCustomerIDProduct
1011Laptop
1022Smartphone

使用 LEFT JOIN 查询

SELECT Customers.Name, Orders.Product
FROM Customers
LEFT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

查询输出结果

NameProduct
AliceLaptop
BobSmartphone
CharlieNULL
DavidNULL

解释: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 表

EmployeeIDNameDepartmentID
1Alice10
2Bob20
3CharlieNULL

Departments 表

DepartmentIDDepartmentName
10HR
20IT
30Finance

使用 RIGHT JOIN 查询

SELECT Employees.Name, Departments.DepartmentName
FROM Employees
RIGHT JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;

查询输出结果

NameDepartmentName
AliceHR
BobIT
NULLFinance

解释: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 表

StudentIDName
1Alice
2Bob
3Charlie

Courses 表

CourseIDStudentIDCourseName
1011Math
1022Science
1034History

使用 FULL OUTER JOIN 查询

SELECT Students.StudentID, Students.Name, Courses.CourseName
FROM Students
FULL OUTER JOIN Courses
ON Students.StudentID = Courses.StudentID;

查询输出结果

StudentIDNameCourseName
1AliceMath
2BobScience
3CharlieNULL
4NULLHistory

解释

  • StudentID = 1 和 2 是交集部分,两表中都有数据。
  • StudentID = 3 存在于 Students 表,但在 Courses 表中没有匹配,CourseName 列为 NULL。
  • StudentID = 4 存在于 Courses 表,但在 Students 表中没有匹配,Name 列为 NULL。

演示数据库

在本教程中,我们将使用 RUNOOB 样本数据库。以下是 Websites 和 access_log 表的数据。

Websites 表

idnameurlalexacountry
1Googlehttps://www.google.cm/1USA
2淘宝https://www.taobao.com/13CN
3菜鸟教程http://www.runoob.com/4689CN
4微博http://weibo.com/20CN
5Facebookhttps://www.facebook.com/3USA
7stackoverflowhttp://stackoverflow.com/0IND

access_log 表

aidsite_idcountdate
11452016-05-10
231002016-05-13
312302016-05-14
42102016-05-14
552052016-05-14
64132016-05-15
732202016-05-15
855452016-05-16
932012016-05-17
1061112016-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;

查询输出结果

namecountdate
Facebook5452016-05-16
菜鸟教程2202016-05-15
Google2302016-05-14
菜鸟教程2012016-05-17
Facebook2052016-05-14
微博132016-05-15
淘宝102016-05-14
Google452016-05-10
菜鸟教程1002016-05-13
stackoverflowNULLNULL

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;

查询输出结果

namecountdate
Facebook5452016-05-16
菜鸟教程2202016-05-15
Google2302016-05-14
菜鸟教程2012016-05-17
Facebook2052016-05-14
微博132016-05-15
淘宝102016-05-14
Google452016-05-10
菜鸟教程1002016-05-13
NULL1112016-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;

查询输出结果

namecountdate
Facebook5452016-05-16
菜鸟教程2202016-05-15
Google2302016-05-14
菜鸟教程2012016-05-17
Facebook2052016-05-14
微博132016-05-15
淘宝102016-05-14
Google452016-05-10
菜鸟教程1002016-05-13
stackoverflowNULLNULL
NULL1112016-03-19

总结

通过本文,我们详细介绍了 LEFT JOIN、RIGHT JOIN 和 FULL OUTER JOIN 的使用方法、语法和应用场景。这些连接方式在处理多表数据时非常有用,可以帮助我们从不同表中提取所需的数据,并根据特定的条件将这些数据合并在一起。希望本文能帮助你更好地理解和应用这些 SQL 连接方式。