【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
在DQL的基础查询中,我们已经学过了多表查询的一种:联合查询(union)。本文我们将系统的讲解多表查询。
笛卡尔积现象
首先,我们想要查询emp表和stu表两个表,按照我们之前的知识栈,我们直接使用:
select * from emp,stu;
当查询emp时:15条记录被查询
当查询stu时:5条记录被查询
但是让我们来观察结果:

哇,查询到了70条记录 。而且根据结果我们可以看出:左表emp的每条记录都会与右表stu的每条记录组成一条新的记录,也就是14*5=70条记录。这种现象非常符合离散数学中学到的笛卡尔积的结果,所以我们将这种现象称为笛卡尔积现象。
笛卡尔积(Cartesian Product):表示两个集合之间的所有可能的有序对的集合

笛卡尔积的性质包括:
- 笛卡尔积的结果是一个新集合。
- 如果 AA 和 BB 其中一个为空集,则结果也为空集。
- 笛卡尔积的顺序是重要的,即 A×B≠B×A。
我们如何实现15+4的结果呢?直接使用上面的select肯定是不行了。
那么,此时有一个叫联合查询的方式出现在脑海里:
联合查询
关键字:【union all】
select empno,ename,job from emp
union all
select id,nick,pwd from stu;
观察结果:19=15+4条记录 (使用union代替union all可以实现去重的功能)

但是为了将记录查询出来,我们 必须合适选择每个表的字段,将两个表查询的字段的数据类型一一对应。empno int = id int,ename varchar = nick varchar ......
如果数据类型对应不上,那么将无法查询,结果是:

直接查询的条件限制法
那么联合查询也不能符合我们对查询结果的预期,这时候需要我们转换思路。从笛卡尔积现象开始:【需求:查询员工表以及每个员工对应的部门信息】
首先直接查询:

对于查询的结果,虽然有重复, 但至少有我们需要的结果,那么只需要将这个表中的有效记录提取出来,就可以了。也就是使用where条件进行限定:

此时我们查询的结果就符合我们的预期了。但注意,这时候我们操作时必须给每个字段指定上是哪个表的字段,不然的话,该字段属于二义性字段,无法通过语法分析,也就不能执行了。
内连接
select field from tb1
[inner] join tb2 on condition;
等值连接
eg.根据一个编号查另一个表中改编号对应的内容。常见于:根据子表外键连接父表主键
【练习:查询员工表以及每个员工对应的部门信息】
select * from emp [inner]join dept on emp.DEPTNO = dept.DEPTNO;
非等值连接
eg.根据一个表的某个字段,查另一个表中该字段属于哪段区间的信息。实际用途:等级划分
【练习:根据员工的薪水查出薪水的等级】

自连接
eg.自连接是某个表的某个字段信息存储的数据是本表的另一条记录的信息。常用于:事物关联
【练习:根据员工表的领导编号查询领导的名字】

自连接的流程:为显示的字段起别名(避免两个结果字段名冲突,非必须)=》from选择查询表=》join 连接表(本表),并起别名(避免二义性,必须)=》连接条件。[过程中的每个字段都需要明确指出是哪个表]
外连接
由于内连接会将连接条件的字段中空值的记录给过滤掉,所以为了显示较为全面的记录,我们采用外连接的方式进行多表查询。
左外连接
左外连接就是(left [outer] join ... on...)。显示主表的所有字段,并将被连接的从表符合连接条件的记录连接到主表,如果没有,主表显示原本记录,从表的字段中为空。
【练习:查询员工表以及每个员工对应的部门信息---显示所有员工】

右外连接
右外连接就是(right [outer] join ... on...)。与左外连接类似。
【练习:查询员工表以及每个员工对应的部门信息---显示所有部门】

我们对比发现,右外连接显示的记录比左外连接的记录多一条,多出的一条是部门表中的数据,但该部门在员工表中没有员工,所以全部显示为空。
注:外连接查询的结果记录数 >= 内连接查询到的结果记录数
左外连接【左图】、右外连接【右图】

