[mysql]相关子查询

相关子查询

相关子查询的概述

我们前面把单行子查询和多行子查询就已经说完了,我们现在要把继续把相关子查询的内容给大家说明白,因为之前用的都是不相关子查询的案例,

我们来谈一谈相关子查询,记住单行子查询和多行子查询是可以进行相关子查询,只是我们刚才写的案例都是相关子查询的案例.

我们看一下,如果子查询的执行依赖于外部查询,用到了外部的表,每次查询的时候都要执行一次外部查询,那么这样的子查询就被我们叫做关联子查询,下面列出了子查询的步骤,

比如我们之前的案例,查询比abel这个人工资高的员工姓名和工资

这里内查询是11000的值,我们外查询的107个值和这11000进行对比,是否满足关系.如果结果是1我们就要,结果是0我们就不要.

而相关子查询就不一样的.

比如

我们这里内查询的表是不是出现了外查询的数据.我们实际步骤是从外查询找到了一条数据,然后送到内查询中去,送进去的值我们看看要怎么用,怎么运算.通过这个运算,返回一个SELECT的结果,可能是一个列也可能是2个列.第三步拿着我们送进去的数据结果和条件比较,然后最后对比结果是1我们就要,不是我们就不要,我们那一个案例来说明

WHERE中的相关子查询

题目1,我们要查询员工工资大于本部门平均工资的员工姓名工资和其部门id

那么我们是不是假如查询的是张三,那么子查询的内容就是张三部门的平均工资,如果查询的是李思,子查询的内容就是李四部门的平均工资,子查询的内容是跟随外部数据的变化而变化的就说明这是相关子查询,

我们来看看怎么做:

首先我们看看

题目查询员工工资大于60号部门平均工资的员工姓名工资和其部门id怎么写

SELECT last_name,salary

FROM employees

WHERE salary>(

              SELECT AVG(salary)

              FROM employees

              WHERE department_id=60)

但是实际是我们要的是本部门,所以60这个值需要修改成外查询的部门,所以我们给外查询的表起个名T1,内查询表起个名T2

SELECT last_name,salary

FROM employees T1

WHERE salary>(

              SELECT AVG(salary)

              FROM employees T2

              WHERE T2.department_id=T1.department_id)

我们执行一下

FROM中的相关子查询

这个子查询我们也可以用在FROM中声明子查询或者说连接子查询的的方法去写这个内容

如果我们的表里面多一个字段是部门的平均工资,那么是不是就可以直接用这个字段来筛选我们的表呢.自然是可行的.解答如下,我们把这两个表连接起来

SELECT last_name,salary

FROM employees T1 JOIN

(SELECT department_id,AVG(salary) avg_salary FROM employees T2 GROUP BY department_id) T2

ON T1.department_id=T2.department_id

WHERE T1.salary>T2.avg_salary

注意这里必须给表的聚合函数起一个别名才能连接使用

ORDER BY中使用子查询

查询员工的id,salary 安装department_name 排序

SELECT employee_id,salary

FROM employees e

ORDER BY(SELECT T1.department_name

          FROM departments T1

          WHERE T1.department_id=e.department_id)

          ASC

结论

子查询除了在GROUP BY和LIMIT中其他地方都可以使用子查询

题目,如果employee表中employee_id

与job_histoty表中的employe_id相同的数目不小于2输出相同id的员工的employee_id,last_name和其job_id

employee_id

这里就是要找到我们在job_history中调岗超过2次的员工

我们首先

SELECT employee_id,last_name,job_id FROM employees T1

WHERE (SELECT count(employee_id)

        FROM job_history T2

        WHERE T2.employee_id=T1.employee_id)

        >=2

这里是不是就相当于这个员工出现了2次不同工作的情况,说明调过岗位.

而且这里我们子查询既然出现了外查询的表,那就说明是相关子查询

关键词EXISTS 与NOT EXISTS

这两个关键字代表的是是否存在满足条件的行,一般出现这种情况属于相关子查询,因为如果子查询不和外查询相关的话,这个查询也就一直是FALSE或者一直是TRUE,那么EXISTS关键字就没有意义了.

查询公司管理者的employee_id,last_name,job_id,department_id

方法1:自连接

SELECT DISTINCT T2.manager_id,T1.last_name,T1.job_id,T1.department_id FROM employees T1 JOIN

