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

Mysql(7)子查询

提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录子查询select中嵌套子查询select中嵌套子查询where或having中嵌套子查询exists型子查询from中嵌套子查询update中嵌套子查询delete中嵌套子查询使用子查询复制表结构和数据通用表达式一、整体总结1. 子查询Subquery2. CTECommon Table Expressions 通用表达式3. 递归 CTERECURSIVE CTE二、各类子查询核心用法总结1. SELECT 中嵌套子查询2. WHERE / HAVING 中嵌套子查询3. FROM 中嵌套子查询派生表4. UPDATE / DELETE 中嵌套子查询三、高频易错点汇总重点子查询select中嵌套子查询子查询嵌套在另一个SQL语句中的查询。select语句可以嵌套在另一个select、update、delete、insert、create等语句中。select中嵌套子查询--在t_employee表中查询每个人薪资和公司平均薪资的差值--并显示员工薪资和公司平均薪资相差5000元以上的记录 select enameas姓名,salaryas薪资,round((select avg(salary)fromt_employee),2)as全公司平均薪资,round(salary-(select avg(salary)fromt_employee),2)as差值fromt_employee whereabs(round(salary-(select avg(salary)fromt_employee),2))5000;--在t_employee表中查询每个部门平均薪资和公司平均薪资的差值 select did,avg(salary),avg(salary)-(select avg(salary)fromt_employee)fromt_employee group by did;where或having中嵌套子查询当子查询结果作为外层另一个SQL的过滤条件通常把子查询嵌入到where或having中。根据子查询结果的情况分为如下三种情况当子查询的结果是单列单个值那么可以直接使用比较运算符如“”、“”、“”、“”、“”、“!”等与子查询结果进行比较当子查询的结果是单列多个值那么可以使用比较运算符in或not in进行比较当子查询的结果是单列多个值还可以使用比较运算符, 如“”、“”、“”、“”、“”、“!”等搭配any、all等关键字与查询结果进行比较子查询结果一列一行--在t_employee表中查询比全公司平均薪资高的男员工姓名和薪资 select ename,salaryfromt_employee where salary(select avg(salary)fromt_employee)andgender男;子查询一列多行--在t_employee表中查询和 白露谢吉娜 同一部门的员工姓名和电话 select ename,tel,didfromt_employee where didin(select didfromt_employee where ename白露orename谢吉娜);--在t_employee表中查询薪资比 白露李诗雨黄冰茹 三个人的薪资都要高的员工姓名和薪资 select ename,salaryfromt_employee where salaryall(select salaryfromt_employee where enamein(白露,李诗雨,黄冰茹))--查询t_employee和t_department表按部门统计平均工资--显示部门平均工资比全公司的总平均工资高的部门编号、部门名称、部门平均薪资--并按照部门平均薪资升序排列 select t_department.did,dname,avg(salary)fromt_employee right join t_department on t_employee.didt_department.did group by t_department.did having avg(salary)(select avg(salary)fromt_employee)order by avg(salary);exists型子查询比如下面第一个案例也就是相当于对t_department的每一行进行判断其的did是否为null,并且exists中的select是什么事无所谓的比如看结果--查询t_employee表中是否存在部门编号为null的员工--如果存在查询t_department表的部门编号、部门名称 select*fromt_department where exists(select*fromt_employee where didisnull);同样的道理也是看t_department的每一行是否满足这个t_employee.didt_department.did条件满足的返回--查询t_department表是否存在与t_employee表相同部门编号的记录--如果存在查询这些部门的编号和名称 select*fromt_department where exists(select*fromt_employee where t_employee.didt_department.did);结果如下筛选去掉了一个测试部因为测试部门的id在员工表中不存在等价于--查询结果等价于下面的SQL select distinct t_department.*fromt_department inner join t_employee on t_department.didt_employee.did;from中嵌套子查询当子查询结果是多列的结果时通常将子查询放到from后面然后采用给子查询结果取别名的方式把子查询结果当成一张“动态生成的临时表”使用。若是使用这种方式select ename,did,salary,dense_rank()over(partition by did order by salary desc)aspaimingfromt_employee where dense_rank()over(partition by did order by salary desc)2;窗口函数是最后一步进行计算的所以报错sql中的执行顺序FROM→ WHERE→ GROUP BY→ HAVING→ SELECT ✅窗口函数在这里算# 在t_employee表中查询每个部门中薪资排名前2的员工姓名、部门编号和薪资select*from(select ename,did,salary,dense_rank()over(partition by did order by salary desc)aspaimingfromt_employee)temp where temp.paiming2;update中嵌套子查询--修改t_employee表中部门编号和测试部部门编号相同的员工薪资为原来薪资的1.5倍 update t_employeesetsalarysalary*1.5where did(select didfromt_department where dname测试部);--修改t_employee表中did为null的员工信息--将他们的did值修改为测试部的部门编号--这种子查询必须是单个值否则无法赋值 update t_employeesetdid(select didfromt_department where dname测试部)where didisnull;– 当update的表和子查询的表是同一个表时需要将子查询的结果用临时表的方式表示– 即再套一层子查询使得update和最外层的子查询不是同一张表update t_employeesetdid(select didfromt_department where dname测试部)where didisnull;所以使用下面的办法嵌套作为一个临时表--修改t_employee表中李冰冰的薪资值等于孙红梅的薪资值 update t_employeesetsalary(select salaryfrom(select salaryfromt_employee where ename孙红梅)temp)where ename李冰冰;– 修改t_employee表李冰冰的薪资与她所在部门的平均薪资一样注意一定要给临时表起别名否则报错update t_employee tsetsalary(select pingfrom(SELECT avg(salary)pingfromt_employee t2 where t.didt2.did)tmp)where ename李冰冰;delete中嵌套子查询--从t_employee表中删除测试部的员工记录 deletefromt_employee where did(select didfromt_department where dname测试部);--从t_employee表中删除和李冰冰同一个部门的员工记录 deletefromt_employee where did(select didfromt_employee where ename李冰冰);--报错因为删除和子查询是同一张表和上面同样的处理方式设置一个临时表delete from t_employeewhere did (select did from(SELECT did from t_employee where ename‘李冰冰’)temp)使用子查询复制表结构和数据1复制表结构– 仅复制表结构可以用create语句create table department like t_department;2复制一条或多条记录– 使用insert语句子查询复制数据此时insert不用写valuesinsert into department (select * from t_department where did3);3同时复制表结构和记录– 同时复制表结构数据create table d_department as (select * from t_department);– 如果select后面是部分字段复制的新表就只有这一部分字段通用表达式通用表达式简称为CTECommon Table Expressions。CTE是命名的临时结果集作用范围是当前语句。CTE可以理解为一个可以复用的子查询但是和子查询又有区别一个CTE可以引用其他CTECTE还可以是自引用(递归CTE)也可以在同一查询中多次引用但子查询不可以。with[recursive]cte_name[(字段名1,字段名2)]as(子查询),cte_name[(字段名1,字段名2)]as(子查询)– 在t_employee表中查询每个人薪资和公司平均薪资的的差值SELECT*FROM(SELECT ename AS员工姓名,salary AS薪资,AVG(salary)OVER()AS pingjun,ROUND(salary-AVG(salary)OVER(),2)AS差值FROM t_employee)t WHERE ROUND(t.薪资-t.pingjun,2)5000;可以这样写– 查询薪资低于9000的员工编号员工姓名员工薪资领导编号领导姓名领导薪资但是也可以使用CTE来替代子查询WITH empas(SELECT*fromt_employee where salary9000)select emp.salaryas员工薪资,emp.enameas员工姓名,emp.midas领导编号,mgr.enameas领导姓名,mgr.salaryas领导薪资fromemp join t_employee mgr on emp.midmgr.eid;--查询eid为21的员工和他所有领导直到最高领导--建表设置多层领导 create table empas(select eid,ename,salary,tel,midfromt_employee where salary10000);update empsetmid19where eid21;update empsetmid17where eid19;update empsetmid16where eid17;update empsetmid15where eid16;update empsetmid4where eid15;update empsetmidnull where eid4;select*fromemp;withrecursive cteas(select eid,ename,midfromemp where eid21unionallselect emp.eid,emp.ename,emp.midfromemp join cte on emp.eidcte.mid where emp.eidisnotnull)select*fromcte;这里CET循环解释一下循环有三个条件起始递归终止首先是起始select eid,ename,midfrom empwhere eid 21循环部分,相当于不断地在结果上进行递加union allselect emp.id emp.ename,emp.midfrom emp join cteon cte.midemp.eid终止条件where emp eid is not null总结一、整体总结1. 子查询Subquery子查询是指嵌套在其他 SQL 语句中的查询可以出现在SELECT、FROM、WHERE、HAVING、UPDATE、DELETE等位置。核心特点子查询先执行其结果作为外层 SQL 的条件或数据源。根据返回结果不同可分为单行单列、单列多行、多列多行。执行顺序子查询总是优先于主查询执行。2. CTECommon Table Expressions 通用表达式CTE 是MySQL 8.0引入的特性可以理解为可以命名的临时结果集只在当前语句有效。与子查询的区别对比项子查询CTE通用表达式是否需要命名不需要from中必须必须命名可重复使用不可以可以多次引用是否可相互引用不可以可以CTE 可以引用其他 CTE是否支持递归不支持支持加RECURSIVE可读性差嵌套多层很乱优秀结构清晰语法结构WITH[RECURSIVE]cte_name1AS(子查询1),cte_name2AS(子查询2)SELECT...FROMcte_name1...3. 递归 CTERECURSIVE CTE递归 CTE 是 CTE 的进阶用法用于处理层级关系、树形结构如查找所有上级、所有下属、组织架构等。核心组成种子查询提供起始点第一层数据递归查询通过UNION ALLJOIN自己调用自己终止条件当递归查询不再返回结果时自动停止执行本质像“滚雪球”一样一行一行不断累积结果而不是“在表格后面添加列”。二、各类子查询核心用法总结1. SELECT 中嵌套子查询常用于返回单值如公司平均薪资每次外层查询一行子查询就会执行一次性能较差2. WHERE / HAVING 中嵌套子查询单行单列直接用、、等比较单列多行用IN、ANY、ALLHAVING中可使用聚合函数WHERE中不能3. FROM 中嵌套子查询派生表子查询结果当作临时表使用必须给别名常用于窗口函数后筛选因为窗口函数在SELECT中最后计算4. UPDATE / DELETE 中嵌套子查询更新同一张表时容易出现You cant specify target table错误解决办法把子查询再包一层成为临时表三、高频易错点汇总重点以下是这篇笔记中最容易出错的地方按严重程度排序序号易错点具体表现正确做法1窗口函数写在 WHERE 中WHERE dense_rank() OVER(...) 2必须包一层子查询在外层用WHERE筛选2UPDATE/DELETE 与子查询操作同一张表报You cant specify target table子查询外面再包一层临时表3HAVING 中使用 SELECT 的别名HAVING 差值 5000外层用子查询或者重复写表达式4递归 CTE 方向写反ON emp.eid cte.mid想找上级却写成向下向上找领导用ON e.eid cte.mid向下找下属用ON e.mid cte.eid5递归 CTE 没有终止条件导致Recursive query aborted after 1001 iterations加上level字段 WHERE cte.level 20限制6子查询返回多行却用WHERE did (SELECT did ...)返回多行时报错改用IN7FROM 子查询不写别名FROM (SELECT ...)没给别名必须写别名如FROM (...) t8EXISTS 子查询写法混淆把EXISTS当成返回具体值使用EXISTS只关心“有没有结果”不关心内容9CTE 中忘记写 RECURSIVE递归查询无法生效递归必须写WITH RECURSIVE10多表查询不加表别名导致 ambiguousColumn eid is ambiguous所有字段都加上表别名如emp.eid、mgr.eid

