MySQL数据库,子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。

例:想查询工资比BLACK的工资高的员工的信息

SELECT ename , sal 
FROM emp
WHERE sal > (
			SELECT sal 
			FROM emp 
			WHERE ename = 'BLAKE'
            );

外部的查询称为外查询(或主查询),内部的查询称为内查询(或子查询)。

注:

  • 子查询在主查询之前执行完成。

  • 子查询的结果被主查询使用。

  • 子查询要包含在括号内

  • 将子查询放在比较条件的右侧(建议)。

  • 单行操作符对应单行子查询,多行操作符对应多行子查询

子查询的分类:

角度一:单行子查询、多行子查询

单行子查询返回一条记录,多行子查询返回多条记录。

角度二:相关子查询、不相关子查询(或关联子查询和不关联子查询)(即从内查询是否执行多次的角度)

  •  子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件执行,那么这样的子查询称为不相关子查询。

  • 如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。

单行子查询:

单行比较操作符:

注:

  • 子查询可以放在任何可以用“值”表示的位置。比如WHERE、HAVING里的表达式中,SELECT中的字段中,CASE表达式中等等。

  • 子查询只返回一个结果值,不会返回行

  • 子查询查询不到结果则返回NULL

  • 多行子查询的结果不能放在单行比较操作符后使用

例,在CASE表达式中使用单行子查询:

SELECT empno , ename , CASE deptno
WHEN (
      SELECT deptno
      FROM dept
      WHERE loc = 'NEW YORK'
     ) 
THEN 'AAA'
ELSE 'BBB'
END 'location' #别名
FROM emp;

多行子查询:

多行子查询也称为集合比较子查询,返回多行,使用多行比较操作符。

多行比较操作符:

注:

可以将多行子查询的结果当作一张表使用,但是,必须要给此表取别名

例如:

SELECT MIN(sal_avg)
FROM (
      SELECT AVG(sal) sal_avg
      FROM emp
      GROUP BY deptno
     ) das; -- das即为此表的别名。

多行子查询中的空值问题:

如果多行子查询的结果的其中一条中出现NULL,用NOT IN加此子查询的结果为空,因为NOT IN实际上会用<>来与每个结果比较,若结果中有空值那么 <>NULL的结果就是NULL,正确的做法应该是将多行子查询的结果中的NULL值过滤掉。

例:

SELECT ename
FROM emp
WHERE NOT IN (
              SELECT mgr
              FROM emp
              WHERE mgr IS NOT NULL
             );

相关子查询:

如果相关子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重写计算一次,这样的子查询就是关联子查询。

相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。

例,查询员工中工资大于本部门平均工资的员工的姓名、薪资、和部门号(使用相关子查询):

SELECT ename , sal , deptno
FROM emp e1
WHERE sal > (
             SELECT AVG(sal)
             FROM emp e2
             WHERE deptno = e1.deptno   #子查询要与主查询做相关联,即主查询中的每一行的执行都要重新执行一次子查询。
            );

在SELECT中除了GROUP BY和LIMIT之外,其他的位置都可以使用子查询。

EXISTS与NOT EXISTS

关联子查询通常也会和EXISTS操作符一起来使用,用来检查子查询中是否存在行。

每一行执行时:

如果在子查询的结果中不存在行,返回FALSE

如果在子查询的结果中存在行,返回TRUE

返回FALSE即主查询中的相应的行不会成为主查询的结果,返回TRUE即主查询中的相应的行会成为主查询的结果。

NOT EXISTS表示如果在子查询的结果中不存在行,则返回TRUE,否则返回FALSE(与EXISTS相反)。

EXISTS后的子查询并不会返回行,只会返回TRUE或FALSE。

例:

SELECT empno , ename , job , deptno
FROM emp e1
WHERE EXISTS (
              SELECT *
              FROM emp e2
              WHERE e1.empno = e2.mgr
              );

当员工是属于管理者时,主查询才会接收到子查询返回的TRUE。