子查询
子查询:嵌套在其它SQL语句内的查询语句,且必须出现在圆括号内(查询一般是指select语句):子查询的结果可以作为外层查询的过滤条件或计算字段。
标量子查询
子查询返回结果是单个值,如数字、字符串、日期等最简单的形式。这种子查询称为标量子查询。【常用的操作符:| = | <> | > | >= | < | <= |】
【练习:查询销售部的部门员工信息】
第一步:查询销售部的部门编号
select deptno from dept where dname="SALES";
第二步:查询部门编号为上述结果的员工
select * from emp where deptno = 上条语句的结果;
第三步:合并一条语句:
select * from emp where deptno = (select deptno from dept where dname="SALES");

标量子查询可以在子句中使用聚合函数、而且子句的位置还可以出现在select后作为字段出现:
【练习:查询部门名,以及每个部门的人数】
select dname, (select count(*) from emp where dept.deptno=emp.deptno) emps
from dept;

列子查询
子查询的结果是一列(或者多列),这种子查询称为列子查询。
【常用操作符:in、not in、any、some、all】
IN:在指定的集合范围之内,多选一
NOT IN:不再指定的集合范围之内
ANY:子查询返回列表中,有任意一个满足即可【相当于集合所有元素作 or 运算】
SOME:与ANY相同,SOME与ANY等价
ALL:子查询返回列表的所有值都要满足【相当于集合所有元素之间作 and 运算】
【练习:查询销售部(SALES)和调研部(RESEARCH)所有员工信息】
select *
from emp
where deptno in (select deptno from dept where dname in ("SALES","RESEARCH"));-- or:
select *
from emp
where deptno in (select deptno from dept where dname="SALES" or dname="RESEARCH");

【练习:查询比销售部的所有人的工资都高的员工信息】
比所有人都高,也就是sal > all( {...} )

通过这个练习,我们不仅练习了all运算,我们还知道了,子句可以嵌套子句。
行子查询
子查询的返回结果是一行(可以是多行),这种子查询称为行子查询。
【常用操作符:| = | <> | in | not in】
【练习:查询与“SMITH”的 薪资以及直属领导 都相同的员工信息】
-- (单行结果)
select * from emp where (sal,mgr) = (select sal,mgr from emp where ename = "SMITH");-- (多行结果)
select * from emp where (sal,mgr) in (select sal,mgr from emp where ename = "SMITH");

