当前位置: 首页 > article >正文

SQL内外连接详解

SQL中的内连接(INNER JOIN)和外连接(包括左外连接LEFT JOIN/LEFT OUTER JOIN、右外连接RIGHT JOIN/RIGHT OUTER JOIN)是用于从两个或多个表中组合数据的技术。这里用一些简单的例子来帮助理解。

内连接(INNER JOIN)

内连接返回的是两个表中满足连接条件的行。如果某个表的一行与另一个表中的某一行匹配,则这一行将会出现在结果集中。

例子: 假设我们有两个表 CustomersOrders,它们分别包含客户的资料和订单信息。每个客户可能有多个订单,也可能没有订单。如果我们想找出所有有订单的客户的名字,我们可以使用 INNER JOIN。

SELECT Customers.Name, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

这条语句会返回那些在 Customers 表里有对应 CustomerIDOrders 记录的客户名字。

左外连接(LEFT JOIN 或 LEFT OUTER JOIN)

左外连接会返回所有左边表(本例中的 Customers 表)的记录,并且只返回右边表(本例中的 Orders 表)中匹配的记录。如果右边表没有匹配,则结果集中的右边部分将包含 NULL 值。

例子: 如果我们想列出所有的客户,无论他们是否有订单,可以使用 LEFT JOIN。

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

这条语句会返回 Customers 表中的所有记录,并且对于那些没有订单的客户,OrderID 将是 NULL。

右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN)

右外连接与左外连接相似,但它返回的是右边表的所有记录,并且只返回左边表中匹配的记录。如果左边表没有匹配,则结果集中的左边部分将包含 NULL 值。

例子: 如果我们对所有订单感兴趣,并且想列出每个订单对应的客户,即使有些订单可能是错误条目并且找不到对应的客户,我们可以使用 RIGHT JOIN。

SELECT Customers.Name, Orders.OrderID
FROM Customers
RIGHT JOIN Orders
ON Customers.CustomerID = Orders.CustomerID;

这条语句会返回 Orders 表中的所有记录,并且对于那些没有对应客户的订单,Name 将是 NULL。
 

假设我们有两个表:一个是 Employees 表,记录员工的信息;另一个是 Departments 表,记录部门的信息。

Employees 表
EmployeeIDNameDepartmentID
1Alice2
2Bob1
3Charlie3
4David1
Departments 表
DepartmentIDName
1Sales
2Engineering
3HR

内连接(INNER JOIN)

内连接只返回两个表中匹配的记录。如果 Employees 表中的 DepartmentIDDepartments 表中有对应的 DepartmentID,那么这条记录就会出现在结果集中。

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

结果将是:

NameDepartmentName
AliceEngineering
BobSales
DavidSales
CharlieHR

左外连接(LEFT JOIN)

左外连接会返回左边表中的所有记录,并且只有当右边表中有匹配的记录时才会返回右边表中的数据。如果没有匹配的数据,则右边的数据列显示为 NULL。

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

在这个例子中,因为每一个员工都有对应的部门,所以结果和内连接相同。但如果 Employees 表中有一个员工的 DepartmentID 是不存在于 Departments 表中的,那么这个员工的信息将会在 DepartmentName 列显示为 NULL。

右外连接(RIGHT JOIN)

右外连接则相反,它返回右边表中的所有记录,并且只有当左边表中有匹配的记录时才会返回左边表中的数据。如果没有匹配的数据,则左边的数据列显示为 NULL。

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

如果 Departments 表中有一个部门是没有员工的,那么这个部门的信息将会在 Name 列显示为 NULL。

全外连接(FULL OUTER JOIN)

虽然不是所有数据库系统都支持全外连接,但为了完整性,这里也提一下。全外连接会返回两个表中的所有记录。如果有任何一边没有匹配的数据,则相应的列将显示为 NULL。

SELECT Employees.Name, Departments.Name AS DepartmentName
FROM Employees
FULL OUTER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;

总结来说:

  • INNER JOIN:仅返回两个表中匹配的记录。
  • LEFT JOIN:返回左边表中的所有记录,以及右边表中匹配的记录。
  • RIGHT JOIN:返回右边表中的所有记录,以及左边表中匹配的记录。
  • FULL OUTER JOIN:返回两边表中的所有记录,如果有任何一边没有匹配的数据,则相应的列将显示为 NULL。

http://www.kler.cn/a/375308.html

相关文章:

  • 利用钉钉与金蝶云星空进行付款单自动化集成
  • CSS3新增背景属性(四)
  • HTB:Analytics[WriteUP]
  • qt QFormLayout详解
  • Halcon-模板匹配(WPF)
  • Java 字符流详解
  • sudo apt install 安装位置
  • 音视频入门基础:FLV专题(22)——FFmpeg源码中,获取FLV文件音频信息的实现(中)
  • 【大语言模型】ACL2024论文-05 GenTranslate: 大型语言模型是生成性多语种语音和机器翻译器
  • 基于SSM学生竞赛模拟系统的设计
  • 脉冲当量计算方法
  • 服务器对于企业业务有哪些影响?
  • 无头双向链表模拟实现
  • 数据库->数据库约束
  • nacos快速启动
  • markdown/Latex分子,分母,除号,怎么编辑
  • NET Core的AOP实施方法1 DispatchProxy
  • SAP(PP生产制造)拆解工单业务处理
  • YOLO11改进 | 卷积模块 | 提高网络的灵活性和表征能力的动态卷积【附代码+小白可上手】
  • 基于NVIDIA NIM平台实现盲人过马路的demo(一)
  • LeetCode516:最长回文子序列
  • 从0到1,用Rust轻松制作电子书
  • OpenWrt下安装Mosquitto
  • 在Java中 try catch 会影响性能吗?
  • 轻松部署自己的AI聊天助手LocalGPT并实现无公网IP远程交互
  • 包子凑数(完全背包)