employees T2 ON T1.employee_id=T2.manager_id

注意这里使用的是T1的字段,如果是T2的字段,代表的含义就是这个id的员工管 理了几个人

方法2:子查询

方法3:EXISTS

这个关键词的含义是把子查询的WHERE当成一个条件,而WHERE会把每一行数据都送进来进行判断,如果判断成功,WHERE就会把这条记录保留下来.所以本质是EXISTS是类似PYTHON和JAVA中的IF满足条件.也就是说前面SELECT后面跟的字段完全没有意义.

题目查询departments表中不存在于employees中的部门的department_id和department_name

这个题目是不是类似于我们讲内连接的时候的时候满足员工是空,部门存在的情况

SELECT department_id,department_name FROM departments T2

WHERE NOT EXISTS(SELECT * FROM employees T1

WHERE T1.department_id= T2.department_id)

SELECT employee_id,T2.department_id FROM employees RIGHT JOIN departments T2

ON employees.employee_id IS NULL

更新中的相关子查询

在员工表中添加一个department_name字段,数据为员工对应的部门名称

UPDATE employees e

SET department_name =(SELECT department_name

FROM departments d

WHERE e.department_id=d.department_id)

这个update本来是添加列的,我们现在添加列的值是利用=,每一行都会运行一遍子查询,寻找其中这行对应的department_name的值.

这是单行子查询,并且也是相关子查询

删除中的相关子查询

DELETE FROM employees e

WHERE employee_id IN (SELECT employee_id FROM emp_history

WHERE employee_id=e.employee_id)

思考题:谁的工资比Abel高呢,使用那个方法效率高

第一个方法是自连接,直接每个表都连上abel的工资,然后选出大于abel的

SELECT department_id,department_name FROM departments T2

WHERE NOT EXISTS(SELECT * FROM employees T1

WHERE T1.department_id= T2.department_id)

第二个方法是子查询,直接筛选条件,大于abel的

SELECT employee_id FROM employees

WHERE  salary>(SELECT salary FROM employees

WHERE last_name='abel')

结论:多表连接

是方法要用多表连接的方法,现在数据库会自动识别这种可以直接转换为自连接.的子查询,把它转化为自连接,因为DBMS系统都对自连接这种多表查询的方式进行了优化,而子查询是根据未知的表查询后的条件判断.所以前者快.具体原因我们下篇再说

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

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

相关文章

【C++】—— priority_queue :平衡效率与秩序的算法利器

去感受一棵草、一缕风、一场日落,去重新触摸真正的生活。 ——高盛元 目录 1、优先级队列 1.1什么是优先级队列 1.2 priority_queue 的使用 1.3 仿函数 2、priority_queue 的模拟实现 2.1整体框架接口 2.2插入&&向上调整 2.2删除&&向下调整…

AI与低代码的碰撞:企业数字化转型的新引擎

引言 在当今的商业环境中,企业数字化转型已从选择题变成了必答题。面对日益复杂的市场竞争和不断变化的客户需求,传统的开发模式常常显得力不从心——开发周期冗长、技术门槛高、成本居高不下,企业很难快速响应市场变化。而在这种背景下&…

智慧用电监控装置:引领0.4kV安全用电新时代

在智能科技日新月异的今天,电力安全与管理正迎来一场前所未有的革新。为0.4kV以下TT、TN系统打造的智慧用电在线监控装置不仅重新定义了电力监控的边界,更为建筑安全用电筑起了一道坚不可摧的防线。 装置集成了单、三相交流电精确测量、四象限电能计量、…

【Linux内核揭秘】深入理解命令行参数和环境变量

文章目录 命令行参数什么是命令行参数main函数的参数 环境变量什么是环境变量常见的环境变量PATHHOMESHELLPWDOLDPWD 本地变量总结 命令行参数 什么是命令行参数 形如这样的命令后面带的选项就是命令行参数。 首先我们要了解一下命令行参数的原理。 我们知道像ls,mkdir,touch等…

leetcode57:插入区间

给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…

探熵科技|以科技赋能销售,创造卓越业绩。

发展 在当今时代,AI 和大数据技术迅猛发展,各行业与大数据技术的融合已成为推动企业发展的重要力量。 天眼销 探熵科技作为一家专注于商业数据服务的专业公司,始终致力于为企业和个人提供高质量的数据解决方案。我们凭借深厚的技术实力和对…

Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