通过该练习,我们掌握了新的知识:
(field1,field2,...,fieldn) 可以通过加圆括号的方式直接与行结果进行运算【= | <> | in | not in】
表子查询
子查询的结果可以是多行多列,产生这种结果的子查询称为表子查询。【常用操作符:IN】
这种就是行子查询的 in 操作。
-- (多行结果)
select * from emp where (sal,mgr) in (select sal,mgr from emp where ename = "SMITH");
感谢大家!欢迎指导、询问、探讨知识!
相关文章:
【MySQL】多表查询(笛卡尔积现象,联合查询、内连接、左外连接、右外连接、子查询)-通过练习快速掌握法
在DQL的基础查询中,我们已经学过了多表查询的一种:联合查询(union)。本文我们将系统的讲解多表查询。 笛卡尔积现象 首先,我们想要查询emp表和stu表两个表,按照我们之前的知识栈,我们直接使用…...
Leetcode-132.Palindrome Partitioning II [C++][Java]
目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-132.Palindrome Partitioning IIhttps://leetcode.com/problems/palindrome-partitioning-ii/description/132. 分割回文串 II - 力扣(LeetCode)132. 分割回文串 II - 给你一个字符串 s&…...
在 macOS 上优化 Vim 用于开发
简介 这篇指南将带你通过一系列步骤,如何在 macOS 上优化 Vim,使其具备 代码补全、语法高亮、代码格式化、代码片段管理、目录树等功能。此外,我们还会解决在安装过程中可能遇到的常见错误。 1. 安装必备工具 在开始 Vim 配置之前ÿ…...
SOME/IP-SD -- 协议英文原文讲解8
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.4.4 S…...
【Agent实战】货物上架位置推荐助手(RAG方式+结构化prompt(CoT)+API工具结合ChatGPT4o能力Agent项目实践)
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 结论 效果图示 1.prompt 2. API工具封…...
Spring Boot使用线程池创建多线程
在 Spring Boot 2 中,可以使用 Autowired 注入 线程池(ThreadPoolTaskExecutor 或 ExecutorService),从而管理线程的创建和执行。以下是使用 Autowired 方式注入线程池的完整示例。 1. 通过 Autowired 注入 ThreadPoolTaskExecuto…...
PyTorch 深度学习实战(11):强化学习与深度 Q 网络(DQN)
在之前的文章中,我们介绍了神经网络、卷积神经网络(CNN)、循环神经网络(RNN)、Transformer 等多种深度学习模型,并应用于图像分类、文本分类、时间序列预测等任务。本文将介绍强化学习的基本概念࿰…...
在Eclipse 中使用 MyBatis 进行开发,通常需要以下步骤:
在Eclipse 中使用 MyBatis 进行开发,通常需要以下步骤: 1. 创建 Maven 项目 首先,在 Eclipse 中创建一个 Maven 项目。如果你还没有安装 Maven 插件,可以通过 Eclipse Marketplace 安装 Maven 插件。 打开 Eclipse,选…...
Python学习第十九天
Django-分页 后端分页 Django提供了Paginator类来实现后端分页。Paginator类可以将一个查询集(QuerySet)分成多个页面,每个页面包含指定数量的对象。 from django.shortcuts import render, redirect, get_object_or_404 from .models impo…...
Adobe Premiere Pro2023配置要求
Windows 系统 最低配置 处理器:Intel 第六代或更新版本的 CPU,或 AMD Ryzen™ 1000 系列或更新版本的 CPU,需要支持 Advanced Vector Extensions 2(AVX2)。操作系统:Windows 10(64 位ÿ…...
面试求助:接口测试用例设计主要考虑哪些方面?
一、基础功能验证 1. 正常场景覆盖 关键点:验证接口在合法输入下的正确响应(状态码、数据结构、业务逻辑)。 案例: json 复制 // 用户登录接口 输入:{"username": "合法用户", "password…...
C语言——变量与常量
C语言中的变量与常量:简洁易懂的指南 在C语言编程中,变量和常量是最基本的概念之一。理解它们的区别和使用方法对于编写高效、可维护的代码至关重要。本文将详细介绍C语言中的变量和常量,并通过图表和代码示例帮助你更好地理解。 目录 什么…...
考研408-数据结构完整代码 线性表的顺序存储结构 - 顺序表
线性表的顺序存储结构 - 顺序表 1. 顺序表的定义 用一组地址连续的存储单元依次存储线性表的数据元素,从而使逻辑上相邻的两个元素在物理位置上也相邻 2. 顺序表的特点 随机访问: 即通过首地址和元素序号可以在O(1) 时间内找到指定元素࿰…...
Windows环境下安装部署dzzoffice+onlyoffice的私有网盘和在线协同系统
安装前需要准备好Docker Desktop环境,可查看我的另一份亲测安装文章 https://blog.csdn.net/qq_43003203/article/details/146283915?spm1001.2014.3001.5501 1、安装配置onlyoffice 1、Docker 拉取onlyoffice容器镜像 管理员身份运行Windows PowerShell&#x…...
解决 Docker 镜像拉取超时问题:配置国内镜像源
在使用 Docker 的过程中,经常会遇到镜像拉取超时的问题,尤其是在国内网络环境下。这不仅会浪费大量的时间,还可能导致一些项目无法顺利进行。今天,我将分享一个简单而有效的解决方法:配置国内镜像源。 环境 操作系统 c…...
如何解决 Three.js 物体渲染的锯齿问题
在 Three.js 中,如果模型看起来不够平滑,或者在旋转视角时出现锯齿(aliasing),可以通过以下方法来优化渲染效果。 1. 启用抗锯齿(MSAA) 默认情况下,Three.js 渲染器不会开启抗锯齿&…...
嵌入式八股,为什么单片机中不使用malloc函数
1. 资源限制 单片机的内存资源通常非常有限,尤其是RAM的大小可能只有几KB到几十KB。在这种情况下,使用 malloc 进行动态内存分配可能会导致内存碎片化,使得程序在运行过程中逐渐耗尽可用内存。 2. 内存碎片问题 malloc 函数在分配和释放内…...
【计量地理学】实验一 地理数据的基本统计分析
阅前提示: 计量地理学实验课的实验报告为当堂提交,相较以往实验报告缺少打磨与整理的时间,因此内容中不可避免出现相关错误!!! 出于个人完美主义的原则本不愿发布(其实就是黑历史)…...
ChatPromptTemplate的使用
ChatPromptTemplate 是 LangChain 中专门用于管理多角色对话结构的提示词模板工具。它的核心价值在于,开发者可以预先定义不同类型的对话角色消息(如系统指令、用户提问、AI历史回复),并通过数据绑定动态生成完整对话上下文。 1.…...
SQL Server查询优化
最常用,最有效的数据库优化方式 查询语句层面 避免全表扫描 使用索引:确保查询条件中的字段有索引。例如,查询语句 SELECT * FROM users WHERE age > 20,若 age 字段有索引,数据库会利用索引快速定位符合条件的记…...
Blender插件NodeWrangler导入贴图报错解决方法
Blender用NodeWrangler插件 CtrlShiftT 导入贴图 直接报错 解决方法: 用CtrlshiftT打开需要导入的材质文件夹时,右边有一个默认勾选的相对路径,取消勾选就可以了。 开启node wrangler插件,然后在导入贴图是取消勾选"相对路径"&am…...
QT中的宏
Q_UNUSED(event); 是 Qt 提供的一个宏,用于标记某个变量或参数在当前作用域中未被使用。它的主要作用是避免编译器发出“未使用变量”的警告。 背景 在 C 中,如果一个函数参数或变量在代码中没有被使用,编译器会发出警告,例如&a…...
java项目之基于ssm的药店药品信息管理系统(源码+文档)
项目简介 药店药品信息管理系统实现了以下功能: 个人信息管理 负责管理个人用户的信息。 员工管理 负责管理药店或药品管理机构的员工信息。 药品管理 负责管理药品的详细信息,可能包括药品名称、成分、剂量、价格、库存等。 进货管理 负责管理药品…...
论文分享 | HE-Nav: 一种适用于复杂环境中空地机器人的高性能高效导航系统
阿木实验室始终致力于通过开源项目和智能无人机产品,为全球无人机开发者提供强有力的技术支持,并推出了开源项目校园赞助活动,助力高校学子在学术研究与技术创新中取得更大突破。近日,香港大学王俊铭同学,基于阿木实验…...
【大语言模型】【个人知识库正式内容】提示工程:如何设计模型的提示语
知识库条目:提示工程,如何构建提示词。 🏖️ 当人人都能使用AI时,你如何才能变得更出彩?……让 AI 带有自己的Tag —— 一、简介 什么是提示语 (Prompt): 提示语是用户输入给AI系统的指令或信息, 简单来说…...
ubuntu 24 安装 python3.x 教程
目录 注意事项 一、安装不同 Python 版本 1. 安装依赖 2. 下载 Python 源码 3. 解压并编译安装 二、管理多个 Python 版本 1. 查看已安装的 Python 版本 2. 配置环境变量 3. 使用 update-alternatives 管理 Python 版本 三、使用虚拟环境为项目指定特定 Python 版本…...
(十一) 人工智能 - Python 教程 - Python元组
更多系列教程,每天更新 更多教程关注:xxxueba.com 星星学霸 1 元组(Tuple) 元组是有序且不可更改的集合。在 Python 中,元组是用圆括号编写的。 实例 创建元组: thistuple ("apple", "b…...
【sql靶场】第13、14、17关-post提交报错注入保姆级教程
目录 【sql靶场】第13、14、17关-post提交报错注入保姆级教程 1.知识回顾 1.报错注入深解 2.报错注入格式 3.使用的函数 4.URL 5.核心组成部分 6.数据编码规范 7.请求方法 2.第十三关 1.测试闭合 2.列数测试 3.测试回显 4.爆出数据库名 5.爆出表名 6.爆出字段 …...
93.HarmonyOS NEXT窗口管理基础教程:深入理解WindowSizeManager
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT窗口管理基础教程:深入理解WindowSizeManager 文章目录 HarmonyOS NEXT窗口管理基础教程:深入理解WindowSiz…...
Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)
一、Pandas库 1.1、概念 Pandas是一个开源的、用于数据处理和分析的Python库,特别适合处理表格类数 据。它建立在NumPy数组之上,提供了高效的数据结构和数据分析工具,使得数据操作变得更加简单、便捷和高效。 Pandas 的目标是成为 Python 数据…...