相关文章:

Mysql(7)子查询

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录子查询select中嵌套子查询select中嵌套子查询where或having中嵌套子查询exists型子查询from中嵌套子查询update中嵌套子查询delete中嵌套子查询使用子查询复制表结构…...

CefFlashBrowser:Flash内容兼容性一站式终极解决方案

CefFlashBrowser:Flash内容兼容性一站式终极解决方案 【免费下载链接】CefFlashBrowser Flash浏览器 / Flash Browser 项目地址: https://gitcode.com/gh_mirrors/ce/CefFlashBrowser 当Flash技术正式退出历史舞台,那些曾经承载着无数人童年回忆的…...

AI创作利器:Harness+OpenClaw+CLI实战

我将主要围绕您提到的 Harness、OpenClaw 和 CLI 这三个核心概念,结合参考资料,为您拆解如何利用它们进行技术创作,并提供具体、可操作的代码示例。一、 核心概念解构:理解赋能创作的三大引擎在2026年的AI技术背景下,这…...

身份证OCR识别系统完整搭建指南

🚀 身份证OCR识别系统完整搭建指南 从零开始,手把手教你搭建企业级身份证信息自动提取系统 基于 PaddleOCR + Python,支持离线部署,CPU即可运行,识别准确率 95%+ 📋 目录 项目概述 环境搭建(亲测可用) 核心代码解析 实战演示 常见问题排查 进阶优化方案 一、项目概述…...

