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

MySQL数据库(七)----查询相关操作(子查询)

子查询是指在一个查询语句(主查询)内部嵌套的另一个查询语句。子查询可以出现在 SELECTFROMWHEREHAVING 等子句中。它可以将一个复杂的查询问题分解为多个简单的查询步骤,从而更方便地获取所需的数据。

引入子查询:

-- 查询所有比“CLARK”工资高的员工的信息  
-- 步骤1:“CLARK”工资
select sal from emp where ename = 'CLARK'  -- 2450
-- 步骤2:查询所有工资比2450高的员工的信息  
select * from emp where sal > 2450;
-- 两次命令解决问题 --》效率低 ,第二个命令依托于第一个命令,第一个命令的结果给第二个命令使用,但是
-- 因为第一个命令的结果可能不确定要改,所以第二个命令也会导致修改
-- 将步骤1和步骤2合并 --》子查询:
select * from emp where sal > (select sal from emp where ename = 'CLARK');
-- 一个命令解决问题 --》效率高

执行顺序:
先执行子查询,再执行外查询;
不相关子查询:
子查询可以独立运行,称为不相关子查询。
不相关子查询分类:
根据子查询的结果行数,可以分为单行子查询和多行子查询。

单行子查询:

通常返回一个单一的值(一个标量值),可以用于 WHERE 子句的条件判断。

例子:

1、查询工资高于平均工资的雇员名字和工资。

select ename, sal
from emp
where sal > (select avg(sal) from emp);  -- 子查询:计算所有雇员的平均工资,并返回该值-- 外部查询:选择所有工资大于平均工资的雇员名字和工资

2、查询和CLARK同一部门且比他工资低的雇员名字和工资。

select ename, sal
from emp
where deptno = (select deptno from emp where ename = 'CLARK')  -- 子查询1:查找CLARK所在的部门编号and sal < (select sal from emp where ename = 'CLARK');  -- 子查询2:查找CLARK的工资-- 外部查询:选择在CLARK所在部门并且工资低于CLARK的雇员名字和工资

3、查询职务和SCOTT相同,比SCOTT雇佣时间早的雇员信息  

select * 
from emp
where job = (select job from emp where ename = 'SCOTT')  -- 子查询1:查找SCOTT的职务and hiredate < (select hiredate from emp where ename = 'SCOTT');  -- 子查询2:查找SCOTT的雇佣日期-- 外部查询:选择职务与SCOTT相同且雇佣日期早于SCOTT的所有雇员信息

多行子查询:

返回多个值,可以与 IN, ANY, ALL 等操作符一起使用,用于在外部查询中进行多值比较。

例子:

1、查询【部门20中职务同部门10的雇员一样的】雇员信息。

select * from emp 
where deptno = 20 
and job in (select job from emp where deptno = 10);  -- 子查询:返回部门10中的所有职务-- 外部查询:选择部门20中职务与部门10相同的所有雇员信息
select * from emp 
where deptno = 20 
and job = any(select job from emp where deptno = 10);  -- 子查询:返回部门10中的所有职务-- 外部查询:选择部门20中职务与部门10中任意职务相同的所有雇员信息
  • INANY 都能处理多行子查询。IN 用于在外部查询中选择在子查询返回的多个值中的任意一个匹配项。
  • ANY 允许外部查询的条件与子查询返回的多个值进行比较,条件满足任意一个值即可。

2、查询工资比所有的“SALESMAN”都高的雇员的编号、名字和工资。

-- 多行子查询:
select empno, ename, sal 
from emp 
where sal > all(select sal from emp where job = 'SALESMAN');  -- 子查询:返回所有“SALESMAN”的工资-- 外部查询:选择那些工资大于所有“SALESMAN”的工资的雇员信息
-- 单行子查询:
select empno, ename, sal 
from emp 
where sal > (select max(sal) from emp where job = 'SALESMAN');  -- 子查询:返回“SALESMAN”中最高的工资-- 外部查询:选择工资大于最高“SALESMAN”工资的雇员信息
  • 多行子查询ALL 用来与子查询返回的所有值进行比较,只有当外部查询的值大于子查询中所有返回的工资时才会返回结果。
  • 单行子查询MAX 聚合函数用于获取 SALESMAN 中最高的工资,外部查询返回工资大于该最高工资的雇员。

