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 的表关联模型如下:

SQL中连接(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 的表关联模型如下:

SQL中连接(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)子句介绍

说明:上图中的绿色部分,为两表的右关联结果。
————————————————
原文链接:https://blog.csdn.net/liitdar/article/details/80817087

Original: https://www.cnblogs.com/zhongxiaochuan/p/16115242.html
Author: 钟小川
Title: SQL中连接(JOIN)子句介绍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607030/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 搭建k8s

    一、设置基本环境(需要开启超级用户权限) 安装控制selinux的命令: apt-get install -y selinux-utils 禁止selinux: setenforc…

    Linux 2023年5月27日
    076
  • Redis 集群

    三高架构:并发,性能,可用 主从复制 主从复制:将 master 中的数据即时、有效的复制到 slave 中 特征:一个 master 可以拥有多个 slave,一个 slave …

    Linux 2023年5月28日
    098
  • Linux 中 图片的产生与查看

    使用场景 当在 Linux 的控制台想要显示一张图片,使用matplotlib.plt.plot() 和matplotlib.plt.show() 会报错。此时可以曲线救国,不直接…

    Linux 2023年6月7日
    066
  • Error: Unable to access jarfile 运行jar包报错

    1、可能是执行路径有误 错误 修改后,需使用绝对路径 2、决解1后,还报以下错误,就是你的安装的JDK与jar包中的JDK不是同一版本。idea中有自带的JDK与我们安装的JDK版…

    Linux 2023年6月14日
    0908
  • Linux关于防火墙的命令

    Linux关于防火墙的命令 一、red hat/CentOs7关闭防火墙的命令 查看防火墙状态 systemctl status firewalld service iptable…

    Linux 2023年6月11日
    083
  • linux系统基于新磁盘和同磁盘其他分区的目录扩容

    linux系统基于新磁盘和同磁盘其他分区的目录扩容 (1) 基于新建磁盘目录扩容 例如:新增1 块3G 的磁盘sdb ,扩容/tmp 至13G pvcreate /dev/sdb1…

    Linux 2023年6月13日
    093
  • SUPERVISOR监控tomcat配置文件

    下方为Supervisor管理tomcat的配置,多注意红色位置路径修改: [program:tomcat] ; 管理的子程序名字,要和项目有关联,不能乱写 command=/us…

    Linux 2023年6月6日
    082
  • Question08-查询没学过”张三”老师授课的同学的信息

    * SELECT * FROM Student WHERE SID NOT IN ( SELECT DISTINCT Student.SID FROM Student , SC ,…

    Linux 2023年6月7日
    091
  • C++类结构体与json相互转换

    1. 背景与需求 之前写C#的时候,解析json字符串一般使用的是开源的类库Newtonsoft.Json,方法十分简洁,比如: class Project { public st…

    Linux 2023年6月8日
    097
  • python学习

    目录: 1、课程推荐以及书籍推荐 2、学习记录 2.1:无 1. 实践过程 廖雪峰的官方网站 2. 学习记录 2.1 无: posted @2022-02-12 19:44 风御之…

    Linux 2023年6月13日
    083
  • 【操作系统真象还原】04 编写MBR分区(二)和显卡对话

    前言 通过BIOS提供的中断,我们的MBR程序在屏幕上输出了绿油油的 Hi from MBR!。但只有在 实模式 …

    Linux 2023年5月27日
    0128
  • 搭建Nginx七层反向代理

    基于https://www.cnblogs.com/Dfengshuo/p/11911406.html这个基础上,在来补充下七层代理的配置方式。简单理解下四层和七层协议负载的区别吧…

    Linux 2023年6月8日
    0107
  • 蓝桥杯真题:纯质数

    蓝桥杯 2021 年国赛真题《纯质数》的 Python 解法。 蓝桥杯 2021 年国赛真题:纯质数。 题目大意 输出 1 到 20210605 之间(包括两端)的”纯…

    Linux 2023年6月13日
    095
  • 国产银河麒麟Kylin V10操作系统-如何把常用文件夹加入左侧侧边栏(类似windows文件资源管理器中的收藏夹)

    国产银河麒麟Kylin V10操作系统-如何把常用文件夹加入左侧侧边栏(类似windows文件资源管理器中的收藏夹) 第一步:确保侧边栏正确显示。 打开”我的电脑&#8…

    Linux 2023年6月14日
    0147
  • USB转多串口产品设计

    在部分应用场合下需要为计算机或其他主机扩展多个串口,常见的扩展方式有USB转多串、PCI/PCIe转多串、蓝牙和以太网等网络转多串口。现在大多数台式计算机和笔记本电脑出于轻型化需要…

    Linux 2023年6月7日
    081
  • docker 启动mysql

    创建配置文件 mysqld.cnf Original: https://www.cnblogs.com/outsrkem/p/15704614.htmlAuthor: Outsrk…

    Linux 2023年6月6日
    061
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球