团队任务管理软件哪个好?trello、Worktile、Todoist等10大产品对比

本文将深入对比 10 款团队任务管理软件:PingCode、Worktile、Trello、Todoist、Asana、monday.com、ClickUp、Wrike、Jira Confluence、TAPD。一、任务越来越多,真正难的是“协作不确定”团队任务管理这件事,最开始看起来很简单:…...

保姆级教程:PVE/Proxmox VE拔掉独显后网络失联?一招搞定网卡名绑定(Debian系通用)

无显卡环境下PVE服务器网络修复实战指南 当一台原本配备独立显卡的Proxmox VE服务器突然移除了显卡,许多运维人员会遭遇一个令人困惑的现象——网络连接完全中断。这种情况在家庭实验室和小型企业环境中尤为常见,用户往往为了节能或简化硬件配置而选择移…...

web后端python安全-总结

Python的import关键字--不⽤⾃⼰从零写功能,直接⽤别⼈封装好的成熟代码。 写爬⾍不⽤⾃⼰写⽹络请求代码,导⼊requests库就能直接⽤Python爬⾍编写(爬⽹络数字的工具)Python Web 后端80% 的漏洞来自注入、越权、明文密码、配置泄…...

SpringBoot + MyBatis + H2 实验报告

一、实验目的掌握 Spring Boot 项目基本结构熟悉 MyBatis 的基本使用(Mapper、SQL 映射)实现后端接口并通过 HTTP 请求访问实现数据库数据查询并返回给前端二、实验环境JDK:17开发工具:IntelliJ IDEA构建工具:Maven框架…...

