SQL 语句左连接右连接内连接如何使用,区别是什么?

核心概念

连接(JOIN)用于根据两个或多个表中的列之间的关系,从这些表中查询数据。为了更直观地理解,我们假设有两个表:

员工表 (Employees)

employee_id name department_id
1 张三 101
2 李四 102
3 王五 NULL

部门表 (Departments)

department_id department_name
101 技术部
102 销售部
103 市场部

内连接 (INNER JOIN)

定义 :只返回两个表中连接条件匹配的记录。

结果 :两个表的交集部分。

使用场景:当你只想查看在两边表中都有对应信息的记录时。例如,查询所有有部门的员工及其部门信息。

SQL语句

sql 复制代码
SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
INNER JOIN 
    Departments d ON e.department_id = d.department_id;

查询结果

name department_name
张三 技术部
李四 销售部

注意 :员工"王五"的department_id为NULL,在部门表中找不到匹配项,所以没有出现。部门"市场部"在员工表中没有对应的员工,所以也没有出现。

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

定义 :返回左表 (FROM子句中的表) 的所有记录,以及右表中连接条件匹配的记录。如果右表没有匹配的记录,则结果集中右表的部分返回NULL。

结果:左表的全集 + 右表的匹配部分。

使用场景:当你需要左表的所有记录,无论它们在右表中是否有对应项。例如,列出所有员工,并显示他们所在的部门(即使某些员工没有部门)。

SQL语句

sql 复制代码
SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
LEFT JOIN 
    Departments d ON e.department_id = d.department_id;

查询结果

name department_name
张三 技术部
李四 销售部
王五 NULL

注意 :员工"王五"被包含在结果中,但因为他不属于任何部门,所以department_name为NULL。

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

定义 :与左连接相反。返回右表 (JOIN子句中的表) 的所有记录,以及左表中连接条件匹配的记录。如果左表没有匹配的记录,则结果集中左表的部分返回NULL。

结果:右表的全集 + 左表的匹配部分。

使用场景:当你需要右表的所有记录,无论它们在左表中是否有对应项。例如,列出所有部门,并显示部门里的员工(即使某些部门没有员工)。

SQL语句

sql 复制代码
SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
RIGHT JOIN 
    Departments d ON e.department_id = d.department_id;

查询结果

name department_name
张三 技术部
李四 销售部
NULL 市场部

注意 :部门"市场部"被包含在结果中,但因为该部门没有员工,所以name为NULL。

全外连接 (FULL OUTER JOIN)

定义:返回左表和右表中的所有记录。当某一行在另一个表中没有匹配行时,另一个表的部分将返回NULL。如果表之间有匹配的行,则返回匹配行。

结果 :两个表的并集

使用场景:当你需要看到两个表的所有数据,无论它们是否匹配。例如,生成一个包含所有员工和所有部门的完整列表。

SQL语句

vbnet 复制代码
-- 注意:MySQL不支持FULL OUTER JOIN,但可用LEFT JOIN和RIGHT JOIN的UNION来实现
SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
LEFT JOIN 
    Departments d ON e.department_id = d.department_id

UNION

SELECT 
    e.name,
    d.department_name
FROM 
    Employees e
RIGHT JOIN 
    Departments d ON e.department_id = d.department_id;

查询结果

name department_name
张三 技术部
李四 销售部
王五 NULL
NULL 市场部

注意:这个结果包含了左连接和右连接的所有记录。

总结与区别

连接类型 关键字 描述 结果集(基于示例)
内连接 INNER JOIN 只返回两个表匹配的记录。 张三(技术部), 李四(销售部)
左连接 LEFT JOIN 返回左表全部 记录 + 右表匹配的记录。 张三(技术部), 李四(销售部), 王五(NULL)
右连接 RIGHT JOIN 返回右表全部 记录 + 左表匹配的记录。 张三(技术部), 李四(销售部), NULL(市场部)
全外连接 FULL OUTER JOIN 返回左右两表全部记录。 张三(技术部), 李四(销售部), 王五(NULL), NULL(市场部)

记忆技巧

可以借助韦恩图 (Venn Diagram) 来记忆:

相关推荐
ps酷教程19 小时前
Jackson 解决没有无参构造函数的反序列化问题
java
NiceCloud喜云19 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
为思念酝酿的痛19 小时前
POSIX信号量
linux·运维·服务器·后端
小羊在睡觉19 小时前
力扣84. 柱状图中最大的矩形
后端·算法·leetcode·golang·go
_日拱一卒20 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
swipe20 小时前
Neo4j + Graph RAG 医疗知识图谱工程实践:患者教育问答真正需要的是“关系可追溯”
后端·langchain·llm
隔窗听雨眠20 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
智慧物业老杨21 小时前
智慧物业合同周期管理系统:从风险预警到智能交接的全流程数智化落地方案
java·人工智能·python
源码宝21 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
JAVA社区21 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展