当前位置: 首页 > news >正文

【MySQL】九、表的内外连接

文章目录

  • 前言
  • Ⅰ. 内连接
      • 案例:显示SMITH的名字和部门名称
  • Ⅱ. 外连接
    • 1、左外连接
      • 案例:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来
    • 2、右外连接
      • 案例:对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来
    • 练习:列出部门名称和这些部门的员工信息,同时列出没有员工的部门

在这里插入图片描述

前言

​ 在 mysql 中,内连接(inner join)和外连接(left jonright joinfull join)是用于将多个表中的数据进行关联的操作。

​ 它们之间的区别其实很简单,内连接只返回满足连接条件的行,而 外连接则可以返回不满足连接条件的行,并且根据不同的外连接类型,返回不同的结果集。

Ⅰ. 内连接

​ 内连接(inner join)实际上就 等价于利用 where 子句对两种表形成的笛卡儿积进行筛选,也就是说,之前我们在学复合查询的时候,用的都是内连接,这也是在开发过程中使用的最多的连接查询。

​ 内连接是通过匹配两个表之间的共同值来返回结果集。只有在两个表中都存在匹配的行时,才会返回这些行。内连接只返回满足连接条件的行,其他不满足条件的行将被排除在结果集之外

​ 其语法如下所示:

select 字段 from1 inner join2 on 连接条件 [and 其他条件];

​ 下面不废话,直接通过案例来学习!

案例:显示SMITH的名字和部门名称

​ 我们先用之前的 where 子句对两张表进行笛卡尔积:

mysql> select ename, dname from emp, dept where emp.deptno<=>dept.deptno and ename<=>'SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

​ 接着我们再用内连接的语法来查询一下:

mysql> select ename, dname from emp inner join dept on emp.deptno<=>dept.deptno and ename<=>'SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

​ 可以看到效果其实是一样的,只不过其实我们 更推荐使用内连接的语法,因为这样子的话可读性会提高,可以让 where 子句去专门筛选条件,而让内连接的工作交给 inner join 语法来完成!

​ 比如说下面这样子,将筛选名字的工作交给 where 来解决,而内连接还是用 inner join 语法来解决,达到直观的分离作用!

mysql> select ename, dname from emp inner join dept on emp.deptno<=>dept.deptno where ename<=>'SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

Ⅱ. 外连接

​ 外连接(left jonright joinfull join)则允许返回不满足连接条件的行。外连接根据连接条件从一个表中选择所有的行,并从另一个表中选择满足条件的行。如果在另一个表中没有匹配的行,则返回 NULL 值。

​ 下面我们先给出一个案例表,用于待会测试左外连接和右外连接的区别的:

-- 建两张表
create table stu (id int, name varchar(30)); -- 学生表
insert into stu values(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');create table exam (id int, grade int); -- 成绩表
insert into exam values(1, 56),(2,76),(11, 8);

1、左外连接

​ 左外连接(left join)返回左表中的所有行,以及右表中满足连接条件的行。如果在右表中没有匹配的行,则返回 NULL 值。简单地说,左侧的表完全显示我们就说是左外连接

​ 其语法如下所示:

select 字段名 from 表名1 left join 表名2 on 连接条件;

​ 可以看到其实就是将内连接的 inner 改成了 left 以及下面右外连接的 right 罢了!

​ 其实我们也可以不加 left 或者 right,这就变成了全外连接(full join),不过我们这里就不介绍全外连接了,因为比较简单,懂了左外连接和右外连接自然就明白全外连接了!

案例:查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

​ 因为学生的个人信息和成绩分别在两张表中,那么肯定就需要进行连接,而因为题目要求如果没有成绩,依然要显示个人信息,那么使用的就是外连接,就不会说没有成绩,然后个人信息也没了!

​ 这里我们选用左连接来做测试,其中个人信息表肯定是左表,而成绩表就作为右表:

mysql> select stu.id, name, grade from stu left join exam on stu.id<=>exam.id;
+------+------+-------+
| id   | name | grade |
+------+------+-------+
|    1 | jack |    56 |
|    2 | tom  |    76 |
|    3 | kity |  NULL |
|    4 | nono |  NULL |
+------+------+-------+
4 rows in set (0.00 sec)

​ 结果是符合预期的,如果不存在成绩,可能是因为没去考试,但是个人信息还是显示出来了!

2、右外连接

​ 右外连接(right join)则返回右表中的所有行,以及左表中满足连接条件的行。如果在左表中没有匹配的行,则返回 NULL 值。简单地说,右侧的表完全显示我们就说是右外连接

​ 其实我们也可以不用右外连接的,因为可以使用左外连接,然后将两个表的顺序一换,其实就是右外连接了,但是 mysql 还是提供了右外连接的语法,那么我们还是了解一下!

​ 其语法如下所示:

select 字段名 from 表名1 right join 表名2 on 连接条件;

案例:对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来

​ 因为这里提到成绩都要显示出来,那么就是用 stu 表去 right join stu 表,下面我们用右外连接来测试一下:

mysql> select stu.id, name, grade from stu right join exam on stu.id<=>exam.id;
+------+------+-------+
| id   | name | grade |
+------+------+-------+
|    1 | jack |    56 |
|    2 | tom  |    76 |
| NULL | NULL |     8 |
+------+------+-------+
3 rows in set (0.00 sec)

练习:列出部门名称和这些部门的员工信息,同时列出没有员工的部门

​ 题目说到同时列出没有员工的部门,也就是说,部门表是一定要显示出来信息的,但是员工就不需要!

​ 下面我们分别用左右外连接来做一下这个练习:

-- 左外连接
mysql> select dept.dname, emp.* from dept left join emp on dept.deptno<=>emp.deptno;
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| dname      | empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| RESEARCH   | 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| SALES      | 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| SALES      | 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| RESEARCH   | 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| SALES      | 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| SALES      | 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| ACCOUNTING | 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| RESEARCH   | 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| ACCOUNTING | 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| SALES      | 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| RESEARCH   | 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| SALES      | 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| RESEARCH   | 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| ACCOUNTING | 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
| OPERATIONS |   NULL | NULL   | NULL      | NULL | NULL                |    NULL |    NULL |   NULL |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
15 rows in set (0.00 sec)-- 右外连接
mysql> select dept.dname, emp.* from emp right join dept on dept.deptno<=>emp.deptno;
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| dname      | empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| RESEARCH   | 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| SALES      | 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| SALES      | 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| RESEARCH   | 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| SALES      | 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| SALES      | 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| ACCOUNTING | 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| RESEARCH   | 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| ACCOUNTING | 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| SALES      | 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| RESEARCH   | 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| SALES      | 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| RESEARCH   | 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| ACCOUNTING | 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
| OPERATIONS |   NULL | NULL   | NULL      | NULL | NULL                |    NULL |    NULL |   NULL |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
15 rows in set (0.00 sec)

​ 可以看到 OPERATIONS 部门就没有员工!

在这里插入图片描述

相关文章:

【MySQL】九、表的内外连接

文章目录 前言Ⅰ. 内连接案例&#xff1a;显示SMITH的名字和部门名称 Ⅱ. 外连接1、左外连接案例&#xff1a;查询所有学生的成绩&#xff0c;如果这个学生没有成绩&#xff0c;也要将学生的个人信息显示出来 2、右外连接案例&#xff1a;对stu表和exam表联合查询&#xff0c;把…...

芯片详细讲解,从而区分CPU、MPU、DSP、GPU、FPGA、MCU、SOC、ECU

目录 芯片的概念结构 芯片的派系划分 通用芯片&#xff08;CPU&#xff0c;MPU&#xff0c;GPU&#xff0c;DSP&#xff09; 定制芯片&#xff08;FPGA&#xff0c;ASIC&#xff09; 芯片之上的集成&#xff08;MCU&#xff0c;SOC&#xff0c;ECU&#xff09; 软硬件的匹…...

halcon三维点云数据处理(十)locate_cylinder_3d

目录 一、locate_cylinder_3d例程代码二、gen_binocular_rectification_map函数三、binocular_disparity函数四、自定义函数select_best_candidates五、自定义函数remove_shadowed_regions 一、locate_cylinder_3d例程代码 1、读取或者创建3D形状模型&#xff0c; 2、根据双目…...

vue(2,3), react (16及以上)开发者工具资源

在前端开发的广阔领域中&#xff0c;Vue.js 和 React.js 作为两大主流框架&#xff0c;各自拥有庞大的用户群体和丰富的生态系统。为了帮助开发者更高效地进行调试和开发&#xff0c;Vue Devtools 和 React 开发者工具应运而生&#xff0c;成为这两个框架不可或缺的辅助工具。本…...

2025年华为OD上机考试真题(Java)——整数对最小和

题目&#xff1a; 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&#xff0c;并对取出的所有元素求和&#xff0c;计算和的最小值。 注意&#xff1a;两对元素如果对应…...

进程间通信——网络通信——UDP

进程间通信&#xff08;分类&#xff09;&#xff1a;网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型&#xff1a;&#xff08;理论模型&#xff09; 应用层 : 要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等 表示层 : 数…...

【我的 PWN 学习手札】IO_FILE 之 FSOP

FSOP&#xff1a;File Stream Oriented Programming 通过劫持 _IO_list_all 指向伪造的 _IO_FILE_plus&#xff0c;进而调用fake IO_FILE 结构体对象中被伪造的vtable指向的恶意函数。 目录 前言 一、glibc-exit函数浅析 二、FSOP 三、Largebin attack FSOP &#xff08;…...

新兴的开源 AI Agent 智能体全景技术栈

新兴的开源 AI Agent 智能体全景技术栈 LLMs&#xff1a;开源大模型嵌入模型&#xff1a;开源嵌入模型模型的访问和部署&#xff1a;Ollama数据存储和检索&#xff1a;PostgreSQL, pgvector 和 pgai后端&#xff1a;FastAPI前端&#xff1a;NextJS缺失的一环&#xff1a;评估和…...

统计学习方法(第二版) 概率分布学习

本文主要介绍机器学习的概率分布&#xff0c;帮助后续的理解。 定义直接从书上搬的想自己写&#xff0c;但没有定义准确&#xff0c;还浪费事件&#xff0c;作为个人笔记&#xff0c;遇到速查。 目录 一、二点分布&#xff08;0-1分布、伯努利分布&#xff09; 二、二项分布…...

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向&#xff0c;有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念&#xff1a; Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio&#xff0c;區別是前者是cocos2djs專用的開發工具&#xff0c;後者則是coco…...

【ROS2】RViz2加载URDF模型文件

1、RViz2加载URDF模型文件 1)运行RViz2 rviz22)添加组件:RobotModel 3)选择通过文件添加 4)选择URDF文件,此时会报错,需要修改Fixed Frame为map即可 5)因为没有坐标转换,依然会报错,下面尝试解决 2、运行坐标转换节点 1)运行ROS节点:robot_state_publishe...

