一次性讲清楚INNER JOIN、LEFT JOIN、RIGHT JOIN的区别和用法详解

INNER JOIN、LEFT JOIN、RIGHT JOIN的区别
接下来通过例子帮助理解他们之间的区别

首先,我们创建示例数据库和表。同时也要明确一个概念:A INNER/LEFT/RIGHT JOIN B操作中,A表被称为左表,B表被称为右表。

创建示例数据库school,在数据库school下创建两张示例表:student、punishment。
创建学生基本信息表student,如下:


DROP TABLE IF EXISTS `punishment`;
CREATE TABLE `punishment` (
`student_id` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`punishment` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`student_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '学生违纪处罚记录表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of punishment
-- ----------------------------
INSERT INTO `punishment` VALUES ('201400002', '张三', '大过');
INSERT INTO `punishment` VALUES ('201400006', '杨智', '留校察看');
INSERT INTO `punishment` VALUES ('201400009', '陈子丹', '小过');

创建学生违纪处罚记录表punishment,如下:


DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`student_id` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`age` int(2) NULL DEFAULT NULL,
`class` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`student_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '学生基本信息表' ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('201400001', '王玉', 18, '一班', '山东省枣庄市');
INSERT INTO `student` VALUES ('201400002', '张三', 23, '二班', '江苏省南京市');
INSERT INTO `student` VALUES ('201400003', '李四', 25, '三班', '江苏省南京市');
INSERT INTO `student` VALUES ('201400004', '顾丽丽', 32, '一班', '江苏省南京市');
INSERT INTO `student` VALUES ('201400005', '邵芳芳', 29, '四班', '江苏省南京市');
INSERT INTO `student` VALUES ('201400006', '杨智', 30, '一班', '江苏省南京市');

 

 


注意,为了测试这三种JOIN操作的不同,punishment表中2014000009这个学生ID在学生基本信息表中是不存在的,这个相当于异常数据。

示例信息已经创建完毕,那么我们来看看具体的操作有什么区别。

INNER JOIN操作
首先,我们看看INNER JOIN操作,我们写个SQL语句,查询学生表中哪些学生受过处分:

分析一下上面SQL语句的执行结果,我们的查询条件是STU.student_id=P.student_id,即学生表和处分表都有的student_id的结果集,很明显,2014000002、2014000006在两表中都有

所以我们可以得出INNER JOIN操作的作用是:INNER JOIN根据ON字段标识出来的条件,查出关联的几张表中,符合该条件的记录,合并成一个查询结果集。

LEFT JOIN操作

分析一下执行结果,LEFT JOIN操作中,比如A LEFT JOIN B,会输出 左表A 中所有的数据,同时将符合 ON条件 的 右表B 中搜索出来的结果合并到 左表A表中,如果A表中存在而在B表中不存在,则结果集中会将查询的B表字段值(如此处的P.punishment字段)设置为NULL。

所以,LEFT JOIN的作用是:LEFT JOIN 从 右表B 中将符合ON条件的结果查询出来,合并到A表中,再作为一个结果集输出。

RIGHT JOIN操作

 分析过LEFT JOIN了,RIGHT JOIN相信你也已经明白了,“A LEFT JOIN B ON ……”是将符合ON条件的B表搜索结果合并到A表中,作为一个结果集输出。而RIGHT JOIN刚好相反, “A RIGHT JOIN B ON ……”是将符合ON条件的A表搜索结果合并到B表中,作为一个结果集输出:

总结
A INNER JOIN B ON……:内联操作,将符合ON条件的A表和B表结果均搜索出来,然后合并为一个结果集。
A LEFT JOIN B ON……:左联操作,左联顾名思义是,将符合ON条件的B表结果搜索出来,然后左联到A表上,然后将合并后的A表输出。
A RIGHT JOIN B ON……:右联操作,右联顾名思义是,将符合ON条件的A表结果搜索出来,然后右联到B表上,然后将合并后的B表输出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/878785.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多项式全家桶【长期更新】

目录多项式定义(表达式)暴力全家桶加法乘法余数除法求导和积分求逆开根求对数求指数求三角函数快速傅里叶变换FFT,快速多项式前置内容FFT核心思路具体做法常数优化:非递归FFT 多项式 定义(表达式) 定义一个 \(n\) 次的多项式为: \[F(x) = \sum^n_{i=0}f_ix^i \]注意 :\(…

第3章 进程 - RTOS 进程切换

1 参考文档6. 线程的定义与线程切换的实现 — [野火]RT-Thread内核实现与应用开发实战——基于STM32 文档 RTOS的线程,是一个独立的、无限循环且不能返回的函数。2 定义线程栈 RTOS中存在多线程和线程切换,没有进程的概念,也不需要进程的概念; 每个线程都有线程栈,通常是预…

【vscode配置】一种基于Beta版UTF-8解决VSCode中C/C++/Python等的中文乱码问题的简便方法

在VSCode或其他编码场景下输入输出中文时会出现乱码,常用的解决方式是通过GBK编码重新打开或保存文件后再使用 但又是来回切换保存会导致代码中的中文变成乱码难以恢复 而且个人觉得来回切换很麻烦 下面给出一种了解到的解决方法:控制面板——时钟和区域——区域——管理——…

Graphviz-画数据结构图的利器

1.Win系统上的安装 安装Graphviz的方法有很多,以下是手动安装的方式: 1.访问 https://graphviz.org/download/,选择你想要下载的版本,手动安装选择ZIP安装包;2.解压下载的zip压缩包到你选择的文件目录,例如:D:\Graphviz-12.2.1-win64; 3.将Graphviz的安装目录(如:D:\…

4G优先级切换

本文来自博客园,作者:{IceSparks},转载请注明原文链接:https://www.cnblogs.com/IceSparks/p/18698508

4G与5GSIB对比

本文来自博客园,作者:{IceSparks},转载请注明原文链接:https://www.cnblogs.com/IceSparks/p/18698503

AI赋能软件测试:未来已来,你准备好了吗?

ps:文末有福利领取哦引言 在数字化转型的浪潮中,软件测试作为保障产品质量的关键环节,正面临着前所未有的挑战。 传统的测试方法已难以满足快速迭代和复杂场景的需求,而人工智能(AI)的引入,则为软件测试带来了革命性的变化。 本文将从现状、优势、挑战及未来趋势四个方面…

C语言 输出回文数

回文数,既把数值的每个数 颠倒输出(从右往左输出),再合起来的数如果和原来的值相等 例:输出0 至 1993 的回文数#include <stdio.h>int main() { int i ,x ,d ,a ; for(i=0;i<=1993;i++) {a = i; x = 0; while (a != 0) { d = a%10; //每次都取a值的最后一位 x = …

洛谷 P3842 [TJOI2007] 线段 题解

题目大意 原题链接 给你一个大小为 \(n \times n\) 的矩阵,上面有 \(n\) 条线段(一行一条)。你只能向右,向下,向左走。每一条线段都必须完整的经过。请问从 \((1,1)\) 到 \((n,n)\) 最短路径长度是多少? 解法 这道题可以使用最短路或者DP来做。我觉得DP本题更简单一点所以我…

数据降维技术研究:Karhunen-Love展开与快速傅里叶变换的理论基础及应用

在现代科学计算和数据分析领域,数据降维与压缩技术对于处理高维数据具有重要意义。本文主要探讨两种基础而重要的数学工具:Karhunen-Love展开(KLE)和快速傅里叶变换(FFT)。通过分析这两种方法的理论基础和应用特点,阐述它们在数据降维中的优势和适用场景。 Karhunen-Lov…

一个Python GC的小Bug

这个代码是在看了“码农高天”的视频照模仿的。虽然 GC 能完成大部分内存管理的工作,但是基于性能计数器的GC确实存在小 Bug,这一点还是需要通过del和gc.collect手动管理。 from typing import Optionalclass Object:def __init__(self, name: str) -> None:self.obj: Opt…