【SQL学习进阶】从入门到高级应用(九)

文章目录
- 子查询
- 什么是子查询
- where后面使用子查询
- from后面使用子查询
- select后面使用子查询
- exists、not exists
- in和exists区别
- union&union all
- limit
🌈你好呀!我是 山顶风景独好
💕欢迎来到我的博客,很高兴能够在这里和您见面!
💕希望您在这里可以感受到一份轻松愉快的氛围!
💕这里不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!
🏠大家订阅本专栏!本专栏旨在为SQL初学者提供一条逐步迈向高级应用的学习之路,带您从零开始,一步一步练习,逐步掌握SQL的精髓,实现技能的提升与飞跃!😊
子查询
什么是子查询
- select语句中嵌套select语句就叫做子查询。
- select语句可以嵌套在哪里?
- where后面、from后面、select后面都是可以的。
select ..(select)..
from ..(select)..
where ..(select)..
where后面使用子查询
案例:找出高于平均薪资的员工姓名和薪资。
错误的示范:
select ename,sal from emp where sal > avg(sal);
错误原因:where后面不能直接使用分组函数。
可以使用子查询:
select ename,sal from emp where sal > (select avg(sal) from emp);
from后面使用子查询
小窍门:from后面的子查询可以看做一张临时表。
案例:找出每个部门的平均工资的等级。
第一步:先找出每个部门平均工资。
select deptno, avg(sal) avgsal from emp group by deptno;

第二步:将以上查询结果当做临时表t,t表和salgrade表进行连接查询。条件:t.avgsal between s.losal and s.hisal
select t.*,s.grade from (select deptno, avg(sal) avgsal from emp group by deptno) t join salgrade s on t.avgsal between s.losal and s.hisal;

select后面使用子查询
select e.ename,(select d.dname from dept d where e.deptno = d.deptno) as dname from emp e;

exists、not exists
在 MySQL 数据库中,EXISTS(存在)用于检查子查询的查询结果行数是否大于0。如果子查询的查询结果行数大于0,则 EXISTS 条件为真。(即存在查询结果则是true。)
主要应用场景:
- EXISTS 可以与 SELECT、UPDATE、DELETE 一起使用,用于检查另一个查询是否返回任何行;
- EXISTS 可以用于验证条件子句中的表达式是否存在;
- EXISTS 常用于子查询条件过滤,例如查询有订单的用户等。
drop table if exists t_customer;
drop table if exists t_order;create table t_customer(customer_id int,customer_name varchar(32)
);create table t_order(order_id int,order_price decimal(5,1),customer_id int
);insert into t_customer(customer_id,customer_name) values(1,'zhangsan');
insert into t_customer(customer_id,customer_name) values(2,'lisi');
insert into t_customer(customer_id,customer_name) values(3,'wangwu');insert into t_order(order_id, order_price, customer_id) values(10, 1000.0, 1);
insert into t_order(order_id, order_price, customer_id) values(20, 2000.0, 1);
insert into t_order(order_id, order_price, customer_id) values(30, 3000.0, 2);
insert into t_order(order_id, order_price, customer_id) values(40, 4000.0, 2);commit;
select * from t_customer;
select * from t_order;
现在我们来看一个简单的案例,假设我们要查询先前有过订单的顾客,而订单信息保存在 t_order 表中,顾客信息保存在 t_customer 表中。我们可以使用以下 sql 语句:
select * from t_customer c where exists(select * from t_order o where o.customer_id=c.customer_id);
在这个查询语句中,子查询用于检查是否有订单与每个客户相关联。如果子查询返回至少一行,则表示该顾客已经下过订单,并返回此客户的所有信息,否则该顾客将不被包含在结果中。
以下是这个查询语句的执行过程:
- 首先查询表 t_customer 中的所有顾客信息(以下简称为顾客表);
- 对于顾客表中的每一行,都执行一次子查询,子查询查询该顾客有没有订单,如果有,则在结果集中保留该顾客信息;如果没有,则将该顾客排除;
- 最终返回有订单顾客的所有信息。
除了 EXISTS,也可以使用 NOT EXISTS 条件从 SELECT、UPDATE、DELETE 语句中获取子查询的返回结果。NOT EXISTS 用于检查一个子查询是否返回任何行,如果没有行返回,那么 NOT EXISTS 将返回 true。
例如,我们想要查找所有没有下过订单的顾客,可以使用以下 sql 语句:
select * from t_customer c where not exists(select * from t_order o where o.customer_id=c.customer_id);
在这个查询语句中,如果没有任何与顾客相关联的订单,则 NOT EXISTS 子查询将返回一个空结果集,这时候 WHERE 条件为 true,并将返回所有顾客信息。如果顾客有订单,则 NOT EXISTS 子查询的结果集将不为空,WHERE 条件为 false,则不会返回该顾客的信息。
总之,无论是 EXISTS 还是 NOT EXISTS,都是非常有用的 SQL 工具。可以通过它们来结合子查询来动态过滤查询结果,使 SQL 查询变得更加灵活和高效。
in和exists区别
IN 和 EXISTS 都是用于关系型数据库查询的操作符。不同之处在于:
- IN 操作符是根据指定列表中的值来判断是否满足条件,而 EXISTS 操作符则是根据子查询的结果是否有返回记录集来判断。
- EXISTS 操作符通常比 IN 操作符更快,尤其是在子查询返回记录数很大的情况下。因为 EXISTS 只需要判断是否存在符合条件的记录,而 IN 操作符需要比对整个列表,因此执行效率相对较低。
- IN 操作符可同时匹配多个值,而 EXISTS 只能匹配一组条件。
下面是一个简单的示例,用于演示 IN 和 EXISTS 之间的区别。假设我们有两个表 orders 和 products,orders 表中记录了订单信息,products 表中记录了商品信息。现在我们想查询所有“手机”和“平板电脑”这两种商品中,至少有一笔订单销售了 $1000 以上的商品:
使用 IN 操作符:
SELECT *
FROM products
WHERE product_name IN ('手机', '平板电脑')
AND product_id IN (SELECT product_idFROM ordersWHERE order_amount > 1000
);
使用 EXISTS 操作符:
SELECT *
FROM products
WHERE product_name IN ('手机', '平板电脑')
AND EXISTS (SELECT *FROM ordersWHERE orders.product_id = products.product_idAND order_amount > 1000
);
总之,IN 和 EXISTS 都是用于条件过滤的操作符,但其实现方式和性能特点都不同,需要根据具体情况进行选择和使用。
union&union all
不管是union还是union all都可以将两个查询结果集进行合并。
union会对合并之后的查询结果集进行去重操作。
union all是直接将查询结果集合并,不进行去重操作。(union all和union都可以完成的话,优先选择union all,union all因为不需要去重,所以效率高一些。)