3、查询工资低于任意一个“CLERK”的工资的雇员信息。

select * 
from emp
where sal < any(select sal from emp where job = 'CLERK') 
and job != 'CLERK';  -- 子查询:返回所有“CLERK”的工资-- 外部查询:选择工资低于任意“CLERK”的工资的雇员信息,排除职务为“CLERK”的雇员
-- 单行子查询:
select * 
from emp
where sal < (select max(sal) from emp where job = 'CLERK') 
and job != 'CLERK';  -- 子查询:返回“CLERK”中最高的工资-- 外部查询:选择工资低于“CLERK”中最高工资的雇员信息,排除职务为“CLERK”的雇员
  • 多行子查询ANY 用于选择那些工资低于 CLERK 中任意一个工资的雇员。
  • 单行子查询MAX 聚合函数返回 CLERK 中最高的工资,外部查询选择工资低于该最高工资的雇员。

 

不相关的子查询引入:
不相关的子查询:子查询可以独立运行,先运行子查询,再运行外查询。
相关子查询:子查询不可以独立运行,并且先运行外查询,再运行子查询

相关的子查询优缺点:
好处:简单   功能强大(一些使用不相关子查询不能实现或者实现繁琐的子查询,可以使用相关子查询实现)
缺点:稍难理解

例子:

1、 查询本部门最高工资的员工  。

 方法1:通过不相关子查询实现:

select * from emp 
where deptno = 10 
and sal = (select max(sal) from emp where deptno = 10)  -- 子查询:查找部门10中的最高工资
union
select * from emp 
where deptno = 20 
and sal = (select max(sal) from emp where deptno = 20)  -- 子查询:查找部门20中的最高工资
union
select * from emp 
where deptno = 30 
and sal = (select max(sal) from emp where deptno = 30);  -- 子查询:查找部门30中的最高工资
  • 使用 UNION 将每个部门的查询结果合并,返回部门10、20、30中最高工资的员工信息。
  • 缺点:这种方式需要手动为每个部门写查询,如果部门数量增加,SQL 语句也会随之增长,效率不高,且不具备通用性

方法2: 相关子查询:

select * from emp e 
where sal = (select max(sal) from emp where deptno = e.deptno)  -- 相关子查询:查找每个员工所在部门的最高工资
order by deptno;  -- 按照部门排序
  • 这种方式不需要手动列出每个部门,能够动态地计算出所有部门的最高工资并返回对应的员工信息。
  • 优点:比不相关子查询更简洁,且能够自动适应不同的部门数量。

 

2、查询工资高于其所在岗位的平均工资的那些员工。

不相关子查询:

select * from emp 
where job = 'CLERK' 
and sal >= (select avg(sal) from emp where job = 'CLERK');  -- 子查询:计算所有“CLERK”岗位的平均工资
  • 外部查询选择所有工资高于或等于该平均工资的 "CLERK" 岗位的员工。
  • 缺点:这种方式无法动态处理不同岗位,若要查询其他岗位,需要重复编写类似的查询。

 

相关子查询:

select * from emp e 
where sal >= (select avg(sal) from emp e2 where e2.job = e.job);  -- 相关子查询:查找每个员工所在岗位的平均工资
  • 外部查询选择那些工资高于或等于自己岗位的平均工资的员工。
  • 优点:此方法更加通用,可以适用于所有岗位,不需要手动指定岗位名称(如 'CLERK'),它会动态计算每个岗位的平均工资并返回符合条件的员工。

总结

