[mysql]子查询的概述和分类及单行子查询
子查询引入
查询的基本结构已经给大家了,子查询里面也是有一些新的内容,子查询其实就是在查询中嵌套另一个查询,叫嵌套查询可能大家更容易理解一点..,类似与FOR循环和FOR循环的嵌套,这一章是我们查询的最难的部分,大家
难度是查询的顶峰,多表查询和子查询是非常重要,SQL优化里面主要还是针对查询的优化.
子查询是mysql4.1里面引入的,现在java用的比较多的是8.0,数据库和java企业都没有动力去更新,我们讲课的向下兼容的,虽然现在是8.0,但是讲的还是会涉及,当我们现在有一个需求,查询谁的工资比a高,所以我们要先查询abel的工资,然后再把这个工资放入查询条件中进行查询.
首先我们看到了这个需求,谁的工资比abel高,我们如何不用子查询来进行.
SELECT last_name,salary
FROM employees
WHERE last_name=’abel’

我们可以看到abel工资的11000,我们现在就查询工资比11000高就行.

我们要和数据库服务器进行2次交互,效率肯定是比较低的,我们就像能不能用一条语句来进行.我们是不是可以用自连接来进行
SELECT T1.last_name,T1.salary
FROM employees T1
JOIN employees T2
ON T1.salary>T2.salary AND T2.last_name='abel'

这时我们利用自连接,把所有工资比abel高的字段筛选出来.
方式2自连接肯定要比方式1块
1虽然这个条件可以用多表查询,但是其他类似的条件就不能用自连接
2:这个不容易想出来,不够直观
那么我们就可以引入子查询
子查询介绍
我们先写WHERE条件,因为这个条件不是一个值,我们需要用另一个查询才能查询出来,所以我们直接把查询条件改成另一个查询结构SELECT last_name,salary
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name='abel')

注意这里的查询条件只能出现一个值.由一个问题需求引入一个查询
首先我们谈谈一个名称,一个称谓,子查询包括了外查询,和内查询.
外面的查询就叫外查询,里面的就叫内查询,这是相对的叫法.

外查询也被叫做主查询,内查询也被叫子查询.
接下来我们看看有什么具体的要求,
1子查询是在主查询之前一次查询,
2子查询的结果被外查询使用
注意事项
1:子查询要被括号包裹,由于子查询比较复杂,用括号包裹会比较清晰
2子查询要放在比较条件的右侧
Ps,就是在比较符号的后面,如果在前面就是这样
SELECT last_name,salary
FROM employees
WHERE (
SELECT salary
FROM employees
WHERE last_name='abel')<salary
我们会发现这样也行,但是为什么要这样呢,我们这是为了可读性和美观的考虑.头短尾长比较好.
3.单行操作费对应单行子查询,多行操作符对应多行子查询.
子查询分类
分类可以从不同的角度去分,第一个角度,
角度1: 出多个结果或者一个结
单行子查询,,
查询之后出一个结果的就是单行子查询
多行子查询
查询之后出多个结果的就是单行子查询
角度2内查询是否被执行多次
相关查询:
比如我们需要查询部门工资大于本部门平均工资的员工信息
里面的子查询会因为外查询记录部门的不同返回的值而改变.也就是返回不同的平均值.
比如白和白生的就是黑的,
不相关查询
比如需求我们要查询工资大于公司的平均工资的员工.
里面的子查询,或者说内查询条件,不会跟随外查询记录的改变而改变,
这里的就说清楚了,因为我们的子查询语句比较多,所以要写的行数也比较多,所以我们先做一个分类,我们下面要讲的就是单行子查询和多行子查询的案例.
我会把这两个查询的范围都限制在不相关子查询内容,所以下面的相关子查询把这个难度就调高起来
趁热打铁开始吧
也就是里面只有一个数据供我们外部使用,
子查询的编写技巧:
1从里往外写
2从外往里写
单行子查询
单行子查询操作符号
= != > < <> <= >=
也就是我们之前的逻辑操作符号
情况1
”查询工资大于149号员工工资的员工信息
由于我们不知道149号员工的工资,我们就要进行子查询.”
这里因为比较简单,所以我们技巧1和技巧2都可以
我们就先写子查询
SELECT employee_id
FROM employees
WHERE employee_id=149

再写外查询

没问题,我们就查询出来了
题目2返回job_id与141号员工相同,salary比143员工多的员工姓名
SELECT employee_id,job_id,salary
FROM employees
WHERE job_id=(
SELECT job_id
FROM employees
WHERE employee_id=141)
AND salary>(
SELECT salary
FROM employees
WHERE employee_id=143)

