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)

大家都在看

  • 生成随机数的若干种方法

    背景: 创建账户时我们需要配置初始随机密码,使用手机号注册时需要随机验证码,抽奖活动需要随机点名,俄罗斯方块游戏需要随机出形状。这些案例都在说明一个问题,随机数据很重要!而在 Sh…

    Linux 2023年6月6日
    092
  • java分布式(第四章)——Redis

    老套路 1、什么是Redis 2、为什么要用Redis 3、怎么用Redis 4、使用Redis过程中遇到的问题 1、什么是Redis 介绍Redis之前先了解一下Nosql(非关…

    Linux 2023年6月7日
    084
  • Python之元类详解

    一、引子 元类属于Python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也是自圆其说,点到为止,从队元类的控制上来看就破绽百出,逻辑混乱; 二、什么…

    Linux 2023年6月14日
    094
  • 操作系统实战45讲- 02 几行汇编几行C:实现一个最简单的内核

    本节源代码位置https://gitee.com/lmos/cosmos/tree/master/lesson02/HelloOS Hello OS 之前,我们先要搞清楚 Hell…

    Linux 2023年6月7日
    099
  • centos8 安装kudu

    1、安装cmake yum install cmake -y 2、安装python yum install python39 -y 设置默认Python版本 alternative…

    Linux 2023年6月8日
    068
  • Linux的安装和配置

    Linux的安装和网络配置 CentOS7安装教程 https://www.php.cn/centos/472898.html 1.虚拟网络编辑器配置 通过VMware菜单栏,依次…

    Linux 2023年6月11日
    092
  • 安装完Ubuntu启动时自动进入grub命令行模式的解决办法

    1.先使用ls命令,找到Ubuntu的安装在哪个分区: grub>ls 会罗列所有的磁盘分区信息,比方说: (hd0,1),(hd0,5),(hd0,3),(hd0,2) 2…

    Linux 2023年6月13日
    093
  • 如何优雅的处理 accept 出现 EMFILE 的问题

    通常情况下,服务端调用 accept 函数会返回一个新的文件描述符,用于和客户端之间的数据传输 在服务器的开发中,有时会遇到这种情况:当调用 accept 函数接受客户端连接,函数…

    Linux 2023年6月13日
    095
  • Python之pexpect详解

    Pexpect程序主要用于人机对话的模拟,就是那种系统提问,人来回答yes/no,或者账号登陆输入用户名和密码等等的情况。因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现…

    Linux 2023年6月14日
    095
  • redis

    ./redis-cli -a 111 KEYS "key*" | xargs ./redis-cli -a 111 DEL Original: https://…

    Linux 2023年5月28日
    099
  • Java基础系列–01_基础类型

    J2SE、J2ME、J2EE分别指什么?J2SE 基础版,桌面应用。J2ME 微型版,手机开发。(android,ios)J2EE 企业版,所有浏览器访问的应用程序。注意:JDK5…

    Linux 2023年6月7日
    0102
  • 面试题:Java序列化与反序列化

    序列化和反序列化的概念 应用场景? 序列化实现的方式 继承Serializable接口,普通序列化 继承Externalizable接口,强制自定义序列化 serialVersio…

    Linux 2023年6月6日
    0122
  • 巧用 JuiceFS Sync 命令跨云迁移和同步数据

    近年来,云计算已成为主流,企业从自身利益出发,或是不愿意被单一云服务商锁定,或是业务和数据冗余,或是出于成本优化考虑,会尝试将部分或者全部业务从线下机房迁移到云或者从一个云平台迁移…

    Linux 2023年6月14日
    0109
  • 测试代理的墙是否是通的

    curl -v -x 代理ip:端口 目的ip:端口通过代理访问对方wget “http://目的IP:端口” -e use_proxy=yes -e ht…

    Linux 2023年6月14日
    0105
  • 致远 OA 组合 getshell

    测试版本为: 致远 A8-V5 协同管理软件 V6.1SP2 1.获取cookie信息 2….

    Linux 2023年5月28日
    0316
  • 编程入门之字符编码与乱码

    ——”为什么服务器收到的请求或者打开的文本文件有时会乱码?” ——”因为编码不对。” ——”编码的本质是什么?为什么编码…

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