子查询是 SQL 中非常重要的功能,可以将复杂的查询问题分解为多个简单的步骤。

不相关子查询和相关子查询各有优缺点,应该根据实际场景选择使用。

不相关子查询适合用于简单的查询,相关子查询则更适合处理依赖外部查询数据的复杂情况。

 

相关文章:

MySQL数据库(七)----查询相关操作(子查询)

子查询是指在一个查询语句&#xff08;主查询&#xff09;内部嵌套的另一个查询语句。子查询可以出现在 SELECT、FROM、WHERE、HAVING 等子句中。它可以将一个复杂的查询问题分解为多个简单的查询步骤&#xff0c;从而更方便地获取所需的数据。 引入子查询&#xff1a; -- 查…...

01_Spring开胃菜

一、 为什么是Spring? 在正式进入Spring内容前我们先看看我们以往经典的程序设计。 当我们去登录时,会调用后端的Controller,Controller接收到用户的请求后会调用业务层的Service进行登录的业务处理,Service业务处理过程中会调用Dao层向DB获取数进行判断。 接下来我们用代…...

SpringBoot使用AspectJ的@Around注解实现AOP全局记录接口:请求日志、响应日志、异常日志

Spring 面向切面编程(AOP),系列文章: 《Spring面向切面编程(AOP)的简单实例》 《Spring使用AspectJ的注解式实现AOP面向切面编程》 《SpringBoot使用AspectJ实现AOP记录接口:请求日志、响应日志、异常日志》 《SpringBoot使用AspectJ的@Around注解实现AOP全局记录接口:…...

WPF下播放Rtmp的解决方案

介绍 在实际的开发过程中&#xff0c;需要在应用内部内嵌播放器进行视频的播放。官方默认的MediaElement控件只能播放有限的视频格式&#xff0c;也不能播放网络流。比较流行的解决方式是vlc的库&#xff0c;但是在实际使用过程中发现有很多问题。这里给大家推荐另一个比较好的…...

7.高可用集群架构Keepalived双主热备原理