如果我们看见了一个查询语句,我们可以把这个语句转换为中文吗,也就是要看出这个查询语句来看出它的需求.这个能力也要有,我们现在主要是做需求.
题目返回公司工资最少的员工last_name,job_id和salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary=(
SELECT MIN(salary)
FROM employees)

注意这里可能是好几个员工,但是还是单行子查询,因为我们内查询只返回一条记录
情况2
查询与141号员工的manager_id和department_id相同的其他员工的employee_id,manager_id,department_id
我们先不用理过滤条件,查询其他员工的
employee_id,manager_id,department_id还是会写的把,我们就先写外查询
SELECT employee_id,manager_id,department_id
FROM employees
WHERE
然后补充内查询
SELECT employee_id,manager_id,department_id
FROM employees
WHERE manager_id =(
SELECT manager_id
FROM employees
WHERE employee_id=141)
AND department_id =(
SELECT department_id
FROM employees
WHERE employee_id=141)

这是方式1:
方式1成对子查询
我们还有一个方式2,可以一次性把两个字段条件写在一起
SELECT employee_id,manager_id,department_id
FROM employees
WHERE (manager_id,department_id) =(
SELECT manager_id,department_id
FROM employees
WHERE employee_id=141)

结果是一致的,这叫我们的成对子查询.效率上差别不大,上面的适用性比较高,所以这个不会写也没事,了解就可以了.适用场景太窄了
情况3,HAVING中的子查询
题目:查询最低工资大于50号部门最低工资的 部门id和其最低工资
SELECT MIN(salary)
SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id=50)

因为五十号部门工资是不确定的,所以我们要用到子查询
这里不行要空值我们就可以用外查询WHERE筛选掉
SELECT department_id,MIN(salary)
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING MIN(salary)>(
SELECT MIN(salary)
FROM employees
WHERE department_id=50)

所以我们HAVING中我们也可以使用子查询
情况4:CASE中的子查询
显示员工的employee_id,last_name和location.其中若员工department_id与location_id为1800的department_id相同则location为canada,其余为USA
这里我们还是先写外查询再写内查询,
SELECT employee_id,last_name,(
CASE department_id
WHEN (
SELECT department_id
FROM departments
JOIN locations T3
ON T3.location_id=departments.location_id
WHERE T3.location_id=1800)
THEN
'canada'
ELSE
'USA'
END
) "location"
FROM employees

情况5:子查询中的空值问题.
如果子查询的结果是空值,那么不会报错,返回的会是一个空表比如下面这种情况
SELECT last_name,job_id
FROM employees
WHERE job_id=(SELECT job_id FROM employees WHERE last_name=102)

情况6:非法使用子查询
如果我们用单行操作符进行多行操作,会出现什么情况
这时会直接报错

