SQL中连接(JOIN)子句介绍
2021/12/28 19:07:14
本文主要是介绍SQL中连接(JOIN)子句介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文主要介绍 SQL(Structured Query Language)中连接(JOIN)子句的相关知识,同时通过用法示例介绍连接的常见用法。
说明:本文的用法示例是面向 MySQL 数据库的。
1 概述
SQL 中 JOIN 子句用于把来自两个或多个表的行结合起来。
在实际的数据库应用中,经常需要从多个数据表中读取数据,这时就可以使用 SQL 语句中的连接(JOIN)子句,在两个或多个数据表中查询数据。
JOIN 的用法按照功能划分,可分为如下三类:
INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录;
LEFT JOIN(左连接):获取左表中的所有记录,即使在右表没有对应匹配的记录;
RIGHT JOIN(右连接):与 LEFT JOIN 相反,用于获取右表中的所有记录,即使左表没有对应匹配的记录。
2 常见用法
现提供两个表(表信息如下),本文后面的用法示例,均是对这两个表进行操作的。
mysql> select * from roles; +---------+------------+----------+ | role_id | occupation | camp | +---------+------------+----------+ | 1 | warrior | alliance | | 2 | paladin | alliance | | 3 | rogue | Horde | +---------+------------+----------+ 3 rows in set (0.01 sec) mysql> mysql> select * from mount_info; +----------+------------+---------+ | mount_id | mount_name | role_id | +----------+------------+---------+ | 1 | horse | 1 | | 2 | sheep | 1 | | 3 | sheep | 4 | +----------+------------+---------+ 3 rows in set (0.01 sec) mysql>
2.1 INNER JOIN
下面通过一个示例,介绍 INNER JOIN 的用法。
使用 INNER JOIN(也可以省略 INNER 、直接使用 JOIN)来连接上面两张表,匹配 mount_info 和 role_id 中字段 role_id 相同的内容,相关命令如下:
mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a INNER JOIN mount_info b ON a.role_id = b.role_id; +---------+------------+----------+------------+ | role_id | occupation | camp | mount_name | +---------+------------+----------+------------+ | 1 | warrior | alliance | horse | | 1 | warrior | alliance | sheep | +---------+------------+----------+------------+ 2 rows in set (0.01 sec) mysql>
上述 SQL 语句与下列语句等价:
mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a, mount_info b WHERE a.role_id = b.role_id; +---------+------------+----------+------------+ | role_id | occupation | camp | mount_name | +---------+------------+----------+------------+ | 1 | warrior | alliance | horse | | 1 | warrior | alliance | sheep | +---------+------------+----------+------------+ 2 rows in set (0.01 sec) mysql>
INNER JOIN 的表关联模型如下:
说明:上图中的绿色部分,为两表的内关联结果。
2.2 LEFT JOIN
下面通过一个示例,介绍 LEFT JOIN 的用法。
LEFT JOIN 与 INNER JOIN 有所不同,LEFT JOIN 会读取左侧数据表的全部数据,即使右侧表中无对应数据。
使用 LEFT JOIN来连接上面两张表,以 roles 为左侧表、mount_info 为右侧表,相关命令如下:
mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a LEFT JOIN mount_info b ON a.role_id = b.role_id; +---------+------------+----------+------------+ | role_id | occupation | camp | mount_name | +---------+------------+----------+------------+ | 1 | warrior | alliance | horse | | 1 | warrior | alliance | sheep | | 2 | paladin | alliance | NULL | | 3 | rogue | Horde | NULL | +---------+------------+----------+------------+ 4 rows in set (0.01 sec) mysql>
通过上述结果能够看到,上面执行的 SQL 语句读取左边的数据表 roles 的所有的(SELECT)字段数据,即使在右侧表 mount_info 中没有对应的 role_id 字段值。
LEFT JOIN 的表关联模型如下:
说明:上图中的绿色部分,为两表的左关联结果。
2.3 RIGHT JOIN
下面通过一个示例,介绍 RIGHT JOIN 的用法。
RIGHT JOIN 会读取右侧数据表的全部数据,即便左侧表无对应数据。
使用 LEFT JOIN 来连接上面两张表,以 roles 为左侧表、mount_info 为右侧表,相关命令如下:
mysql> SELECT a.role_id, a.occupation, a.camp, b.mount_name FROM roles a RIGHT JOIN mount_info b ON a.role_id = b.role_id; +---------+------------+----------+------------+ | role_id | occupation | camp | mount_name | +---------+------------+----------+------------+ | 1 | warrior | alliance | horse | | 1 | warrior | alliance | sheep | | NULL | NULL | NULL | sheep | +---------+------------+----------+------------+ 3 rows in set (0.01 sec) mysql>
通过上述结果能够看到,上面执行的 SQL 语句读取右侧的数据表 mount_info 的所有的(SELECT)字段数据,即使在左侧表 roles 中没有对应的 role_id 字段值。
RIGHT JOIN 的表关联模型如下:
说明:上图中的绿色部分,为两表的右关联结果。
这篇关于SQL中连接(JOIN)子句介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?