一. 高可用集群架构Keepalived双主热备原理 (1)主机+备机keepalived配置(192.168.1.171) ! Configuration File for keepalivedglobal_defs {# 路由id:当前安装keepalived节点主机的标识符,全局唯一router_id keep_101 } #计算机节点(主机配置) vrrp_instance VI_1 {</...

为以人工智能为中心的工作负载重新设计的全局控制台

MinIO 控制台多年来一直是一个不断发展的产品。每次学习时&#xff0c;我们都会思考如何改进交互框架中这个非常重要的部分。首先是控制台&#xff0c;它在推出后的一年内就被广泛采用。更具体地说&#xff0c;超过 10K 个组织。接下来是企业控制台。这从对象存储与其 GUI 之间…...

go channel中的 close注意事项 range取数据

在使用 Go 语言中的 close 函数时&#xff0c;有一些注意事项需要牢记&#xff0c;以确保程序的健壮性和正确性&#xff1a; 1. **仅用于通道&#xff08;channel&#xff09;**&#xff1a; - close 函数只能用于关闭通道&#xff0c;不能用于关闭文件、网络连接或其他资源…...

Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】

下面是项目级完整配置1➡eslint&#xff1a;【吐血分享&#xff0c;博主踩过的坑你跳过去&#xff01;&#xff01;跳不过去&#xff1f;太过分了给博主打钱】 浏览器自动打开项目&#xff1a; 你想释放双手吗&#xff1f;你想每天早上打开电脑运行完项目自动在浏览器打开吗&a…...

鸿蒙开发应用权限管理

简介 一种允许应用访问系统资源&#xff08;如&#xff1a;通讯录等&#xff09;和系统能力&#xff08;如&#xff1a;访问摄像头、麦克风等&#xff09;的通用权限访问方式&#xff0c;来保护系统数据&#xff08;包括用户个人数据&#xff09;或功能&#xff0c;避免它们被…...

【数据库】如何保证数据库迁移过程中数据的一致性?

在数据库迁移过程中&#xff0c;保证数据的一致性是非常重要的&#xff0c;尤其是在涉及到多个表、多个数据库或分布式系统的情况下。以下是一些确保数据一致性的最佳实践和方法&#xff1a; 1. 备份数据 在开始迁移之前&#xff0c;进行全面的数据备份是确保数据一致性的第…...

C++之内存管理

​ &#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;C入门 目录 前言 一、C/C内存分配 二、 malloc、calloc、realloc、free 三、C内存管理方式 3.1 new/delete 操作内置类型 3.2 new和detele操作自定义类型…...

ISP是什么?

isp全称为Internet Service Provider&#xff0c;即互联网服务提供商&#xff0c;是一种向用户提供互联网接入服务的公司或组织&#xff0c;它们提供的服务包括互联网接入、域名注册、网站托管等等。 ISP的应用场景非常广泛&#xff0c;几乎所有的互联网用户都需要通过ISP来接…...

机房动环境监控用各种列表已经淘汰了,现在都是可视化图表展示了

在信息技术飞速发展的今天&#xff0c;机房作为数据存储、处理和传输的核心场所&#xff0c;其稳定运行至关重要。过去&#xff0c;机房动环境监控主要依赖各种列表形式来呈现数据&#xff0c;但如今&#xff0c;这种方式已经逐渐被淘汰&#xff0c;取而代之的是更加直观、高效…...

RHCE的练习(12)

写一个脚本&#xff0c;完成以下要求&#xff1a; 给定一个用户&#xff1a; 如果其UID为0&#xff0c;就显示此为管理员&#xff1b;否则&#xff0c;就显示其为普通用户&#xff1b; #!/bin/bash ​ # 使用read命令获取用户名 read -p "请输入用户名: " username ​…...

uniapp自动注册机制:easycom

传统 Vue 项目中&#xff0c;我们需要注册、导入组件之后才能使用组件。 uniapp 框架提供了一种组件自动注册机制&#xff0c;只要你在 components 文件夹下新建的组件满足 /components/组件名/组件名.vue 的命名规范&#xff0c;就能直接使用。 注意&#xff1a;组件的文件夹…...

【论文阅读】(Security) Assertions by Large Language Models

论文笔记:(Security) Assertions by Large Language Models 来源:IEEE TRANSACTIONS ON INFORMATION FORENSICS AND SECURITY I. 引言 计算机系统的安全性通常依赖于硬件的根信任。硬件漏洞可能对系统造成严重影响,因此需要支持安全验证的技术。断言验证是一种流行的验证…...

C++ 编程基础(5)类与对象 | 5.8、面向对象五大原则

文章目录 一、面向对象五大原则1、单一功能&#xff08;Single Responsibility Principle, SRP&#xff09;2、开放封闭原则&#xff08;Open/Closed Principle, OCP&#xff09;3、里氏替换原则&#xff08;Liskov Substitution Principle, LSP&#xff09;4、接口隔离原则&am…...

node.js中express的基本了解

定义 Express是基于Node.js平台&#xff0c;快速、开放、极简的Web开发框架。 本质 Express是一个npm上的第三方包&#xff0c;提供了快速创建Web服务器的便捷方法。 作用 与Node.js内置的http模块类似&#xff0c;Express也是专门用来创建Web服务器的&#xff0c;但它极大地简…...

AI大模型(一):Prompt AI编程

一、Prompt Engineering&#xff0c;提示工程 提示工程也叫指令工程&#xff1a; Prompt是发给大模型的指令&#xff0c;比如【讲个睡前故事】、【用Python写个消消乐游戏】等&#xff1b;本质上大模型相关的工程工作&#xff0c;都是围绕prompt展开的&#xff1b;提示工程门…...

ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结

01 背景 我们之前在使用ArcGIS出现导出Excel中文乱码及shp添加字段3个字被截断的情况&#xff0c;我们有以下应对策略&#xff1a; 推荐阅读&#xff1a;ArcGIS导出Excel中文乱码及shp添加字段3个字被截断&#xff1f; 那如果我们使用ArGIS Pro出现上述问题&#xff0c;该如何…...

小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…...

计算机网络网关简介

网关&#xff0c;在计算机网络中扮演着至关重要的角色&#xff0c;它如同不同语言间的翻译官&#xff0c;让不同网络协议、不同体系结构的网络能够相互通信。简而言之&#xff0c;网关就是一个网络连接到另一个网络的“关口”&#xff0c;负责数据的接收、转换与发送。 在局域…...

如何用python将pdf转换为json格式

使用 Python 将 PDF 文件转换为 JSON 格式&#xff0c;主要步骤如下&#xff1a; 读取 PDF 内容&#xff1a;首先使用一个库读取 PDF 文件内容&#xff0c;如 PyMuPDF 或 pdfplumber。这些库可以逐页提取文本&#xff0c;并返回结构化的数据。 组织数据到 JSON&#xff1a;将提…...

STL关联式容器介绍

在前文中介绍了STL的序列式容器&#xff1b; STL序列式容器之vector-CSDN博客 STL序列式容器之list-CSDN博客 STL序列式容器之deque-CSDN博客 STL序列式容器之stack-CSDN博客 STL序列式容器之queue-CSDN博客 STL序列式容器之heap&#xff08;堆&#xff09;-CSDN博客 ST…...

java计算机毕业设计选题参考3000篇

基于微信小程序的springboot高校餐厅食品留样管理系统 springboot vue大学生创新创业训练项目管理系统 Springboot的疫情网课管理系统 基于微信小程序的计算机实验室排课与查询系统ssm后端 基于ssm后端的学生购电电费管理微信小程序weixin356 ssm机场网上订票系统 基于ssmvue的…...

JWT介绍、测试案例 以及实际开发中的使用

什么是JWT&#xff1f; JWT&#xff0c;通过数字签名的方式&#xff0c;以json对象为载体&#xff0c;在不同的服务终端之间安全的传输信息&#xff0c;用来解决传统session的弊端。 JWT在前后端分离系统&#xff0c;通过JSON形式作为WEB应用中的令牌(token)&#xff0c;用于…...

快排和归并

目录 前言 快速排序 相遇位置一定比key小的原理&#xff08;大&#xff09;&#xff1a; 避免效率降低方法&#xff08;快排优化&#xff09; 三数取中&#xff08;选key优化&#xff09; 小区间优化 hoare版本快排 挖坑法快排 前后指针快排 非递归快排 归并排序 非递…...

VUE+SPRINGBOOT实现邮箱注册、重置密码、登录功能

随着互联网的发展&#xff0c;网站用户的管理、触达、消息通知成为一个网站设计是否合理的重要标志。目前主流互联网公司都支持手机验证码注册、登录。但是手机短信作为服务端网站是需要付出运营商通信成本的&#xff0c;而邮箱的注册、登录、重置密码&#xff0c;无疑成为了这…...

Vue 项目打包后环境变量丢失问题(清除缓存),区分.env和.env.*文件

Vue 项目打包后环境变量丢失问题&#xff08;清除缓存&#xff09;&#xff0c;区分.env和.env.*文件 问题背景 今天在导报项目的时候遇到一个问题问题&#xff1a;在开发环境中一切正常&#xff0c;但在打包后的生产环境中&#xff0c;某些环境变量&#xff08;如 VUE_APP_B…...

创建vue+electron项目流程

一个vue3和electron最基本的环境搭建步骤如下&#xff1a;// 安装 vite vue3 vite-plugin-vue-setup-extend less normalize.css mitt pinia vue-router npm create vuelatest npm i vite-plugin-vue-setup-extend -D npm i less -D npm i normalize.css -S &#xff0…...