相关子查询也可以使用到更新、删除操作中,称为相关更新、相关删除。

多层自查询的三种经典的查询方式:

例,查询公司中平均工资最高的工作职位:

方式一:

步骤:

①    先求各部门的平均工资

②    再到①中的数据中求出最高的平均工资

③    再根据②中的数据对应出最高的平均工资对应的工作职位

SELECT job
FROM emp
GROUP BY job
HAVING AVG(sal) = (
                   SELECT MAX(avg_sal)
                   FROM (
                         SELECT AVG(sal) avg_sal
                         FROM emp
                         GROUP BY job
                         ) avg_tab
                  );

方式二:

比起方式一,方式二直接 <= ALL的方式将求最大的平均工资的步骤隐藏在比较操作符中,减少了子查询的次数。

SELECT job
FROM emp
GROUP BY job
HAVING AVG(sal) >= ALL (
                        SELECT AVG(sal)
                        FROM emp
                        GROUP BY job    
                        );

方式三:

方式三使用的是先降序排列,再用分页LIMIT的方式,只取第一个记录,取得的即是最高的平均工资,也减少了子查询的次数。

SELECT job
FROM emp
GROUP BY job
HAVING AVG(sal) = (
                   SELECT AVG(sal) avg_sal
                   FROM emp
                   GROUP BY job
                   ORDER BY avg_sal DESC
                   LIMIT 0,1
                  );

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/230798.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序适配方案:rpx(responsive pixel响应式像素单位)

小程序适配单位&#xff1a;rpx 规定任何屏幕下宽度为750rpx 小程序会根据屏幕的宽度自动计算rpx值的大小 Iphone6下&#xff1a;1rpx 1物理像素 0.5css 小程序编译后&#xff0c;rpx会做一次px换算&#xff0c;换算是以375个物理像素为基准&#xff0c;也就是在一个宽度…

通用基础模型+提示词是否能胜过微调模型?医学案例研究

论文链接在末尾 摘要 通用基础模型,如GPT-4,在各种领域和任务中展现出令人惊讶的能力。然而,普遍存在这样一种假设,即它们在没有专业知识深度训练的情况下无法达到专业能力。例如,迄今为止对医学竞赛基准的大多数探索都利用了领域特定的训练,正如在BioGPT和Med-PaLM等项…

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(二)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理1&#xff09;数据介绍2&#xff09;数据测试3&#xff09;数据处理 相关其它博客工程源代码下载其它资料下载 前言 博主前段时间发布了一篇有关方言识别和分类模型训练的博客&#xff0c;在读者…

ooTD I 这么精致优雅的套装也太好看了吧

精致到每一个细节的国风套装 领口袖口拼接环保毛条 精美的绣花增添浓重的高级感 外套90白鸭绒填充 敲暖和裙子的门襟处 也是做了定制盘扣&#xff0c;外套和裙子单独来穿也很精致

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月&#xff0c;Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾&#xff0c;在 NEARCON2023 的多链网络主题沙龙中发言&#xff1a;我们依然处于区…

主存储器与CPU的连接

目录 一. 单块存储芯片与CPU的连接二. 多块存储芯片与CPU的连接2.1 位扩展2.2 字扩展2.3 字位扩展 三. 译码器知识点的补充 \quad 一. 单块存储芯片与CPU的连接 \quad \quad \quad 暴露出的引脚都是与CPU连接的 上面这个是88位的存储芯片 我们可以看到有8个字, 每个字的字长是8…

Git提交代码时出现: ‘LF will be replaced by CRLF the next time Git touches it‘

遇到的问题 windows平台进行 git add 时&#xff0c;控制台打印警告 问题分析 1. Dos/Windows平台默认换行符&#xff1a;回车&#xff08;CR&#xff09;换行&#xff08;LF&#xff09;&#xff0c;即’\r\n’ 2. Mac/Linux平台默认换行符&#xff1a;换行&#xff08;LF&…