下期介绍
如果多行子查询我们就应该用多行操作符号,IN或者BETWEEN.
相关文章:
[mysql]子查询的概述和分类及单行子查询
子查询引入 查询的基本结构已经给大家了,子查询里面也是有一些新的内容,子查询其实就是在查询中嵌套另一个查询,叫嵌套查询可能大家更容易理解一点..,类似与FOR循环和FOR循环的嵌套,这一章是我们查询的最难的部分,大家 难度是查询的顶峰,多表查询和子查询是非常重要,SQL优化里…...
SpringMVC执行流程(视图阶段JSP、前后端分离阶段)、面试题
目录 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 3.前后端分离的项目SpringMVC执行流程 4. 面试题 1.SpringMVC执行流程分为以下两种 2.非前后端分离的SpringMVC的执行流程 流程图: 更加生动的描述: DisPatcherServlet…...
宠物空气净化器有用吗?有哪几款吸毛效果好且低噪的推荐
伴随着天气越来越凉,照常来说,猫咪掉毛的频率应该会变少,但是为什么我家的猫咪还在掉很多毛。 现在就连南方地区都要加外套了,但是猫咪掉毛太多,都不敢穿纯棉面料的衣服,还有本来想着顺应天气的变化&#…...
linux -磁盘管理命令
学会用fidsk -l blkid lskid 就够用 格式化文件系统:mkfs -t <文件系统格式> /dev/vdb1 1..df -Th 查看磁盘挂载情况。 2.fdisk 磁盘分区命令 示例一:fdisk -l 查看磁盘分区,箭头指出分区信息 示例二:创建分区eg…...
[Chrome插件开发]关于报错Service worker registration failed. Status code: 15
manifest.json中不能使用ts: "background": {"service_worker": "background.ts"}只能使用js "background": {"service_worker": "background.js"}在vite.config.js中增加以下配置,可以将…...
uniapp封装movable-area+movable-view组件,实现悬浮按钮可拖动,自动吸附边缘效果,自动向两边靠拢
兼容H5、App、微信小程序 子组件 /components/ShopCar/ShopCar.vue <template><view class"ShopCar"><movable-area class"movableArea" v-if"isShow"><movable-view class"movableView" :position"posi…...
音频重采样(libresample)
https://github.com/minorninth/libresample USB audio同步问题及Jitter分析_usb mic i2s 时钟不同步-CSDN博客 是的,电脑和 USB 摄像头之间的 UAC(USB Audio Class)传输,**可能会因为两边时钟不同步而引起破音问题**。时钟不同…...
使用Python来下一场雪
具体效果:(大雪缓缓下落) 完整代码: import pygame import random# 初始化 Pygame pygame.init()# 设置窗口 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("下雪…...
Pyspark中pyspark.sql.functions常用方法(4)
文章目录 pyspark sql functionsforall 判断array是否满足allfilter 过滤zip_with 数组合并 pyspark sql functions forall 判断array是否满足all df spark.createDataFrame([(1, ["bar"]), (2, ["foo", "bar"]), (3, ["foobar", &…...
Nginx 配置基于IP 地址的 Web 服务器
Nginx 配置基于IP 地址的 Web 服务器 1.配置网卡 nmcli connection modify ipv4.address 192.168.232.130/24 ipv4.gateway 192.168.232.2 ipv4.dns 192.168.232.2 ipv4.method manual connection.autoconnect yes 2.添加ip地址 nmcli connection modify ens160 ipv4.address…...
【TVM 教程】线性和递归核
Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 → https://tvm.hyper.ai/ 作者:Tianqi Chen 下面介绍如何在 TVM 中进行递归计算(神经网络中的典型模式)。 from…...
猫主福利大放送,双11猫奴们的购物狂欢节 养猫必备清单
双十一购物狂欢节终于来啦!铲屎官们是不是已经迫不及待想为心爱的猫咪挑选新玩具和必需品了呢?作为一名资深铲屎官,我专门为大家整理了一份双十一养猫必备清单。抓住这个难得的机会,让我们为猫咪挑选最舒适、最实用的好物吧&#…...
Linux中gcc的使用
GCC的基本概念和用途 GCC(GNU Compiler Collection)是GNU项目提供的一套编程语言编译器集合,包括了C、C、Objective-C、Fortran、Java、Ada和Go等语言的编译器。GCC广泛用于Linux和其他类Unix系统中,用于将源代码编译成可执行文件…...
React 组件 API
React 组件 API React 组件 API 是 React 应用程序开发中的核心部分,它提供了一系列的接口和方法,使得开发者能够创建和管理组件的状态、属性以及生命周期。在本篇文章中,我们将深入探讨 React 组件 API 的各个方面,包括组件的定…...
一个使用接口模式、工厂模式、模板方法模式的日志文件系统
引言: 编写一个与具体业务无关的示例代码。这个示例代码主要体现以下几个设计思想和模式: 接口模式(Interface Pattern):定义接口类,并让具体实现类去实现该接口的功能。 工厂模式(Factory Pa…...
openjdk17 C++源码是怎么给java字段赋值的
##java源码 public class OtherClass {public static int CONSTANT_O9876;public int o1234;public void dddd(){String dddd "dddd";//System.out.println(dddd);System.out.println(ddddCONSTANT_O);}} public int o1234; 在openjdk17中 C源码怎么执行这段代码…...
C++初阶(八)--内存管理
目录 引入: 一、C中的内存布局 1.内存区域 2.示例变量存储位置说明 二、C语言中动态内存管理 三、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四、operator new与operator delete函数(重要点进行讲解) …...
C# 企业微信机器人推送消息 windows服务应用程序的使用
C# 企业微信机器人推送消息 先添加一个机器人! 然后查看机器人就可以得到一个 webhook 特别特别要注意:一定要保护好机器人的webhook地址,避免泄漏! 然后开始写代码 ,只需要httpPost 调用一下这个地址就可以发送消息了。 首先我…...
社区交流系统设计与实现
社区交流系统设计与实现 1. 系统概述 社区交流系统是一个基于PHP和SQL的Web应用程序,旨在为用户提供一个互动交流的平台。该系统允许用户注册、发布帖子、回复帖子、查看其他用户的帖子和回复,以及管理个人资料,提高用户之间的互动和信息共享…...
【模型学习之路】手写+分析bert
手写分析bert 目录 前言 架构 embeddings Bertmodel 预训练任务 MLM NSP Bert 后话 netron可视化 code2flow可视化 fine tuning 前言 Attention is all you need! 读本文前,建议至少看懂【模型学习之路】手写分析Transformer-CSDN博客。 毕竟Bert是tr…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