JSON语法结构

‌1、JSON 值类型‌1.1‌ 字符串(String)‌:必须用‌双引号‌包裹,如 "hello"。1.2‌ 数字(Number)‌:整数或浮点数,如 42、-3.14、1.23e4。1.3‌ 布尔值(Boolean)‌:true 或 false。1.4‌ 空值(Null)‌&…...

正确构建与还原特征分解:NumPy 中特征向量矩阵的列优先约定详解

本文详解为何用 NumPy 进行特征分解重建时 eigenvectors 顺序和方向“看似错乱”,核心在于明确 eig() 的输入/输出约定——特征向量必须以列(而非行)组织,且数值精度、排序与标量倍数等数学本质需同步理解。 本文详解为何用 …...

媒力无限:坚守初心,做有温度的品牌同行者

在流量喧嚣的时代,总有一群人坚守媒体初心,用专业与温度,做有价值的传播、有意义的事。北京媒力无限品牌文化传播有限公司,由一群深耕中央级媒体十余年的资深媒体人创立,始终以「发现潜力企业,让更多好企业…...

砸钱、站台、被拉黑:孙宇晨与特朗普家族的「塑料友谊」翻车了

撰文:Yangz,Techub News曾经把特朗普称为「加密行业恩人」的孙宇晨,这两天彻底翻脸了。4 月 12 日下午,孙宇晨突然发文炮轰由特朗普家族支持的 DeFi 项目 World Liberty Financial(WLFI)。他抛出了一连串指…...

从mescroll到z-paging:一位开发者的实战迁移心路与性能跃迁

1. 为什么我要从mescroll迁移到z-paging 作为一个在uni-app生态中摸爬滚打多年的老手,我几乎用过所有主流的分页组件。mescroll曾经是我的首选,直到我遇到了z-paging。这个转变不是一时兴起,而是经历了三个项目的实战检验后做出的决定。 记得…...

国标GB28181平台EasyGBS筑牢智慧交通视频安全技术底座

传统交通安防系统往往面临设备异构难以统一管理、视频共享存在安全隐患、应急处置响应迟缓等痛点。作为深耕视频监控领域的国标GB28181平台,EasyGBS创新性地将国密GB35114安全能力全面融入产品架构,为智慧交通打造了一个“可视、可控、可管、可信”的一体…...

构建现代化Vue应用界面:Shadcn-Vue组件化架构设计与实践指南

构建现代化Vue应用界面:Shadcn-Vue组件化架构设计与实践指南 【免费下载链接】shadcn-vue Vue port of shadcn-ui 项目地址: https://gitcode.com/gh_mirrors/sh/shadcn-vue 在Vue开发生态中,构建一致、美观且可维护的UI界面一直是开发团队面临的…...

终极炉石传说自动化脚本:如何让游戏任务自动完成?

终极炉石传说自动化脚本:如何让游戏任务自动完成? 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 想要告别枯燥的日常任务&…...

仅限首批200名架构师开放:AIAgent因果推理模块参考实现v1.2(含Pyro+DoWhy+Custom SCM Runtime三引擎协同源码)