1 、安装OpenResty 安装使用 OpenResty,这是一个集成了各种 Lua 模块的 Nginx 服务器,是一个以Nginx为核心同时包含很多第三方模块的Web应用服务器,使用Nginx的同时又能使用lua等模块实现复杂的控制。 (1)安装编译工具…

批量剪辑视频软件源码搭建全解析,支持OEM

一、引言 在当今数字化内容创作的时代,视频制作的需求呈爆发式增长。无论是社交媒体上的短视频创作者,还是专业的视频制作团队,都面临着大量视频剪辑的任务。批量剪辑视频软件应运而生,它能够显著提高视频剪辑的效率,满…

C语言笔记(指针题目)例题+图解

本文分为两部分 ,第一部分为数组、字符串、字符指针在sizeof和strlen中的辨析,第二部分是一些笔试题目。若有错误,请批评指正。 目录 1.第一部分 1.1.数组名的使用 1.1.1一维整型数组在sizeof中的使用 1.1.2一维字符数组在sizeof中的使用…

015:地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework安装教程

摘要:本文详细介绍地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework的安装流程。 一、软件介绍 ArcGIS Engine 10.2是由Esri公司开发的一款强大的GIS(地理信息系统)开发平台。该软件基于ArcGIS 10.2 fo…

华为手机卸载系统应用的方法

摘要: 1.手机环境:手机需要开启开发者模式并使用usb连接电脑,并选择文件传输模式 2.电脑环境:使用鸿蒙工具箱进行傻瓜操作或安装adb工具进行命令卸载 3.鸿蒙工具箱和adb工具本质都是使用adb shell pm uninstall -k --user 0 xx…

大数据中心年度数据运营服务项目实施技术方案(183页WORD)

文档介绍: 本大数据中心年度数据运营服务项目实施技术方案,通过构建高效的数据集成与治理平台、数据分析平台以及创新的数据服务模式,旨在为企业内外部用户提供更加精准、高效的数据支持。同时,注重安全与合规保障,确…

【linux网络编程】| socket套接字 | 实现UDP协议聊天室

前言:本节内容将带友友们实现一个UDP协议的聊天室。 主要原理是客户端发送数据给服务端。 服务端将数据再转发给所有链接服务端的客户端。 所以, 我们主要就是要实现客户端以及服务端的逻辑代码。 那么, 接下来开始我们的学习吧。 ps:本节内容…

TIFS-2024 FIRe2:细粒度表示和重组在换衣行人重识别中的应用

总体结论 本文提出了一种新的细粒度表示与重构(FIRe2)框架,用于解决布变人重识别问题。通过细粒度特征挖掘和属性重构,FIRe2在不依赖任何辅助信息的情况下,实现了最先进的性能。该方法在多个基准数据集上取得了显著的…

一款专业获取 iOS 设备的 UDID 工具|一键获取iPhone iPad设备的 UDID

什么是UDID? UDID,是iOS设备的一个唯一识别码,每台iOS设备都有一个独一无二的编码,这个编码,我们称之为识别码,也叫做UDID( Unique Device Identifier) 扫描后系统提示输入密码&am…

HTML--浮动布局练习

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 整个浏览器页…

ES6 变量的解构赋值

数组的解构赋值 对象的解构赋值 字符串的解构赋值

利用游戏引擎的优势

大家好&#xff0c;我是小蜗牛。 在当今快速发展的游戏产业中&#xff0c;选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎&#xff0c;为开发者提供了丰富的工具和资源&#xff0c;使他们能够高效地开发出优秀的游戏。本文将探讨如何…

Python+Selenium+Pytest+POM自动化测试框架封装(完整版)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、测试框架简介 1&#xff09;测试框架的优点 代码复用率高&#xff0c;如果不使用框架的话&#xff0c;代码会显得很冗余。可以组装日志、报告、邮件等一些高…

【鸿蒙HarmonyOS实战:通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程(邀请码)方式教程详解】

鸿蒙HarmonyOS实战&#xff1a;通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程&#xff08;邀请码&#xff09;方式详解 在使用uniapp打包的鸿蒙项目的过程中&#xff0c;由于生成的是app文件&#xff0c;而hdc传给鸿蒙HarmonyOS系统需要的是hap文…