Unity导入特效,混合模式无效问题

检查spine导出设置与Unity导入设置是否一致 检查Blend Mode Materials是否勾选 检查是否使用导入时产生的对应混合模式的材质&#xff0c;混合模式不适用默认材质 这里选导入时生成的材质...

el-table自定义按钮控制扩展expand

需求&#xff1a;自定义按钮实现表格扩展内容的展开和收起&#xff0c;实现如下&#xff1a; 将type“expand”的表格列的宽度设置为width"1"&#xff0c;让该操作列不展示出来&#xff0c;然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…...

opencv CV_TM_SQDIFF未定义标识符

opencv CV_TM_SQDIFF未定义标识符 opencv4部分命名发生变换&#xff0c;将CV_WINDOW_AUTOSIZE改为WINDOW_AUTOSIZE&#xff1b;CV_TM_SQDIFF_NORMED改为TM_SQDIFF_NORMED。...

2024acl论文体悟

总结分析归纳 模型架构与训练方法&#xff1a;一些论文关注于改进大语言模型的架构和训练方法&#xff0c;以提高其性能和效率。例如&#xff0c;“Quantized Side Tuning: Fast and Memory-Efficient Tuning of Quantized Large Language Models”提出了一种量化侧调优方法&a…...

【Git原理与使用】版本回退reset 详细介绍、撤销修改、删除文件

目录 一、版本回退 reset 1.1 指令&#xff1a; 1.2 参数说明&#xff1a; 1.3 演示&#xff1a; 二、撤销修改 情况一&#xff1a;对于工作区的代码&#xff0c;还没有 add 情况二&#xff1a;已经 add &#xff0c;但没有 commit 情况三&#xff1a;已经 add &…...

反规范化带来的数据不一致问题的解决方案

在数据库设计中&#xff0c;规范化&#xff08;Normalization&#xff09;和反规范化&#xff08;Denormalization&#xff09;是两个相互对立但又不可或缺的概念。规范化旨在消除数据冗余&#xff0c;确保数据的一致性和准确性&#xff0c;但可能会降低查询效率。相反&#xf…...

【Android】直接使用binder的transact来代替aidl接口

aidl提供了binder调用的封装&#xff0c;有的时候&#xff0c;比如&#xff1a; 1. 懒得使用aidl生成的接口文件&#xff08;确实是懒&#xff0c;Android studio中aidl生成接口文件很方便&#xff09; 2. 服务端的提供者只公开了部分接口出来&#xff0c;只给了调用编号和参…...

Python机器学习笔记(十八、交互特征与多项式特征)

添加原始数据的交互特征&#xff08;interaction feature&#xff09;和多项式特征&#xff08;polynomial feature&#xff09;可以丰富特征表示&#xff0c;特别是对于线性模型。这种特征工程可以用统计建模和许多实际的机器学习应用中。 上一次学习&#xff1a;线性模型对w…...

《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)

章节文章名备注第1节Spring Boot&#xff08;1&#xff09;基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot&#xff08;2&#xff09;解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot&#xff08;3&#xff09;教你手工搭建Spring Boot项目纯手工玩法…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...