MySQL中几种常见的嵌套查询详解
本篇文章向大家介绍《MySQL中几种常见的嵌套查询详解》,主要包括查询、mysql嵌套查询,具有一定的参考价值,需要的朋友可以参考一下。
几种常见的嵌套查询——以学员成绩为例
嵌套查询,也称为子查询,是实际工作中经常用到的一种查询方式。子查询其实就是在已有的查询语句中的where后面再嵌套一层查询语句,也就是把内层查询结果当做外层查询参照的数据表来使用。
在工作中,经常会遇见4种子查询,即含有比较运算符(>、>=、
# 创建学员信息表
CREATE TABLE stu_info
(
id INT AUTO_INCREMENT PRIMARY KEY,
iname VARCHAR(20),
gender CHAR(1),
department VARCHAR(10),
age TINYINT,
province VARCHAR(10),
email VARCHAR(50),
mobilephone CHAR(11)
);
# 向学员表中插入数据
INSERT INTO stu_info(iname,gender,department,age,province,email,mobilephone) VALUES
('张勇','男','数学系',23,'河南','sfddf123dd@163.com','13323564321'),
('王兵','男','数学系',25,'江苏','lss1993@163.com','17823774329'),
('刘伟','男','计算机系',21,'江苏','qawsed112@126.com','13834892240'),
('张峰','男','管理系',22,'上海','102945328@qq.com','13923654481'),
('董敏','女','生物系',22,'浙江','82378339@qq.com','13428439022'),
('徐晓红','女','计算机系',24,'浙江','xixiaohong@gmail.com','13720097528'),
('赵伊美','女','数学系',21,'江苏','zhaomeimei@163.com','13417723980'),
('王建国','男','管理系',24,'浙江','9213228402@qq.com','13768329901'),
('刘清','女','统计系',23,'安徽','lq1128@gmail.com','17823651180'),
('赵家和','男','计算机系',28,'山东','dcrzdbjh@163.com','13827811311');
# 创建学员成绩表
CREATE TABLE stu_score( id INT , Excel TINYINT, Tableau TINYINT, MySQL TINYINT );
# 向成绩表中插入数据
INSERT INTO stu_score VALUES
(1,87,72,88),
(3,90,66,72),
(2,90,70,86),
(4,88,82,76),
(8,92,67,80),
(10,88,82,89),
(5,79,66,60),
(7,91,78,90),
(6,82,79,88),
(9,85,70,85);
# 1.查询年龄超过所有学员平均年龄的学员信息
SELECT * FROM stu_info
WHERE age >= avg(age);
#需要注意的是Where后面不能使用聚合函数
#应该修改成
SELECT AVG(age) FROM stu_info;
SELECT * FROM stu_info
WHERE age>=23.3
#二合一
# 1.查询年龄超过所有学员平均年龄的学员信息
SELECT * FROM stu_info
WHERE age >= (SELECT AVG(age) FROM stu_info);
# 2.查询年龄不低于所属系平均年龄的学员信息
SELECT * FROM stu_info AS s1
WHERE age>= ( SELECT avg(age) FROM stu_info AS s2
WHERE s1.department = s2.department);
使用含比较运算符的嵌套查询时,需要注意,比较运算符后面的子查询只能返回一个结果。
含ANY或ALL关键词的嵌套查询
对于含比较运算符的嵌套查询来说,嵌套部分的查询语句只能返回一个值。那如果子查询返回多个值,就需要用到ANY或者ALL关键词了。通常,ANY / ALL 关键词经常和比较运算符连用,下面是6种比较运算符与ANY / ALL 关键词的搭配结果:

# 1.查询非管理系中比管理系任意一个学员年龄小的学员信息
SELECT * FROM stu_info
WHERE age
<p style="text-align:center"><img alt="" src="/uploads/20221231/167247273263afe89cd7553.png"></p>
<p>这里的查询逻辑是这样的:首先查询管理系中学生的年龄(去重),得到的结果是22和24;然后查询出非管理系中年龄比22或24年龄小的学生信息(也就是年龄小于24的非管理系学生信息)。</p>
<pre class="brush:sql;"># 2.查询非管理系中比管理系所有学员年龄大的学员信息
SELECT * FROM stu_info
WHERE age > ALL (SELECT DISTINCT age FROM stu_info WHERE department = '管理系')
AND department != '管理系';

这里的查询逻辑是这样的:首先查询管理系中学生的年龄(去重),得到的结果是22和24;然后查询出非管理系中年龄比22和24都大的学生信息(也就是年龄大于24的非管理系学生信息)。
含IN关键词的嵌套查询
当查询条件涉及某些已知的可枚举离散值的时候,我们就可以选择IN关键词来完成数据的提取。IN关键词有两种用法:
- 将可枚举的离散值直接写在值列表中
- 当离散值是基于其他表的筛选结果时,就可以使用嵌套查询,即把另一个表的查询语句块写在IN关键词后面的括号里。
# 1.查询数学系和计算机系的学员信息
SELECT * FROM stu_info WHERE department IN('数学系','计算机系');
# 2.查询与张勇、刘伟同一个系的学员信息
SELECT * FROM stu_info
WHERE department IN (SELECT department FROM stu_info WHERE iname IN('张勇','刘伟'));
# 3.查询MySQL成绩大于85分的学员信息
SELECT * FROM stu_info
WHERE id IN (SELECT id FROM stu_score WHERE MySQL > 85);
需要注意的是,在使用IN关键词的嵌套查询的时候,嵌套部分只能返回一个字段的信息(比如上面的department字段或者id字段),如果返回两个及以上字段信息则会出现语法错误。
含EXISTS关键词的嵌套查询
EXISTS 关键词的作用和 IN关键词非常类似,不同的是,通过EXISTS关键词的嵌套查询返回的不是具体的值集合,而是满足条件的逻辑值(也就是True / False)。也就是说,EXISTS的作用就是“判断是否存在满足某种条件的记录”,如果存在这样的记录就返回真(True),如果不存在这样的记录就返回假(False)。
# 查询MySQL成绩大于85分的学员信息 SELECT * FROM stu_info WHERE EXISTS (SELECT * FROM stu_score WHERE stu_score.id = stu_info.id AND MySQL > 85);
需要注意的是,使用EXISTS关键词的嵌套语句 WHERE与EXISTS关键词之间没有任何参数,这是因为EXISTS只需要一个参数,通常是在EXISTS右侧加一个子查询语句。此外,EXISTS后面的子查询中SELECT后面可以写表中任何一个字段或者星号或者一个常数,因为EXISTS后面的子查询只关心是否存在满足条件的记录。下面返回的结果都是一样:
【补充】关于IN和EXISTS两个关键词还有两个延伸关键词NOT IN和NOT EXISTS
# 查询数学系和计算机系之外的学员信息
# 方法一
SELECT * FROM stu_info
WHERE department NOT IN('数学系','计算机系');
#方法二
SELECT * FROM stu_info
WHERE NOT EXISTS(SELECT * FROM stu_score WHERE department IN('数学系','计算机系') and stu_score.id = stu_info.id);
# not exists的逻辑比较复杂,需要大家慢慢领会
# 主要看not exists括号中的sql语句是否有结果,无结果:才会继续执行where条件;有结果:视为 where条件不成立。
# 当子查询和主查询有关联条件时,相当于从主查询中去掉子查询的数据。
对于IN和EXISTS两个关键词,大多数情况下都可以相互替换,主要差别是使用效率问题,通常情况下采用EXISTS要比IN效率要高,但也要看实际情况具体使用:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况。
以上我们只是了解了where语句后面的子查询,除此之外,子查询还可以放在select语句、from语句、having语句后面。
附:其他使用方法和注意
除了上面这些还有很多很多,不过就不去细讲了,因为这些跟别的数据库差不多,只是为了给大家一个参考,提提就够了。
SELECT (SELECT s1 FROM t2) FROM t1;
SELECT (SELECT s2 FROM t1);
支持子查询的语法有:SELECT,INSERT,UPDATE,DELETE,SET和DO。
子查询可以使用任何普通查询中使用的关键词:如DINSTINCT,GROUP BY,LIMIT,ORDER BY,UNION,ALL,UNION ALL等。可以使用, =, =, 运算符进行比较,也可以使用ANY ,IN和SOME进行集合的匹配。
总结
以上就是《MySQL中几种常见的嵌套查询详解》的详细内容,更多关于mysql的资料请关注golang学习网公众号!
如何给MySQL添加自定义语法的方法示例
- 上一篇
- 如何给MySQL添加自定义语法的方法示例
- 下一篇
- 一文带你将csv文件导入到mysql数据库(亲测有效)
-
- 数据库 · MySQL | 1天前 |
- MySQL数值函数大全及使用技巧
- 117浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- 三种登录MySQL方法详解
- 411浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL数据备份方法与工具推荐
- 420浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL数据备份方法与工具推荐
- 264浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL索引的作用是什么?
- 266浏览 收藏
-
- 数据库 · MySQL | 6天前 |
- MySQL排序原理与实战应用
- 392浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQLwhere条件查询技巧
- 333浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用数据类型有哪些?怎么选更合适?
- 234浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL常用命令大全管理员必学30条
- 448浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL高效批量插入数据方法大全
- 416浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL性能优化技巧大全
- 225浏览 收藏
-
- 数据库 · MySQL | 1星期前 |
- MySQL数据备份4种方法保障安全
- 145浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ChatExcel酷表
- ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
- 3179次使用
-
- Any绘本
- 探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
- 3390次使用
-
- 可赞AI
- 可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
- 3419次使用
-
- 星月写作
- 星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
- 4525次使用
-
- MagicLight
- MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
- 3798次使用
-
- GoFrame框架缓存查询结果的示例详解
- 2022-12-23 231浏览
-
- 详解Mysql两表 join 查询方式
- 2022-12-31 105浏览
-
- Go 在 MongoDB 中常用查询与修改的操作
- 2023-01-07 451浏览
-
- go语言实现接口查询
- 2023-01-07 230浏览
-
- golang gorm多条件筛选查询操作
- 2022-12-30 360浏览

