【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表两个表,按照我们之前的知识栈,我们直接使用…...
练习-平方拆分问题(线性筛法-筛质数)
问题描述 小蓝非常热爱数学,一天老师给小蓝出了一道数学题,想锻炼锻炼小蓝的思维能力。题目是这样的:给定两个数 a 和 b,在 a 到 b(包括 a,b)之间所有数的平方当中,试问有几个数能够表示为 xy …...
CVE-2018-2628(使用 docker 搭建)
介绍: 是一个影响 Oracle WebLogic Server 的严重漏洞,属于 远程代码执行(RCE) 漏洞。以下是对该漏洞的详细分析: ● 漏洞类型: 远程代码执行(RCE) ● 影响范围:Oracle WebLogic Server 10.3.6.0, 12.1.3.0, 12.2.1.2…...
【深度学习与大模型基础】第5章-线性相关与生成子空间
线性相关是指一组向量中,至少有一个向量可以表示为其他向量的线性组合。具体来说,对于向量组 v1,v2,…,vn,如果存在不全为零的标量 c1,c2,…,cn使得: c1v1c2v2…cnvn0 则称这些向量线性相关。否则,它们线性无关。 举…...
使用 PaddlePaddle 官方提供的 Docker 镜像
CUDA版本高PaddlePaddle不支持时,可以使用 PaddlePaddle 官方提供的 Docker 镜像 1. 安装 Docker Desktop1.1 下载 Docker Desktop1.2 安装 Docker Desktop1.3 启用 WSL 2 或 Hyper-V1.4 启动 Docker Desktop1.5 Docker不运行解决方法 2. 拉取 PaddlePaddle Docker …...
LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 论文阅读
一、TL;DR 为什么要这么做?预训练模型越来越大,比如GPT-3 175B训练独立变得越来越不可行方法:冻结预训练模型的权重,在Transformer架构的每一层中注入可训练的低秩分解矩阵效果:训练参数量减少10000x&…...
企业的应用系统
一、人力资源系统 负责管理员工信息,处理入职,离职,调岗。 1、一般员工的信息有电子档和纸质档两份。 电子档经常是excel文件。 2、高级的公司会建立一套Web应用系统。 3、实现的功能: 新员工入职登记 (登记信息一般是:…...
SpringBoot手动注册定时任务
一、背景 项目存在这样一个场景。程序启动过程中,在Spring的Bean组件注册完毕后,会初始化一些基础数据到数据库中,而项目中有部分定时任务需要依赖这些基础数据才能正常运行。如果直接使用Scheduled注解标注定时任务方法,会导致定…...
通过 Python 爬虫提高股票选股胜率
此贴为Python爬虫技术学习贴 在股票中,即便有了选股规则,从5000多只股票中筛选出符合规则的股票也是十分困难的,于是想通过爬虫来实现自动化的快速选股。全文用GP代替股票 实现方案 1、指定两套规则,第一套弱约束,第…...
InternVL:论文阅读 -- 多模态大模型(视觉语言模型)
更多内容:XiaoJ的知识星球 文章目录 InternVL: 扩展视觉基础模型与通用视觉语言任务对齐1.概述2.InternVL整体架构1)大型视觉编码器:InternViT-6B2)语言中间件:QLLaMA。3)训练策略(1)…...
代码随想录算法训练营第三十五天(20250303) |01背包问题 二维,01背包问题 一维,416. 分割等和子集 -[补卡20250316]
01背包问题 二维 链接 遍历物品没有大小顺序要求重点是模拟,推导出递推公式 #include <iostream> #include <vector>int main(){int m, n;std::cin>>m>>n;std::vector<int> weight(m,0),value(m,0);for(int i{0}; i<m; i){std:…...
RGV调度算法(三)--遗传算法
1、基于时间窗 https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_1741880736197&bdQuery%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95 2.2019年MathorCup高校数学建模挑战赛B题 2019-mathorcupB题-环形穿梭机调度模型&a…...
并发编程-
一、简述 线程:线程是cpu可执行的最小单位,而进程是操作系统可分配的最小资源单位。一个进程中可以有多个线程。 线程的五个状态: 新建(new Thread()) 就绪 (thread.start()) 运行(…...
Mac中nvm切换node版本失败,关闭终端再次打开还是之前的node
Mac中使用 nvm 管理 node 版本,在使用指令:nvm use XXX 切换版本之后。 关闭终端,再次打开,输入 node -v 还是得到之前的 node 版本。 原因: 在这里这个 default 中有个 node 的版本号,使用 nvm use 时&a…...
C语言(25)
一.数据在内存中的存储 1.整数在内存中的存储 整数在内存中以二进制的形式储存,分别为原码,补码,反码 有符号的整数,在上述三种形式都有符号位和数值位两个部分,符号位为0是正数,1是负数,最高…...
HTML、CSS
什么是HTML、CSS HTML结构标签及特点 CSS引入方式 CSS颜色表示形式: CSS引入方式、颜色表示、颜色属性 CSS选择器 超链接...
c#:主窗体与子控件之间的数据传递:基于事件和委托的实现
1. 概述 在WPF中,主窗体与子控件之间的数据传递通常通过以下两种方式实现: 事件(Event):主窗体触发事件,子控件订阅事件并接收数据。 委托(Delegate):通过委托将子控件…...
Dynamics 365 启用用户安全角色变更的审核功能
D365自身的审核功能这里就不说了,是一个很古老的功能,用过D365的人应该都知道,今天要说的是用户安全角色变更的审核记录。 很多人用系统的审核功能,更多的是用来追踪用户的登录记录,或者记录的修改记录。 而实际的项目…...
MyBatis注解
MyBatis 的注解(Annotations)提供了一种简洁的方式来配置 SQL 映射,而无需使用 XML 文件。通过在 Mapper 接口的方法上使用注解,可以直接在 Java 代码中定义 SQL 语句和相关映射。这种方式使得代码更加集中和易于维护,…...
1.Windows+vscode+cline+MCP配置
文章目录 1.简介与资源2.在windows中安装vscode及Cline插件1. 安装vscode2. 安装Cline插件3. 配置大语言模型3. 配置MCP步骤(windows) 1.简介与资源 MCP官方开源仓库 MCP合集网站 参考视频 2.在windows中安装vscode及Cline插件 1. 安装vscode 2. 安装Cline插件 Cline插件…...
94.HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils 文章目录 HarmonyOS NEXT动画系统实现教程:深入理解FuncUtils1. 动画系…...
Python----数据分析(Pandas一:pandas库介绍,pandas操作文件读取和保存)
一、Pandas库 1.1、概念 Pandas是一个开源的、用于数据处理和分析的Python库,特别适合处理表格类数 据。它建立在NumPy数组之上,提供了高效的数据结构和数据分析工具,使得数据操作变得更加简单、便捷和高效。 Pandas 的目标是成为 Python 数据…...
设计模式之原型模式:原理、实现与应用
引言 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。原型模式特别适用于创建成本较高的对象,或者需要动态配置的对象。本文将深入探讨原型模式的原理、实现方…...
平方矩阵问题
Ⅰ 回字形二维数组 #include <iostream> #include <iomanip> using namespace std; int main(){int n;while(cin>>n,n){for(int i0; i<n;i){for(int j0; j<n; j){int upi, downn-i1, leftj, rightn-j1;cout<<min(min(up,down),min(left,right)…...
C语言之链表
文章目录 前言 一、链表基本概念 1、声明节点结构 2、创建节点变量 3、链表所有节点 4、遍历链表 二、add添加 三、insert插入 四、remove删除 五、查找 总结 前言 链表是一种重要的数据结构,用于存储和组织数据。它是由一系列节点组成的数据结构&#x…...
RabbitMQ延迟消息
文章目录 延迟消息死信交换机延迟消息延迟消息应用场景 延迟消息 生产者在发送消息的时候指定一个时间,消费者不会立即收到该消息,而是在指定时间之后才收到消息,这就是延迟消息。 比如说这么一个场景,用户下单后将商品库存进行…...
Unity中WolrdSpace下的UI展示在上层
一、问题描述 Unity 中 Canvas使用World Space布局的UI,想让它不被3d物体遮挡,始终显示在上层。 二、解决方案 使用shader解决 在 UI 的材质中禁用深度测试(ZTest),强制 UI 始终渲染在最上层。 Shader "Custo…...
【从零开始学习计算机科学】算法分析(一)算法、渐进分析、递归分析
【从零开始学习计算机科学】算法分析(一)算法、渐进分析、递归分析 算法算法分析正确性算法完成需要的时间使用的存储空间简单性渐进分析递归分析主方法求解递归式递归树求解代入法概率分析和随机算法顺序统计量算法 什么是算法?算法(Algorithm)是指解题方案的准确而完整…...
【菜鸟飞】Conda安装部署与vscode的结合使用
介绍 Conda 是一个跨平台的开源工具,用于管理软件包和环境。最初由 Anaconda 公司开发,它的设计目标是支持数据科学和机器学习领域,但其功能不仅局限于此。 以下是 Conda 的核心特点: 包管理:安装、更新、卸载各种库…...
LeetCode2593 标记所有元素后数组的分数
贪心算法实战:数组标记与分数计算(LeetCode 同类题解析) 一、问题描述 给定一个正整数数组 nums,按以下规则计算最终分数: 初始分数 score 0每次选择最小且未被标记的元素(值相同选下标最小)…...
【C++多线程】thread
C中的std::thread是C11引入的线程库的一部分,提供了创建和管理线程的能力。它封装了操作系统的线程接口,使得在C中更方便地进行多线程编程。 1. std::thread 的定义 std::thread 类位于<thread>头文件中,定义在std命名空间下ÿ…...
补充二分LIS
B3637 最长上升子序列 题目描述 这是一个简单的动规板子题。 给出一个由 n ( n ≤ 5000 ) n(n\le 5000) n(n≤5000) 个不超过 1 0 6 10^6 106 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。 最长上升子序列是指,从原序列中按顺序取出一些数字排…...
airtest用法
安装python3.7.9 64 python3 -m pip install -U airtest 或者: git clone https://github.com/AirtestProject/Airtest.git pip install -e airtest 下载adb 可以开始无界面的airtest 下载AirtestIDE 安装与启动 - Airtest Project Docs Airtest Project...
30天学习Java第四天——设计模式
设计模式概述 设计模式是一套被广泛接受的、经过试验的、可反复使用的基于面向对象的软件设计经验总结,它是开发人员在软件设计时,对常见问题的解决方案的总结和抽象。 一句话就是,设计模式是针对软件开发中常见问题和模式的通用解决方案。 …...
MongoDB 和 Elasticsearch的区别、优缺点对比,以及选型建议
MongoDB 和 Elasticsearch 在存储和搜索方面各有特点,适用于不同的场景。以下是它们的区别、优缺点对比,以及选型建议。 1. 概述 MongoDB:分布式 NoSQL 文档数据库,基于 BSON(类似 JSON)的文档存储&#x…...
在Android中,子线程可以更新UI吗
目录 为什么子线程不能直接更新UI? 如何正确在子线程更新UI? 1. 使用runOnUiThread方法 2. 通过Handler发送消息到主线程 3. 使用View.post(Runnable)方法 4. 结合AsyncTask(已过时,仅作了解) 5. 使用Kotlin协程…...
unittest vs pytest区别
unittest vs pytest 对比 unittest 像“手动挡汽车”:操作步骤多,规则严格,适合老司机。pytest 像“自动挡汽车”:开起来轻松,功能强大,适合新手和高效开发。 区别点unittest(你学过的&…...
OpenAI与谷歌DeepMind新品同日竞技,谁能引领机器人现实任务新潮流?
2025年3月12日,科技巨头谷歌DeepMind与OpenAI均发布了与机器人执行现实任务相关的新产品:谷歌DeepMind的新AI模型、OpenAI的Agents工具集,二者在技术路径、应用场景、安全机制设计等方面存在明显差异,其发展态势备受行业关注。 …...
JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal
并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…...
特殊 IP 地址
文章目录 特殊IP地址概述受限广播地址(Limited Broadcast Address)直接广播地址(Directed Broadcast Address)多播地址(Multicast Address)环回地址(Loopback Address)本网络本主机&…...
SSL/TLS 1.2过程:Client端如何验证服务端证书?
快速回顾非对称加密和对称加密 首先快速说一下非对称加密和对称加密。非对称加密,就是有一个公钥和私钥(成对存在)。 公钥对一段文本A加密得到文本B,只有对应的私钥能对B解密得到A。 私钥对一段文本C加密得到文本D,只有对应的公钥能对D解密得…...
Android(java)高版本 DownloadManager 封装工具类,支持 APK 断点续传与自动安装
主要有以下优点 兼容高版本 Android:适配 Android 10 及以上版本的存储权限和安装权限。断点续传:支持从断点继续下载。下载进度监听:实时获取下载进度并回调。错误处理:处理下载失败、网络异常等情况。自动安装 APK:…...
基于three.js的虚拟人阴影渲染优化方案
作者:来自 vivo 互联网大前端团队- Su Ning 本文将探讨 three.js 中的阴影渲染机制,并分享一些针对性能和效果优化的实用技巧,帮助开发者在不同场景下做出最佳的权衡选择。 一、前言 在3D网页应用中,高质量的阴影渲染对于营造场…...
人工智能中神经网络是如何进行预测的
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/north 文章目录 引言神经网络的基本结构神经网络的前向传播前向传播的步骤激活函数 代码实现流程图详细解释…...
vue3 中使用 Recorder 实现录音并上传,并用Go语言调取讯飞识别录音(Go语言)
录音并识别 效果图一、开启游览器录音权限二、前端代码三、Go代码,上传到讯飞识别录音返回到前端 效果图 recorder-core插件可以在网页中进行录音。录音文件(blob)并可以自定义上传,可以下载录音文件到本地,本文录音过程中会显示可视化波形,插件兼容PC端…...
自探索大语言模型微调(一)
一、数据 1.1、失败案例 Hugging Face: 根据B站上搜索到的资料,datasets这个库可以直接下载丰富的数据集合和与训练模型,调用也非常的简单,唯一的缺点就是,需要外网(翻墙),用国内的…...
算法练习(链表)
链表 链表的分类 单向链表,双向链表带头链表,不带头链表循环的,非循环的 链表的结构 图中所示的为链表的一个节点,value是这个节点的所存储的数据值,next为下一节点的地址。 代码实现链表 1.创建节点类 节点由…...
在 Ubuntu 服务器上使用宝塔面板搭建博客
📌 介绍 在本教程中,我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板,并使用 Nginx PHP MySQL 搭建一个博客(如 WordPress)。 主要步骤包括: 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…...
K8S学习之基础二十八:k8s中的configMap
k8s中的configMap configMap是k8s的资源对象,简称cm,用于保存非机密性的配置,数据可以用key/value键值对形式保存,也可以通过文件形式保存 在部署服务的时候,每个服务都有自己的配置文件,如果一台服…...
EDID读取学习
简介 Video BIOS可以被认为是一个具有独立硬件抽象层的操作系统。它不会阻止或监视操作系统、应用程序或设备驱动程序对硬件的直接访问。虽然不推荐,但一些DOS应用程序确实可以改变基本的硬件设置,而根本不需要通过视频BIOS。大多数现代应用程序和操作系统都避免直接使用硬件…...