广告推广网站怎么做/房地产销售怎么找客户
文章目录
- 1.简介
- 2.优势
- 3.分类
- 3.1 标量子查询
- 3.2 行子查询
- 3.3 列子查询
- IN 操作符
- ALL 操作符
- ANY/SOME 操作符
- 3.4 表子查询
- 4.关联子查询
- 5.EXISTS 和 NOT EXISTS
- 6.横向派生表
- 7.附录
- 参考文献
1.简介
子查询是另一个语句中的 SELECT 语句。
子查询也称为内查询(Inner Query),必须位于括号之中。包含子查询的查询称为外查询(Outer Query)。子查询支持多层嵌套,也就是子查询可以包含其他子查询。
子查询的外部语句可以是以下任一语句:SELECT、INSERT、UPDATE、DELETE、SET 或 DO。
下面是一个示例。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
在这个例子中,SELECT * FROM t1 ...
是外查询,位于括号中的SELECT column1 FROM t2
是子查询。
2.优势
使用子查询的主要优势有:
- 它们允许结构化查询,以便可以隔离语句的每个部分。
- 它们提供了需要复杂连接和并集的操作的替代方法。
- 许多人发现子查询比复杂的连接或联合更具可读性。 事实上,正是子查询的创新让人们产生了将早期 SQL 称为“结构化查询语言”的最初想法。
3.分类
根据子查询的结果可以将其分为多种类型。
- 标量子查询(Scalar Subquery):返回单个值(一行一列)的子查询。
- 行子查询(Row Subquery):返回单行结果(一行多列)的子查询。
- 列子查询(Column Subquery):返回单列结果(一列多行)的子查询。
- 表子查询(Table Subquery):返回一个虚拟表(多行多列)的子查询。
3.1 标量子查询
标量子查询的结果就像一个常量一样,可以用于 SELECT、WHERE、GROUP BY、HAVING 以及 ORDER BY 等子句中。
例如以下语句返回了月薪大于平均月薪的员工:
SELECT name, salary
FROM employee
WHERE salary > (SELECT AVG(salary)FROM employee
);+--------+---------+
| name | salary |
+--------+---------+
| 刘备 | 1000000 |
| 曹操 | 2000000 |
| 孙权 | 1500000 |
+--------+---------+
其中,括号内部的子查询用于获得员工的平均月薪,外查询用于返回月薪大于平均月薪的员工信息。
3.2 行子查询
行子查询可以当作一个一行多列的临时表使用。
以下语句查找所有与“关羽”在同一个部门并且职级相同的员工:
SELECT name, dept_id, job_level
FROM employee
WHERE (dept_id, job_level) = (SELECT dept_id, job_levelFROM employeeWHERE name = '关羽')
AND name != '关羽';+--------+---------+-----------+
| name | dept_id | job_level |
+--------+---------+-----------+
| 张飞 | 1 | 2 |
+--------+---------+-----------+
3.3 列子查询
列子查询可以当作一个一列多行的临时表使用。
当 WHERE 条件中的子查询返回多行数据时,不能再使用普通的比较运算符,因为它们不支持单个值和多个值的比较;如果想要判断某个字段是否在子查询返回的数据列表中,可以将子查询与 IN、ALL、ANY/SOME 操作符配合使用。
operand IN (subquery)
operand comparison_operator ALL (subquery)
operand comparison_operator ANY (subquery)
operand comparison_operator SOME (subquery)
其中 comparison_operator 是下面运算符之一:
= > < >= <= <> !=
IN 操作符
IN 操作符表示表达式是否在子查询的结果列中,如果在,如返回 TRUE。
SELECT s1 FROM t1 WHERE s1 IN (SELECT s1 FROM t2);
比如查找“刘备”和“孙权”所在部门的员工:
SELECT name, dept_id
FROM employee
WHERE dept_id IN (SELECT dept_idFROM employeeWHERE name IN ('刘备','孙权')
)
AND name NOT IN ('刘备','孙权');+-----------+---------+
| name | dept_id |
+-----------+---------+
| 关羽 | 1 |
| 张飞 | 1 |
| 黄月英 | 1 |
| 吕蒙 | 3 |
| 黄盖 | 3 |
+-----------+---------+
NOT IN 操作符执行和 IN 相反的操作,也就是当表达式在列子查询结果中时为 TRUE。
ALL 操作符
除了 IN 运算符之外,ALL、ANY/SOME 运算符与比较运算符的结合也可以用于判断子查询的返回结果。
ALL 必须跟在比较运算符之后,如果表达式与子查询返回列中的所有值的比较结果为 TRUE,则返回 TRUE。
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
对于 ALL 操作符,有两个需要注意的情况,就是子查询结果为空或者存在 NULL 值。
SELECT name, salary
FROM employee
WHERE salary > ALL (SELECT 999999 FROM anonymity WHERE 1=0);
以上查询会返回所有员工,因为子查询返回结果为空集,外查询相当于没有 WHERE 条件。
SELECT name, salary
FROM employee
WHERE salary > ALL (SELECT MAX(999999) FROM anonymity WHERE 1=0);
以上查询会返回返回空集,因为子查询返回 NULL,任何数值和 NULL 比较的结果都是未知(unknown)。
NOT IN 是 <> ALL 的别名。 因此,这两个语句是相同的:
SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);
ANY/SOME 操作符
SOME 是 ANY 的别名,所以 SOME 等同于 ANY。
ANY 关键字必须跟在比较运算符之后,如果表达式与子查询返回列中的任何值的比较结果为 TRUE,则返回 TRUE。
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
= ANY 和 IN 操作符等价。
3.4 表子查询
当子查询返回的结果包含多行多列数据时,称为表子查询。表子查询通常用于 FROM 子句或者查询条件中。
当子查询出现在 FROM 子句中时,相当于创建了一个语句级别的派生表(Derived Table)。
SELECT ... FROM (subquery) [AS] tbl_name ...
JSON_TABLE() 函数生成一个表,并提供另一种创建派生表的方法:
SELECT * FROM JSON_TABLE(arg_list) [AS] tbl_name ...
[AS] tbl_name 子句是强制性的,因为 FROM 子句中的每个表都必须有一个名称。 派生表中的任何列都必须具有唯一名称。tbl_name 后面可以跟一个带括号的派生表列名称列表。
SELECT ... FROM (subquery) [AS] tbl_name (col_list) ...
列名的数量必须与表列的数量相同。
4.关联子查询
在上面的示例中,子查询和外查询之间没有联系,可以单独运行。这种子查询也称为非关联子查询(Non-correlated Subquery)。
另一类子查询会引用外查询中的字段,从而与外部查询产生关联,也称为关联子查询(Correlated Subquery)。
例如以下示例通过使用关联子查询获得各个部门的员工数量:
SELECT d.name AS "部门名称",(SELECT count(*)FROM employeeWHERE dept_id = d.id) as "员工数量"
FROM department d;+--------------+--------------+
| 部门名称 | 员工数量 |
+--------------+--------------+
| 蜀汉部 | 4 |
| 曹魏部 | 3 |
| 孙吴部 | 3 |
+--------------+--------------+
其中,子查询的 WHERE 条件中使用了外查询的部门编号(d.id),从而与外查询产生关联。该语句执行时,外查询先检索出所有的部门数据,针对每条记录再将 d.id 传递给子查询,子查询返回每个部门的员工数量。
5.EXISTS 和 NOT EXISTS
如果子查询返回任何行,则 EXISTS 子查询为 TRUE,NOT EXISTS 子查询为 FALSE。
SELECT column1 FROM t1 WHERE EXISTS (SELECT * FROM t2);
传统上,EXISTS 子查询以 SELECT * 开头,但它也可以以 SELECT 5 或 SELECT column1 或任何其他内容开头。 MySQL 会忽略此类子查询中的 SELECT 列表,因此没有区别。
对于前面的示例,如果 t2 包含任何行,甚至只包含 NULL 值的行,则 EXISTS 条件为 TRUE。 这实际上是一个不太可能的例子,因为 [NOT] EXISTS 子查询几乎总是包含相关性。
下面看一个更加具体的例子。比如返回了存在女性员工的部门:
SELECT d.name
FROM department d
WHERE EXISTS (SELECT *FROM employee eWHERE e.gender = '女'AND e.dept_id = d.id);+-----------+
| name |
+-----------+
| 蜀汉部 |
+-----------+
其中,EXISTS 之后是一个关联子查询,先执行外查询找到 d.dept_id;然后依次将 d.dept_id 传递给子查询,判断该部门是否存在女性员工,如果存在则返回部门信息。
NOT EXISTS 执行相反的操作。如果想要查找不存在女性员工的部门,可以将上例中的 EXISTS 替换成 NOT EXISTS。
6.横向派生表
对于派生表而言,它必须能够单独运行,而不能依赖其他表。
例如,以下语句想要返回每个部门内月薪最高的员工:
SELECT d.name, t.name, t.salary
FROM department d
LEFT JOIN (SELECT e.dept_id, e.name, e.salaryFROM employee eWHERE e.dept_id = d.idORDER BY e.salary DESCLIMIT 1) t ON d.id = t.dept_id;
ERROR 1054 (42S22): Unknown column 'd.id' in 'where clause'
该语句失败的原因在于子查询 t 不能引用外查询中的 department 表。
从 MySQL 8.0.14 开始,派生表支持 LATERAL 关键字前缀,表示允许派生表引用它所在的 FROM 子句中的其他表。这种派生表被称为横向派生表(Lateral Derived Table)。
对于上面的问题,可以使用 LATERAL 派生表实现:
SELECT d.name, t.name, t.salary
FROM department d
LEFT JOIN LATERAL (SELECT e.dept_id, e.name, e.salaryFROM employee eWHERE e.dept_id = d.idORDER BY e.salary DESCLIMIT 1) t on d.id = t.dept_id;
该语句在 LEFT JOIN 之后加上了一个 LATERAL 关键字,使得子查询 t 能够引用前面的 department 表中的字段。
如果你使用的是 MySQL 5.7 以及之前的版本,可以利用 MySQL 中的自定义变量实现相同的效果:
SELECT d.name dept_name, w.name emp_name, w.salary
FROM department d
LEFT JOIN (SELECT *FROM (SELECT a.*, IF(@did = a.dept_id, @rn := @rn+1, @rn := 1) AS rn, @did := a.dept_idFROM(SELECT * FROM employee e ORDER BY dept_id, salary DESC) a) AS tWHERE t.rn <= 1
) AS w ON d.id = w.dept_id;+-----------+----------+---------+
| dept_name | emp_name | salary |
+-----------+----------+---------+
| 蜀汉部 | 刘备 | 1000000 |
| 曹魏部 | 曹操 | 2000000 |
| 孙吴部 | 孙权 | 1500000 |
+-----------+----------+---------+
上面的查询语句使用了自定义变量,有几处需要特别解释一下。
语句IF(@did = a.dept_id, @rn := @rn+1, @rn := 1) AS rn
这是一个 IF 语句,用于计算排名。它检查当前行的部门 ID (a.dept_id) 是否与前一行的部门 ID (@did) 相同。如果相同,则排名 (@rn) 自增 1,表示同一个部门内的下一个员工。如果部门 ID 不同(即进入了新的部门),则排名 (@rn) 被重置为 1,表示这是新部门的第一个员工。AS rn 表示将计算出的排名别名为 rn,它将作为结果集的一部分返回。
@did := a.dept_id
将当前行的部门 ID (a.dept_id) 赋值给用户变量 @did。该变量用在前面的 IF 语句中,用于给部门内的员工计算排名。
再给每个部门员工按照工资排序并编上部门内部排名 rn 后,将结果作为派生表 t,通过 SELECT 查询出所有部门内薪资排名第一的员工。
最后和部门表连表查询出每个部门内月薪最高的员工。
7.附录
本文示例用到的员工表(employee)和部门表(deparment)建表与数据如下。
员工表(employee):
CREATE TABLE employee(id INT UNSIGNED NOT NULL AUTO_INCREMENT,name varchar(64) NOT NULL,dept_id INT UNSIGNED,job_level INT UNSIGNED,salary INT UNSIGNED,gender CHAR(1) DEFAULT '男',PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4INSERT INTO employee(name,dept_id,job_level,salary,gender)
VALUES
('刘备', 1,1, 1000000, '男'),
('关羽', 1,2, 100000, '男'),
('张飞', 1,2, 100000, '男'),
('黄月英',1,3, 80000, '女'),
('曹操', 2,1, 2000000, '男'),
('典韦', 2,2, 200000, '男'),
('张辽', 2,2, 200000, '男'),
('孙权', 3,1, 1500000, '男'),
('吕蒙', 3,2, 150000, '男'),
('黄盖', 3,2, 150000, '男')
部门表(deparment):
CREATE TABLE department(id INT UNSIGNED NOT NULL AUTO_INCREMENT ,name varchar(64) NOT NULL,PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4INSERT INTO department(name)
VALUES
('蜀汉部'),
('曹魏部'),
('孙吴部')
参考文献
MySQL 8.0 Reference Manual :: 13.2.15 Subqueries
《MySQL 入门教程》第 19 篇 子查询 - 不剪发的Tony老师
相关文章:

MySQL 子查询
文章目录 1.简介2.优势3.分类3.1 标量子查询3.2 行子查询3.3 列子查询IN 操作符ALL 操作符ANY/SOME 操作符 3.4 表子查询 4.关联子查询5.EXISTS 和 NOT EXISTS6.横向派生表7.附录参考文献 1.简介 子查询是另一个语句中的 SELECT 语句。 子查询也称为内查询(Inner …...

Ubuntu离线或在线安装CMake
首先下载适用于Ubuntu的CMake安装包,可以去官网下载,也可以通过下面的命令下载(需要联网): wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz将下载的安装包进行解压: tar -xvzf cmake-3.22.1.ta…...

后端面试话术集锦第 十七 篇:MySQL面试话术
这是后端面试集锦第十七篇博文——MySQL面试话术❗❗❗ 1. 解释一下单列索引和联合索引 单列索引是指在表的某一列上创建索引。 联合索引是在多个列上联合创建索引。 单列索引可以出现在where条件的任何位置,而联合索引需要按照一定的顺序来写。在多条件查询的时候,联合索引…...

< 文件资源管理器 > 和 < 此电脑 > 有什么区别?
“文件资源管理器”和 “此电脑” 的区别 1. 文件和文件夹管理:2. 访问存储设备:3. 搜索功能:4. 视图和排序选项:5. 快速访问: 主要的区别1. 界面和用途:2. 显示内容:3. 导航: 在Win…...

线上问诊:可视化展示
系列文章目录 线上问诊:业务数据采集 线上问诊:数仓数据同步 线上问诊:数仓开发(一) 线上问诊:数仓开发(二) 线上问诊:数仓开发(三) 线上问诊:可视化展示 文章目录 系列文章目录前言一、全流程调度1.生产新…...

如何选择合适的HTTP代理服务器
HTTP代理服务器是一种常见的网络代理方式,它可以帮助用户隐藏自己的IP地址,保护个人隐私和安全。然而,选择合适的HTTP代理服务器并不容易,需要考虑多个因素。本文将介绍如何选择合适的HTTP代理服务器。 了解代理服务器的类型 HTT…...

Car Window Control Reset
大众汽车窗口自动升降失效,重置: 扣住5秒,重启汽车,试一下车钥匙,和再重试这个按钮,扣一下试一试...

序列号序列号
主板序列号 string str;str bios.GetSystemSerialNumber(); //wentai//str1 bios.GetSystemECSerialNumber();//CLogHelp::ITCLog(str1);LocalSN str.c_str();str bios.GetSystemVersion();LocalMode str.c_str();string str1;str1 bios.GetSystemSerialNumber();CLogHe…...

SSM(Spring-Mybatis-SpringMVC)
文章目录 1. 介绍1.1 概念介绍 2 SSM整合框架3. SSM功能模块开发4 测试4.1 业务层接口测试4.2 表现层接口测试 5.优化 -表现层数据封装6.异常处理 1. 介绍 1.1 概念介绍 SSM项目是指基于SpringSpringMVCMyBatis框架搭建的Java Web项目。 Spring是负责管理和组织项目的IOC容器和…...

MySQL——数据的删除以及MySQL中的约束
删除数据 删除表中的一行数据,也必须加上 WHERE条件,否则整列的数据都会被删除。删除语句: delete from 表名 where 条件; 他会将所有的符合条件的数据删除,如果不写条件,则表中的数据全部删除: 如果不添…...

静态路由 网络实验
静态路由 网络实验 拓扑图初步配置R1 ip 配置R2 ip 配置R3 ip 配置查看当前的路由表信息查看路由表信息配置静态路由测试 拓扑图 需求:实现 ip 192.168.1.1 到 192.168.2.1 的通信。 初步配置 R1 ip 配置 system-view sysname R1 undo info-center enable # 忽略…...

数据结构-01 数据结构基本概念,算法时间复杂度,空间复杂度
0 数据结构概述 四门课的关系 1 绪论 数据对象、数据元素、数据项关系 1.1 数据结构的基本概念 1.2 算法和算法评价 小练习 空间复杂度中的递归调用 n只是传入 n也是数组,计算存储数组flag的空间大小...

【Redis】Bitmap 使用及应用场景
前言:bitmap 占用空间小,查询效率高,在一些场景中使用 bitmap 是一个很好的选择。 一、bitmap 相关命令 SETBIT - 设置指定位置的比特值,可以设为 1 或 0 例如 SETBIT key 10 1,将在 key 对应的 bitmap 中第10位设置为…...

C#,数值计算——用于积分函数与方法的Stiel类的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Stiel { public class pp : UniVarRealValueFun, RealValueFun { public Stiel st { get; set; } null; public pp() { } public doubl…...

报错:为什么数组明明有内容但打印的length是0
文章目录 一、问题二、分析三、解决1.将异步改为同步2.设置延迟 一、问题 在日常开发中,for 循环遍历调用接口,并将接口返回的值进行拼接,即push到一个新的数组中,但是在for循环内部是可以拿到这个新的数组,而for循环…...

go gin gorm连接postgres postgis输出geojson
go gin gorm连接postgres postgis输出geojson 1. 技术环境 go-gin-gorm postgres-postgis go vscode环境安装-智能提示配置 2. 简单实现代码 思路就是:采用原生sql实现查询、更新等,采用gorm的raw来执行sql语句 package mainimport ("fmt"&q…...

4. Java 的线程安全机制之`volatile`
前言:在多线程编程过程中,线程安全是一个非常重要的概念,它有助于保证多线程程序的正确性和健壮性。其中,volatile是实现线程安全的一种方式,保证内存的立马可见,下面将会详细介绍。 文章目录 是什么为什么…...

Vue + Element UI前端篇(二):Vue + Element 案例
Vue Element UI 实现权限管理系统 前端篇(二):Vue Element 案例 导入项目 打开 Visual Studio Code,File --> add Folder to Workspace,导入我们的项目。 安装 Element 安装依赖 Element 是国内饿了么公司提…...

Qt5中connect信号槽无效问题 C++
在写QT的组件信号槽时遇到一个问题,我的QspinBox组件用connect连接函数总是无效,解决办法是: 在QT5中推荐使用如下形式连接槽函数: QObject::connect(ui->spinBox,QOverload<int>::of(&QSpinBox::valueChanged),th…...

服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决
https://blog.csdn.net/zxlyx/article/details/120397006 本文给出一个 TIME_WAIT 状态的 TCP 连接过多的问题的解决思路,非常典型,大家可以好好看看,以后遇到这个问题就不会束手无策了。 问题描述 模拟高并发的场景,会出现批量…...

【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...

肖sir__设计测试用例方法之编写测试用例12
编写测试用例 一、用例模板 案例1: 案例2: 案例3: 二、测试工作重点: 编写测试用例、 执行用例 (依据测试用例) 三、测试流程(h模型) 1、拿到需求 2、编写测试计划(…...

Android 11.0 ota升级之Systemui下拉状态栏quick_settings_tiles_default值减少时更新的功能实现
1.前言 在11.0的系统rom定制化开发中,在定制功能需求中,在进行systemui的下拉状态栏定制以后,当需要ota升级的时候,发现在systemui下拉状态栏的快捷功能键部分去掉的 一些快捷功能并没有减少,这是因为systemui有缓存造成的只有清理缓存或者恢复出厂设置后才正常,所以今天…...
Android Studio中创建java项目
1.创建普通的android工程 2.创建一个module 3.module类型选择java library 4.填写libary和class的名字 5.生成的工程如图所示 6.然后点击Run --- Edit Configurations... 选择Application选项 设置所需要的参数 选中myjavalib后点击OK。然后打开刚创建的lib的gradle 编辑gradl…...

冠达管理:“旺季”来临,煤炭板块走高,云煤能源、陕西黑猫涨停
煤炭板块1日盘中发力走高,截至发稿,云煤动力、陕西黑猫涨停,兖矿动力涨超7%,晋控煤业、华阳股份涨超6%,山西焦煤、平煤股份涨超5%。 组织表明,动力大通胀背景下,未来3-5年煤炭供需偏紧的格局仍…...

【EI检索】第四届公共卫生与数据科学国际学术研讨会(ICPHDS 2023)
第四届公共卫生与数据科学国际学术研讨会(ICPHDS 2023) 2023 4th International Conference on Public Health and Data Science(ICPHDS 2023) 第四届公共卫生与数据科学国际学术研讨会(ICPHDS 2023)将于…...

对时序数据进行分类与聚类
我在最近的工作中遇到了一个问题,问题是我需要根据银行账户在一定时间内的使用信息对该账户在未来的一段时间是否会被销户进行预测。这是一个双元值的分类问题,只有两种可能,即会被销户和不会被销户。针对这个问题一般来说有两种解决策略。 …...

Win10如何找回图片查看器
近期有小伙伴反映在将Win10升级之后发现电脑自带的图片查看器没有了,这是怎么回事,该怎么找回呢,下面小编就给大家详细介绍一下Win10找回图片查看器的方法,有需要的小伙伴快来和小编一起阅读看看吧。 win10找回windows照片查看器…...

【脑机接口】基于运动想象的康复指导在脑卒中偏瘫患者中的应用
【摘要】 目的 探讨运动想象康复指导对脑卒中偏瘫患者的康复效果及意义。 方法 将 60例脑卒中偏瘫患者随机分为观察组(n31)和对照组(n29),对照组的康复训练指导采用讲解示范法,观察组采用运动想象法 。比较两组 患者 的运 动功能 、日常生活 活动能力及 …...

vue-cli中vuex下$store”未在实例上定义
这里写目录标题 一、版本的问题二、vuex中的代码 一、版本的问题 vuex版本不对,获取不到store,vue默认vue3版本,vuex默认vuex4版本,vuex4只能在vue3中使用,在vue2中能使用vuex3,那么不能默认下载最新的版本 npm instal…...