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

[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的执行流程 流程图&#xff1a; 更加生动的描述&#xff1a; DisPatcherServlet…...

宠物空气净化器有用吗?有哪几款吸毛效果好且低噪的推荐

伴随着天气越来越凉&#xff0c;照常来说&#xff0c;猫咪掉毛的频率应该会变少&#xff0c;但是为什么我家的猫咪还在掉很多毛。 现在就连南方地区都要加外套了&#xff0c;但是猫咪掉毛太多&#xff0c;都不敢穿纯棉面料的衣服&#xff0c;还有本来想着顺应天气的变化&#…...

linux -磁盘管理命令

学会用fidsk -l blkid lskid 就够用 格式化文件系统&#xff1a;mkfs -t <文件系统格式> /dev/vdb1 1..df -Th 查看磁盘挂载情况。 2.fdisk 磁盘分区命令 示例一&#xff1a;fdisk -l 查看磁盘分区&#xff0c;箭头指出分区信息 示例二&#xff1a;创建分区eg…...

[Chrome插件开发]关于报错Service worker registration failed. Status code: 15

manifest.json中不能使用ts&#xff1a; "background": {"service_worker": "background.ts"}只能使用js "background": {"service_worker": "background.js"}在vite.config.js中增加以下配置&#xff0c;可以将…...

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博客 是的&#xff0c;电脑和 USB 摄像头之间的 UAC&#xff08;USB Audio Class&#xff09;传输&#xff0c;**可能会因为两边时钟不同步而引起破音问题**。时钟不同…...

使用Python来下一场雪

具体效果&#xff1a;&#xff08;大雪缓缓下落&#xff09; 完整代码&#xff1a; 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 是一个端到端的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 → https://tvm.hyper.ai/ 作者&#xff1a;Tianqi Chen 下面介绍如何在 TVM 中进行递归计算&#xff08;神经网络中的典型模式&#xff09;。 from…...

猫主福利大放送,双11猫奴们的购物狂欢节 养猫必备清单

双十一购物狂欢节终于来啦&#xff01;铲屎官们是不是已经迫不及待想为心爱的猫咪挑选新玩具和必需品了呢&#xff1f;作为一名资深铲屎官&#xff0c;我专门为大家整理了一份双十一养猫必备清单。抓住这个难得的机会&#xff0c;让我们为猫咪挑选最舒适、最实用的好物吧&#…...

Linux中gcc的使用

GCC的基本概念和用途 GCC&#xff08;GNU Compiler Collection&#xff09;是GNU项目提供的一套编程语言编译器集合&#xff0c;包括了C、C、Objective-C、Fortran、Java、Ada和Go等语言的编译器。GCC广泛用于Linux和其他类Unix系统中&#xff0c;用于将源代码编译成可执行文件…...

React 组件 API

React 组件 API React 组件 API 是 React 应用程序开发中的核心部分&#xff0c;它提供了一系列的接口和方法&#xff0c;使得开发者能够创建和管理组件的状态、属性以及生命周期。在本篇文章中&#xff0c;我们将深入探讨 React 组件 API 的各个方面&#xff0c;包括组件的定…...

一个使用接口模式、工厂模式、模板方法模式的日志文件系统

引言&#xff1a; 编写一个与具体业务无关的示例代码。这个示例代码主要体现以下几个设计思想和模式&#xff1a; 接口模式&#xff08;Interface Pattern&#xff09;&#xff1a;定义接口类&#xff0c;并让具体实现类去实现该接口的功能。 工厂模式&#xff08;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++初阶(八)--内存管理

目录 引入&#xff1a; 一、C中的内存布局 1.内存区域 2.示例变量存储位置说明 二、C语言中动态内存管理 三、C内存管理方式 1.new/delete操作内置类型 2.new和delete操作自定义类型 四、operator new与operator delete函数&#xff08;重要点进行讲解&#xff09; …...

C# 企业微信机器人推送消息 windows服务应用程序的使用

C# 企业微信机器人推送消息 先添加一个机器人! 然后查看机器人就可以得到一个 webhook 特别特别要注意&#xff1a;一定要保护好机器人的webhook地址&#xff0c;避免泄漏&#xff01; 然后开始写代码 &#xff0c;只需要httpPost 调用一下这个地址就可以发送消息了。 首先我…...

社区交流系统设计与实现

社区交流系统设计与实现 1. 系统概述 社区交流系统是一个基于PHP和SQL的Web应用程序&#xff0c;旨在为用户提供一个互动交流的平台。该系统允许用户注册、发布帖子、回复帖子、查看其他用户的帖子和回复&#xff0c;以及管理个人资料&#xff0c;提高用户之间的互动和信息共享…...

【模型学习之路】手写+分析bert

手写分析bert 目录 前言 架构 embeddings Bertmodel 预训练任务 MLM NSP Bert 后话 netron可视化 code2flow可视化 fine tuning 前言 Attention is all you need! 读本文前&#xff0c;建议至少看懂【模型学习之路】手写分析Transformer-CSDN博客。 毕竟Bert是tr…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...