imazing正在查找最新的apple mobile device组件

​ Apple Mobile Device是macOS的一个组件&#xff0c;它允许您在Mac上与iOS设备进行无缝连接和通信。因此&#xff0c;无法直接在苹果设备上下载和安装Apple Mobile Device&#xff0c;需要借助管理工具进行下载安装后启动。 如果您需要与iOS设备进行通信和同步&#xff0c;…

javascript实现Stack(栈)数据结构

上一篇文章我们理解了List这种数据结构&#xff0c;知道了它的特点和一些使用场景&#xff0c;这篇文章我们就来看一下栈这种数据结构&#xff0c;这里的栈可不是客栈哦&#xff0c;哈哈 栈其实和List非常像&#xff0c;使用javascript实现都是基于数组来实现 尝试理解Stack …

10 大 Android 手机系统修复软件深度评测

您的新 Android 手机可能因其令人兴奋的性能而印象深刻。然而&#xff0c;随着时间的推移&#xff0c;您可能会发现系统有些地方与以前不太一样。您可能会遇到屏幕无响应、 Android应用程序崩溃、连接问题、电池耗尽等现象。 10 大 Android 手机系统修复软件 好吧&#xff0c;…

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用&#xff0c;使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…

【数据结构和算法】--- 栈

目录 栈的概念及结构栈的实现初始化栈入栈出栈其他一些栈函数 小结栈相关的题目 栈的概念及结构 栈是一种特殊的线性表。相比于链表和顺序表&#xff0c;栈只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的…

LeetCode力扣每日一题(Java):26、删除有序数组中的重复项

一、题目 二、解题思路 1、我的思路 我一开始的思路是创建一个ArrayList对象&#xff0c;然后将数组中的元素追加到ArrayList中&#xff0c;再通过ArrayList提供的API去解题&#xff0c;但是发现题目中提到了原地删除重复的元素&#xff0c;所以这种方法是行不通的 那就只能…

智能优化算法应用:基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于袋獾算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.袋獾算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

使用LangSmith来快速学习LangChain

好风凭借力&#xff0c;送我上青云&#xff01; 什么是LangSmith LangSmith is a platform for building production-grade LLM applications. It lets you debug, test, evaluate, and monitor chains and intelligent agents built on any LLM framework and seamlessly int…

【数据结构】——队列实现二叉树的功能

前言&#xff1a;二叉树的实现方式多种多样&#xff0c;有数组实现满二叉树&#xff0c;有链表实现完全二叉树&#xff0c;今天我们就用队列来实现二叉树。 创建二叉树&#xff1a; typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTre…

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中&#xff0c;同时不断着力提升自己的 AI 技能。 面对 AI 问题&#xff0c;工程师首先要了解什么是 AI&#xff0c;以及如何将它纳入当前工作流&#xff0c;这看似简单&#xff0c;实则未必容易。在 Google 中搜…

TechSmith Camtasia 2023 v23.2.0.47710 中文激活授权版(附安装教程+激活补丁)

Camtasia2023破解版是一款非常专业的屏幕录像软件。该软件集屏幕录制和视频剪辑功能于一体的软件&#xff0c;提供屏幕录制、区域录制、摄像头录制等多种录制方式&#xff0c;Camtasia2023版本带来了新的动态背景库、霓虹光标图像、录制语音旁白等多种新功能&#xff0c;适用于…

管理类联考——英语二——真题篇——按题型分类——小作文

文章目录 2023-建议信2022-邀请信2021-邀请信2020-建议信2019-建议信2018-道歉信2017-接受邀请信2016-建议信2015-通知2014-介绍信2013-邀请信 2023-建议信 Part A 47. Directions:   An art exhibition and a robot show are to be held on Sunday, and your friend David …

QT之常用按钮组件

QT之常用按钮组件 导入图标 布局 显示选中 实验结果 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }void Widget::on_push…