[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.

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CUDA代码实践02】矩阵加法运算程序

文章目录 main.cu代码工作流程 matrixSum.cuhmatrixSum.cu代码结构说明总体工作流程 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术&#xff0c;尤其是大模型的快速发展&#xff0c;打开了全新的时代大门。对于想要在这个时代迅速成长并提升自身能力的个人而言&am…

k8s可以部署私有云吗?私有云部署全攻略

k8s可以部署私有云吗&#xff1f;K8S可以部署私有云。Kubernetes是一个开源的容器编排引擎&#xff0c;能够自动化容器的部署、扩展和管理&#xff0c;使得应用可以在各种环境中高效运行。通过使用Kubernetes&#xff0c;企业可以在自己的数据中心或私有云环境中搭建和管理容器…

OpenSSH_8.7 无法使用密码登录问题解决

文章目录 前言SSH 版本 配置 SSH 密码登录其它总结个人简介 前言 最近使用 Crunchbits VPS&#xff08;virt.crunchbits.com&#xff09; 时&#xff0c;由于更换电脑导致认证的 ssh 秘钥丢失&#xff0c;尝试 SSH 密码登录时遇到如下错误提示&#xff1a;Permission denied (…

探索 Python 幽默之源:pyjokes 库全解析

&#x1f680; 探索 Python 幽默之源&#xff1a;pyjokes 库全解析 1. 背景介绍&#xff1a;为何选择 pyjokes&#xff1f; 在紧张的编程工作中&#xff0c;幽默是一种有效的缓解压力的方式。pyjokes 是一个专为程序员设计的 Python 库&#xff0c;它提供了丰富的单行笑话&am…

【Dv2Admin】Django配置线上ws反向代理

在 Web 应用程序的部署过程中,安全性、稳定性和实时通信是开发者们普遍关注的重点。Django 是一个非常流行的 Web 框架,常与 Nginx 配合使用,以便实现反向代理、负载均衡以及 SSL 加密等功能。除此之外,实时功能(如 WebSocket)也是现代应用中经常使用的技术。 在项目中实…

Fast Simulation of Mass-Spring Systems in Rust 论文阅读

参考资料&#xff1a; Fast Simulation of Mass-Spring Systems in Rust 论文阅读&#xff1a;Fast Simulation of Mass-Spring Systems 【论文精读】讲解刘天添2013年的fast simulation of mass spring system(Projective Dynamics最早的论文) Projective Dynamics笔记(一…

uniapp圆形波浪进度效果

uniapp圆形波浪进度效果 背景实现思路代码实现尾巴 背景 最近项目中有些统计的地方需要用到圆形的波浪进度效果&#xff0c;要求是根据百分比值然后在一个圆形内动态的展示一个波浪形的进度&#xff0c;看参考一下效果。 实现思路 这个效果看着挺复杂的&#xff0c;那么我们…

【Linux】磁盘文件系统(inode)、软硬链接

文章目录 1. 认识磁盘1.1 磁盘的物理结构1.2 磁盘的逻辑结构 2. 引入文件系统2.1 EXT系列文件系统的分区结构2.2 inode 3. 软硬链接3.1 软链接3.2 硬链接 在讲过了内存文件系统后&#xff0c;我们可以知道文件分为两种&#xff1a; 打开的文件&#xff08;内存中&#xff09;未…

如何提高英语口语表达能力?

提高英语口语表达能力是一个逐步积累和实践的过程。 1. 自我练习方法 录音与回听 录音&#xff1a;用手机或其他设备录下自己的口语练习&#xff0c;比如描述一天的活动、讲述一个故事或复述一篇文章。 回听&#xff1a;仔细听录音&#xff0c;找出发音、语法和流利度方面的问…

【设计模式-状态模式】

状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许一个对象在内部状态改变时改变它的行为。换句话说&#xff0c;这种模式让对象在不同的状态下能够表现出不同的行为&#xff0c;而不需要修改对象的代码。状态模式通过将对象的行为与状态进行…

node集成redis (教学)

文章目录 前言一、安装redis二、可视化界面测试连接1.vscode安装插件 三、node代码编写1.先安装两个库&#xff08;redis和ioredis&#xff09;2.测试连接 &#xff08;前提是你的redis服务器要启动起来&#xff09; 总结 前言 在Node.js中集成ioredis是一个常见的做法&#x…

vscode配色主题与图标库推荐

vscode配色主题推荐:Andromedavsocde图标库&#xff1a; vscode-icons Andromeda Dark theme with a taste of the universe 仙女座&#xff1a;一套宇宙深空体验的哑暗色主题; 高对比度,色彩饱和; Easy Installation Open the extensions sidebar on Visual Studio CodeSear…

【LeetCode:263. 丑数 + 数学】

在这里插入代码片 &#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕…

apply call bind 简介

Function.prototype.call(thisArg [, arg1, arg2, …]) call() 简述 call() 方法 调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表)。当第一个参数为 null、undefined 的时候&#xff0c; 默认 this 上下文指向window。 call() 简单实例 const name …

【项目复现】——DDoS-SDN Detection Project

文章目录 概要整体架构流程1. 系统和网络配置2. SDN控制器配置3. 流量生成4. 数据采集5. DDoS检测机制6. 机器学习模型训练7. 实时检测部署 前期准备复现流程第一步&#xff1a;系统和网络配置1.1 安装和设置操作系统1.2 安装VirtualBox和Mininet1.3 创建SDN网络拓扑 第二步&am…

探索现代软件开发中的持续集成与持续交付(CI/CD)实践

探索现代软件开发中的持续集成与持续交付&#xff08;CI/CD&#xff09;实践 随着软件开发的飞速进步&#xff0c;现代开发团队已经从传统的开发模式向更加自动化和灵活的开发流程转变。持续集成&#xff08;CI&#xff09; 与 持续交付&#xff08;CD&#xff09; 成为当下主…

w~自动驾驶合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286744 #自动驾驶的技术发展路线 端到端自动驾驶 Recent Advancements in End-to-End Autonomous Driving using Deep Learning: A SurveyEnd-to-end Autonomous Driving: Challenges and Frontiers 在线高精地图 HDMa…

iOS AVAudioSession 详解【音乐播放器的配置】

前言 在 iOS 音频开发中&#xff0c;AVAudioSession 是至关重要的工具&#xff0c;它控制着应用的音频行为&#xff0c;包括播放、录音、后台支持和音频中断处理等。对于音乐播放器等音频需求强烈的应用&#xff0c;设计一个合理的 AVAudioSession 管理体系不仅能保证音频播放…

三周精通FastAPI:16 Handling Errors处理错误

官网文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/handling-errors 处理错误 某些情况下&#xff0c;需要向客户端返回错误提示。 这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。 需要向客户端返回错误提示的场景主要如下&#xff1a; 客户端…

FastAPI、langchain搭建chatbot,langgraph实现历史记录

环境&#xff1a;openEuler、python 3.11.6、Azure openAi、langchain 0.3.3、langgraph 0.2.38 背景&#xff1a;基于FastAPI、langchain实现一个QA系统&#xff0c;要求实现历史记录以及存储特征信息 时间&#xff1a;20241022 说明&#xff1a;在历史记录的存储中&…