数据库
mysql
MySQL逻辑架构
mysql索引
mysql性能分析(explain)
mysql事务
MVCC
SQL JOINS
本文档使用 MrDoc 发布
-
+
首页
SQL JOINS
 # SQL JOINS 详解 SQL JOIN 用于将来自两个或多个表的行组合起来。通过 JOIN,可以根据相关列将表之间的数据联系起来,并返回一个组合结果集。以下是常见 JOIN 类型的详细介绍及其示例。 ## 1. INNER JOIN(内连接) **定义**: 只返回两个表中满足 JOIN 条件的行。如果某表中没有匹配行,则该行不会出现在结果集中。 **图示**: 只有两表记录存在交集的部分。 **示例**: 假设有两张表: **学生表(Students)**: | 学号 | 姓名 | |--------|------| | S001 | 张三 | | S002 | 李四 | | S003 | 王五 | **成绩表(Scores)**: | 学号 | 科目 | 分数 | |--------|--------|------| | S001 | 数学 | 85 | | S001 | 语文 | 90 | | S002 | 数学 | 78 | **SQL 查询**: ``` SELECT Students.学号, Students.姓名, Scores.科目, Scores.分数 FROM Students INNER JOIN Scores ON Students.学号 = Scores.学号; ``` **结果**: | 学号 | 姓名 | 科目 | 分数 | |------|----|----|----| | S001 | 张三 | 数学 | 85 | | S001 | 张三 | 语文 | 90 | | S002 | 李四 | 数学 | 78 | ## 2. LEFT JOIN(左连接) **定义**: 返回左表中的所有行,以及右表中满足条件的行。如果右表中没有匹配行,结果集中对应右表的列为 NULL。 **图示**: 返回左表的全部记录以及右表中匹配的部分。 **示例**: 使用上述相同的两张表。 ** SQL 查询**: ``` SELECT Students.学号, Students.姓名, Scores.科目, Scores.分数 FROM Students LEFT JOIN Scores ON Students.学号 = Scores.学号; ``` **结果**: ``` 学号 姓名 科目 分数 S001 张三 数学 85 S001 张三 语文 90 S002 李四 数学 78 S003 王五 NULL NULL ``` ## 3. RIGHT JOIN(右连接) **定义**: 返回右表中的所有行,以及左表中满足条件的行。如果左表中没有匹配行,结果集中对应左表的列为 NULL。 **图示**: 返回右表的全部记录以及左表中匹配的部分。 **示例**: 使用上述相同的两张表。 **SQL 查询**: ``` SELECT Students.学号, Students.姓名, Scores.科目, Scores.分数 FROM Students RIGHT JOIN Scores ON Students.学号 = Scores.学号; ``` **结果**: | 学号 | 姓名 | 科目 | 分数 | |------|----|----|----| | S001 | 张三 | 数学 | 85 | | S001 | 张三 | 语文 | 90 | | S002 | 李四 | 数学 | 78 | ## 4. FULL OUTER JOIN(全外连接) **定义**: 返回左右两表中所有行。如果两表中没有匹配行,结果集中对应侧的列为 NULL。 **图示**: 返回左右表中所有记录,包括交集和非交集部分。 **示例**: 使用上述相同的两张表。 **SQL 查询**: ``` SELECT Students.学号, Students.姓名, Scores.科目, Scores.分数 FROM Students FULL OUTER JOIN Scores ON Students.学号 = Scores.学号; ``` **结果**: | 学号 | 姓名 | 科目 | 分数 | |------|----|------|------| | S001 | 张三 | 数学 | 85 | | S001 | 张三 | 语文 | 90 | | S002 | 李四 | 数学 | 78 | | S003 | 王五 | NULL | NULL | ## 5. CROSS JOIN(交叉连接) **定义**: 返回两个表的笛卡尔积,每行和每列的组合都会出现一次。 **图示**: 返回左表和右表所有可能的组合关系,没有任何条件限制。 **示例**: 使用上述相同的两张表。 **SQL 查询**: ``` SELECT Students.学号, Students.姓名, Scores.科目, Scores.分数 FROM Students CROSS JOIN Scores; ``` **结果**: | 学号 | 姓名 | 科目 | 分数 | |------|----|----|----| | S001 | 张三 | 数学 | 85 | | S001 | 张三 | 语文 | 90 | | S002 | 李四 | 数学 | 78 | | S002 | 李四 | 语文 | 90 | | S003 | 王五 | 数学 | 78 | | S003 | 王五 | 语文 | 90 | ## 6. SELF JOIN(自连接) 定义: 一张表与其自身连接的操作,可以通过别名来区分同一表的不同实例。 示例: 假设有一个员工表,包含员工编号、姓名和主管编号。 员工表(Employees): | 编号 | 姓名 | 主管编号 | |------|----|------| | E001 | 张三 | E002 | | E002 | 李四 | NULL | | E003 | 王五 | E002 | SQL 查询: ``` SELECT E1.姓名 AS 员工, E2.姓名 AS 主管 FROM Employees E1 JOIN Employees E2 ON E1.主管编号 = E2.编号; ``` 结果: | 员工 | 主管 | |----|----| | 张三 | 李四 | | 王五 | 李四 | ## 总结 | JOIN 类型 | 返回结果 | |-----------------|-----------------------------| | INNER JOIN | 只返回满足条件的行 | | LEFT JOIN | 返回左表的所有行,右表的匹配行(无匹配则为 NULL) | | RIGHT JOIN | 返回右表的所有行,左表的匹配行(无匹配则为 NULL) | | FULL OUTER JOIN | 返回左右表的所有行,无论是否匹配 | | CROSS JOIN | 返回左右表的笛卡尔积,所有可能的行组合 | | SELF JOIN | 同一表与自身连接,通过别名区分不同的表实例 |
admin
2025年2月22日 11:12
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Rancher
Jenkins
ADMIN-UI
VBEN-ADMIN-UI
RUST-FS
MinIO
mindoc
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码