第一章:AIAgent架构中的因果推理模块 2026奇点智能技术大会(https://ml-summit.org) 因果推理模块是AIAgent实现可解释决策与反事实规划的核心组件,区别于传统统计相关性建模,它显式建模变量间的干预关系与结构因果模型(SCM&…...

容器网络方案

容器网络方案:构建云原生时代的连接桥梁 在云原生和微服务架构盛行的今天,容器技术已成为应用部署的核心载体。如何高效、安全地管理容器间的通信,成为开发者必须面对的挑战。容器网络方案正是解决这一问题的关键,它不仅需要满足…...

WMS 仓库管理系统核心功能模块全景图

该内容来自与AI的沟通,因为最近在参与人防门的项目,所以内容适配人防门行业。(一)基础数据管理模块(系统基石)物料主数据:管理钢板、型钢、密闭胶条、人防锁具等物料信息,支持批次 /…...

【三维重建】【3DGS系列】【深度学习】从概率密度到几何形体:3D高斯椭球的数学构建与可视化

1. 从概率密度到几何形体:3D高斯椭球的数学本质 第一次接触3D高斯泼溅(3DGS)技术时,最让我困惑的就是为什么一个概率分布函数能表示三维几何体。后来在复现论文代码时才发现,这背后的数学之美就藏在多维高斯分布的等概率密度面中。想象一下捏…...

学习推荐算法

算法推荐...

PX4无人机|MID360+FAST_LIO实战:从零搭建室内自主定位与悬停系统

1. 硬件准备与环境搭建 想要用PX4无人机搭配MID360激光雷达实现室内自主飞行,首先得把硬件凑齐。我用的是一台搭载微空科技MicoAir743V2飞控的450轴距无人机,机载电脑选用了12代i5处理器的迷你PC,跑的是Ubuntu 20.04系统。这里有个细节要注意…...

用TranslateGemma搭建私有翻译系统:数据安全,响应快速,效果稳定

用TranslateGemma搭建私有翻译系统:数据安全,响应快速,效果稳定 1. 为什么选择本地化翻译系统? 在当今全球化的工作环境中,高效准确的翻译工具已成为刚需。然而,传统的云端翻译服务存在几个关键痛点&…...

【2026奇点智能技术大会权威解码】:AIAgent代码审查的5大颠覆性范式与3大落地陷阱

第一章:2026奇点智能技术大会:AIAgent代码审查 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上,AIAgent代码审查成为核心实践议题之一。与传统静态分析工具不同,新一代AI驱动的审查代理具备上下文感知、…...

ACC自适应巡航系统实车测试全流程:从ISO标准到湿滑路面实战

ACC自适应巡航系统实车测试全流程:从ISO标准到湿滑路面实战 当一辆搭载ACC系统的测试车在暴雨中稳稳跟随前车通过积水路段时,仪表盘上跳动的蓝色车距标识不仅代表着技术的成熟度,更是对整套测试验证体系的无声褒奖。作为智能驾驶系统的核心功…...

收藏!8年开发转型AI大模型,踩遍坑后的真心话(小白/程序员必看)

做了8年后端开发,前几年一直在重复写业务逻辑、调接口、对接需求,在明确的需求边界里完成功能交付;直到两年前转型AI应用开发,从面对大模型“幻觉”时的手足无措,到如今能独立设计高可用、高可靠的AI服务,这…...

KAWASAKI 50999-2145R10控制卡

KAWASAKI 50999-2145R10 控制卡KAWASAKI 50999-2145R10 是用于川崎工业机器人控制系统中的主控制类电路板,通常安装在机器人控制柜内部,负责系统运行控制与信号处理,是机器人控制核心组件之一。用于川崎工业机器人控制系统属于主控制或核心控…...

算法训练营第二天| 27. 双指针

题目链接:https://leetcode.cn/problems/remove-element/ 视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP自己看到题目的第一想法看到题目要求原地移除数组中所有等于给定值的元素,并返回新长度,我第一反应是这肯定不能真…...

**发散创新:基于RBAC模型的开源权限管理系统设计与实现**在现代软件架构中,权限控制是系统安全的核

发散创新:基于RBAC模型的开源权限管理系统设计与实现 在现代软件架构中,权限控制是系统安全的核心组成部分。传统的角色权限管理(Role-Based Access Control, RBAC)虽已成熟,但在实际落地时仍面临灵活性差、扩展性弱等…...

客服机器人回答错误可自动撤回?智能 Agent 功能详解 + 消息撤回,发错答案快速补救?

在电商客服场景中,智能客服机器人已经成为企业降本增效的核心工具。然而,机器人再智能,也难免出现回答偏差、答非所问或信息过时的情况。客服人员忙碌接待时,往往来不及截图上报,就只能眼睁睁看着错误信息发给买家。这…...