案例:查询工作岗位是MANAGER和SALESMAN的员工。
select ename,sal from emp where job='MANAGER'
union all
select ename,sal from emp where job='SALESMAN';
以上案例采用or也可以完成,那or和union all有什么区别?考虑走索引优化之类的选择union all,其它选择or。
两个结果集合并时,列数量要相同:

limit
- limit作用:查询第几条到第几条的记录。通常是因为表中数据量太大,需要分页显示。
- limit语法格式:
- limit 开始下标, 长度
- 案例:查询员工表前5条记录
select ename,sal from emp limit 0, 5;
如果下标是从0开始,可以简写为:
select ename,sal from emp limit 5;
- 查询工资排名在前5名的员工(limit是在order by执行之后才会执行的)
select ename,sal from emp order by sal desc limit 5;
- 通用的分页sql
假设每页显示3条记录:pageSize = 3
第1页:limit 0, 3
第2页:limit 3, 3
第3页:limit 6, 3
第pageNo页:limit (pageNo - 1)*pageSize, pageSize
✨ 这就是今天要分享给大家的全部内容了,我们下期再见!😊
🏠 我在CSDN等你哦!我的主页😍

相关文章:
【SQL学习进阶】从入门到高级应用(九)
文章目录 子查询什么是子查询where后面使用子查询from后面使用子查询select后面使用子查询exists、not existsin和exists区别 union&union alllimit 🌈你好呀!我是 山顶风景独好 💕欢迎来到我的博客,很高兴能够在这里和您见面…...
Web前端三大主流框架技术分享
在当今快速发展的互联网时代,Web前端技术作为连接用户与服务的桥梁,其重要性不言而喻。随着技术的不断进步,为了提升开发效率、优化用户体验,一系列强大的前端框架应运而生。其中,Angular、React和Vue.js作为当前最为主…...
dockers安装mysql
1.dockerhub上搜索自己需要安装得镜像版本 dockerhub网址:https://hub-stage.docker.com docker pull mysql:5.7 #下载自己需要得版本2.启动容器实例,并且挂载容器数据卷 docker run -d -p 3306:3306 --privilegedtrue \ -v /home/mysql/log:/var/log/…...
100道面试必会算法-27-美团2024面试第一题-前缀和矩阵
100道面试必会算法-27-美团2024面试第一题-前缀和矩阵 问题解读 给定一个 n x n 的二进制矩阵,每个元素是 0 或 1。我们的任务是计算矩阵中所有边长为 k 的子矩阵中,包含特定数量 1 的情况。例如,我们希望找到所有边长为 k 的子矩阵中包含 k…...
从摇一摇到弹窗,AD无处不在?为了不再受打扰,推荐几款好用的屏蔽软件,让手机电脑更清爽
当我们沉浸在智能手机带来的便捷与乐趣中时,内置AD如同不速之客,时常打断我们的体验。 尤其是手机上那些“摇一摇”跳转,稍有不慎就会跳转到其他应用,令人不胜其烦。同样,电脑上的内置AD也如影随形,影响了我…...
HackTheBox-Machines--Nibbles
Nibbles 测试过程 1 信息收集 NMAP 80 端口 网站出了打印出“Hello world!”外,无其他可利用信息,但是查看网页源代码时,发现存在一个 /nibbleblog 文件夹 检查了 http://10.129.140.63/nibbleblog/ ,发现了 /index.p…...
东方博宜1703 - 小明买水果
问题描述 小明去超市买了若干斤水果,你能根据水果的单价,小明买的水果数量,编一个程序计算出总金额,并打印出清单。 输入 输入两个值, 第一个为商品的单价,是一个小数。 第二个为商品的数量,…...
mac电脑用谷歌浏览器对安卓手机H5页面进行inspect
1、mac上在谷歌浏览器上输入 chrome://inspect 并打开该页面。 2、连接安卓手机到Mac电脑:使用USB数据线将安卓手机连接到Mac电脑。 3、手机上打开要的h5页面 Webview下面选择要的页面,点击inspect,就能像谷歌浏览器页面打开下面的页面&#…...
动手学深度学习(Pytorch版)代码实践-深度学习基础-01基础函数的使用
01基础函数的使用 主要内容 张量操作:创建和操作张量,包括重塑、填充、逐元素操作等。数据处理:使用pandas加载和处理数据,包括处理缺失值和进行one-hot编码。线性代数:包括矩阵运算、求和、均值、点积和各种范数计算…...
vm-bhyve:bhyve虚拟机的管理系统@FreeBSD
先说情况,当前创建虚拟机后网络没有调通....不明白是最近自己点背,还是确实有难度... 缘起: 前段时间学习bhyve虚拟机,发现bvm这个虚拟机管理系统,但是实践下来发现网络方面好像有问题,至少我花了两天时间…...
【Java】刚刚!突然!紧急通知!垃圾回收!
【Java】刚刚!突然!紧急通知!垃圾回收! 文章目录 【Java】刚刚!突然!紧急通知!垃圾回收!从C语言的内存管理引入:手动回收Java的垃圾回收机制引用计数器循环引用问题 可达…...
[Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解
目录 0.子序列 vs 子数组1.最长递增子序列1.题目链接2.算法原理详解3.代码实现 2.摆动序列1.题目链接2.题目链接3.代码实现 0.子序列 vs 子数组 子序列: 相对顺序是跟源字符串/数组是一致的但是元素和元素之间,在源字符串/数组中可以是不连续的一般时间…...
【稳定检索】2024年心理学与现代化教育、媒体国际会议(PMEM 2024)
2024年心理学与现代化教育、媒体国际会议 2024 International Conference on Psychology and Modern Education and Media 【1】会议简介 2024年心理学与现代化教育、媒体国际会议即将召开,这是一场汇聚全球心理学、教育及媒体领域精英的学术盛宴。 本次会议将深入探…...
深入了解diffusion model
diffusion model是如何运作的 会输入当时noise的严重程度,根据我们的输入来确定在第几个step,并做出不同的回应。 Denoise模组内部实际做的事情 产生一张图片和产生noise难度是不一样的,若denoise 模块产生一只带噪声的猫说明这个模块已经会…...
TransmittableThreadLocal原理
1、原理 TransmittableThreadLocal(简称TTL)是阿里巴巴开源的一个Java库,用于解决线程池中线程本地变量传递的问题。其底层原理主要是基于Java的ThreadLocal机制并对其进行扩展,以支持在父子线程间以及线程池中任务切换时&#x…...
华为昇腾310B初体验,OrangePi AIpro开发板使用测评
0、写在前面 很高兴收到官方的OrangePi AIpro开发板测试邀请,在过去的几年中,我在自己的博客写了一系列有关搭载嵌入式Linux系统的SBC(单板计算机)的博文,包括树莓派4系列、2K1000龙芯教育派、Radxa Rock5B、BeagleBo…...
GPTQ 量化大模型
GPTQ 量化大模型 GPTQ 算法 GPTQ 算法由 Frantar 等人 (2023) 提出,它从 OBQ 方法中汲取灵感,但进行了重大改进,可以将其扩展到(非常)大型的语言模型。 步骤 1:任意顺序量化 OBQ 方法选择权重按特定顺序…...
【GD32】05 - PWM 脉冲宽度调制
PWM PWM (Pulse Width Modulation) 是一种模拟信号电平的方法,它通过使用数字信号(通常是方波)来近似地表示模拟信号。在PWM中,信号的占空比(即高电平时间占整个周期的比例)被用来控制平均输出电压或电流。…...
JVM思维导图
帮助我们快速整理和总结JVM相关知识,有结构化认识和整体的思维模型 JVM相关详细知识和面试题...
Ollama+OpenWebUI+Phi3本地大模型入门
文章目录 Ollama+OpenWebUI+Phi3本地大模型入门一、基础环境二、Ollama三、OpenWebUI + Phi3Ollama+OpenWebUI+Phi3本地大模型入门 完全不懂大模型的请绕道,相信我李一舟的课程比较适合 Ollama提供大模型运行环境,OpenWebUI提供UI,Phi3就是那个大模型。 当然,Ollama支持超级…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
