MySQL的子查询

2023-11-03

什么是子查询

子查询,是指一个查询语句嵌套在另一个查询语句内的查询,因此也称为“嵌套查询”。
比如, 要查询谁的工资比Abel高?

# 谁的工资比Abel高
# 方式1:两次查询
SELECT salary 
FROM employees 
WHERE last_name = 'Abel'; -- 返回11000

SELECT last_name,salary
FROM employees
WHERE salary > 11000; -- 返回10行记录

# 方式2:自连接
SELECT e1.salary,e1.last_name
FROM employees e1,employees e2
WHERE e1.salary > e2.salary
AND e2.last_name = 'Abel'; -- 返回10行记录

# 方式3:子查询
SELECT last_name,salary
FROM employees
WHERE salary > (
				SELECT salary
				FROM employees
				WHERE last_name = 'Abel'
				) -- 返回10行记录

单行子查询和多行子查询

按照子查询返回的记录行数,分为单行子查询和多行子查询。

单行子查询

单行子查询,即子查询返回单行记录。
单行子查询使用的比较操作符有:>>=<<==<>

  1. 查询工资大于149号员工工资的员工信息。
# 查询工资大于149号员工工资的员工信息
SELECT last_name,employee_id,salary
FROM employees
WHERE salary > (
				SELECT salary
				FROM employees
				WHERE employee_id = 149
				)
  1. 返回job_id与141号员工相同,salary比143号员工高的员工姓名、job_id和工资。
# 返回job_id与141号员工相同,salary比143号员工高的员工姓名、job_id和工资。
SELECT last_name,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
				);
  1. 返回公司工资最少的员工的last_name、job_id和salary。
# 返回公司工资最少的员工的last_name、job_id和salary
SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
				SELECT MIN(salary)
				FROM employees
				)
  1. 查询与141号的manager_id和department_id相同的其他员工的employee_id、manager_id、department_id。
# 查询与141号的manager_id和department_id相同的其他员工的employee_id、manager_id、department_id
# 第一种写法
SELECT employee_id,manager_id,department_id
FROM employees
WHERE manager_id = (
					SELECT manager_id
					FROM employees
					WHERE employee_id = 141
					)
AND manager_id = (
					SELECT manager_id
					FROM employees
					WHERE employee_id = 141
					)
AND employee_id <> 141; -- 返回7行记录

# 第二种写法
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
									)
AND employee_id <> 141; -- 返回7行记录
  1. 查询最低工资大于50号部门最低工资的部门id和其最低工资。
# 查询最低工资大于50号部门最低工资的部门id和其最低工资
SELECT MIN(salary),department_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING MIN(salary) > (
						SELECT MIN(salary)
						FROM employees
						WHERE department_id = 50
						) -- 返回10行记录
  1. 显示员工的employee_id、last_name和location。其中,如果员工department_id与location_id为1800的department_id相同,则location为’Canada’,其余则为’USA’。
#显示员工的employee_id、last_name和location。其中,如果员工department_id与location_id为1800的department_id相同,则location为'Canada',其余则为'USA'。

# 第一步
SELECT department_id
FROM departments
WHERE location_id = 1800; -- 返回20
# 第二步
SELECT employee_id,last_name,CASE department_id WHEN 20 THEN 'Canada'
												ELSE 'USA' END "location"
FROM employees; -- 返回107行记录

# 汇总
SELECT employee_id,last_name,CASE department_id WHEN (SELECT department_id
													  FROM departments
													  WHERE location_id = 1800) THEN 'Canada'
												ELSE 'USA' END "location"
FROM employees; -- 返回107行记录

多行子查询

多行子查询,即子查询返回多行记录。
多行子查询使用的比较操作符有:INANYALLSOME

  • IN,等于列表中的任意一个
  • ANY,需要和单行比较操作符一起使用,和子查询返回的某一个值比较。
  • ALL,需要和单行比较操作符一起使用,和子查询返回的所有值比较。
  • SOME,ANY的别名,作用相同,但常用ANY。
  1. 返回其他job_id中比job_id为’IT_PROG’部门任意一工资低的employee_id、last_name、job_id、salary。
# 返回其他job_id中比job_id为'IT_PROG'部门任意一工资低的employee_id、last_name、job_id、salary。
SELECT employee_id,last_name,job_id,salary
FROM employees 
WHERE job_id <> 'IT_PROG'
AND  salary < ANY (
					SELECT salary
					FROM employees
					WHERE job_id = 'IT_PROG'
					); -- 返回76行记录
  1. 返回其他job_id中比job_id为’IT_PROG’部门所有工资低的employee_id、last_name、job_id、salary。
# 返回其他job_id中比job_id为'IT_PROG'部门所有工资低的employee_id、last_name、job_id、salary。
SELECT employee_id,last_name,job_id,salary
FROM employees 
WHERE job_id <> 'IT_PROG'
AND  salary < ALL (
					SELECT salary
					FROM employees
					WHERE job_id = 'IT_PROG'
					); -- 返回44行记录
  1. 查询平均工资最低的部门。
# 查询平均工资最低的部门
# 方式1
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
					SELECT MIN(avg_sal)
					FROM (
						SELECT AVG(salary) avg_sal
						FROM employees
						GROUP BY department_id
						) t_dep_avg_sal
					);
/*
返回
department_id AVG(salary)
50	          3475.555556
*/

# 方式2
SELECT department_id,AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL (
							SELECT AVG(salary)
							FROM employees
							GROUP BY department_id
							);
/*
返回
department_id AVG(salary)
50	          3475.555556
*/
														
# 方式3
SELECT department_id,AVG(salary) avg_sal
FROM employees
GROUP BY department_id
ORDER BY avg_sal ASC
LIMIT 1;
/*
返回
department_id avg_sal
50	          3475.555556
*/
  1. 空值问题
SELECT employee_id
FROM employees;  -- 返回107行记录

SELECT employee_id
FROM employees
WHERE employee_id IN (
					SELECT manager_id
					FROM employees
				); -- 返回18行记录
										
SELECT employee_id
FROM employees
WHERE employee_id NOT IN (
						SELECT manager_id
						FROM employees
						); -- 返回0行记录,因为SELECT manager_id FROM employees中有空值(NULL)
													
SELECT employee_id
FROM employees
WHERE employee_id NOT IN (
						SELECT manager_id
						FROM employees
						WHERE manager_id IS NOT NULL
						); -- 返回89行记录
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL的子查询 的相关文章

随机推荐

  • Teradata SQL 线性回归函数

    基于budget amounts排队得到前三个部门 显示部门号和预算 SELECT department number salary amount RANK salary amount AS Rank FROM dapartment QUA
  • Typescript(九)配置文件 tsconfig.json

    TypeScript 使用 tsconfig json 文件作为其配置文件 当一个目录中存在 tsconfig json 文件 则认为该目录为 TypeScript 项目的根目录 通常 tsconfig json 文件主要包含两部分内容 指
  • unity

    一 理解我们要做的事 原本图片放入文件夹后是Default 默认 模式 但是需要大量处理图片的时候 我们希望它拖进去就是sprite模式 我们想修改unity原本的功能 二 unity是允许我们去修改它本身的一些功能的 你可以定制属于你的u
  • JVM系列(十) 垃圾收集器之 Parallel Scavenge/Old

    上篇文章我们讲解了单线程垃圾收集器 Serial SerialOld 与之相对应的多线程垃圾收集器就是 Parallel Scavenge Old 本文我们讲解下多线程垃圾收集器 Parallel Scavenge Old 垃圾收集器 新生
  • 2018年TI杯电子设计竞赛感悟

    2018年7月27日 电赛结束已经有三四天的时间了 今年的感悟和去年的相比很是不同 去年大一 刚刚入门单片机 搞点东西也都是瞎搞 没有一个像模像样的作品 即使是有也都是一些次品 半成品 得知学校选拔学生参加全国大学生电子设计竞赛 单数年为国
  • linux添加sshkey,linux 配置 ssh密钥登陆

    配置这个其实很简单 一点也不复杂 首先需要在服务器安装openssh 如果你不安装你是找不到配置密钥登陆的配置文件的 yum install y openssh 安装好后就需要去配置密钥登陆了 vi etc ssh sshd config
  • kali持久化U盘镜像安装教程

    https zhuanlan zhihu com p 436210497 utm id 0
  • opencv 轻松入门 面向python pdf_面向Python 的OpenCV轻松入门——第三章(3)

    3 3 按位逻辑运算 逻辑运算是一种非常重要的运算方式 图像处理过程中经常要按照位进行逻辑运算 本节 介绍 Opencv中的按位逻辑运算 简称位运算 在 Opencv内 常见的位运算函数如表3 1所示 表3 1 常见的位运算函数 函数名 基
  • linux的依赖关系

    依赖关系最简单的一个理解就是 Windows 上你玩游戏结果提示 directx 版本过低无法运行 以及常见的运行某个程序之后提示 mfc71 dll 未找到 还有就是用个软件结果安装说明上让你先去安装 net Linux 的依赖关系因为他
  • iOS开发入门教程

    当涉及到详细的教程和排版要求时 纯文本形式的回答无法满足您的需求 以下是一个简单的iOS开发入门教程大纲 您可以按照该大纲进行深入学习和实践 iOS开发入门教程大纲 1 开发环境搭建 下载和安装Xcode 配置iOS模拟器 2 Swift语
  • Echarts

    目录 1 1 什么是ECharts 1 2 ECharts基本使用 1 3 ECharts标题组件 1 4 ECharts工具箱组件 1 5 ECharts弹窗组件 1 6 ECharts饼状图 1 7 ECharts航线图 更详细的教程请
  • spice协议详解(二):spice支持功能和优势

    SPICE Simple Protocol for Independent Computing Environments 是目前最有潜力的开源虚拟桌面协议 最初是由Qumranet开发 后来被RedHat收购并开源 经过几年的社区开发 sp
  • 爆肝整理,Python自动化测试-Pytest参数化实战封装,一篇打通...

    目录 导读 前言 一 Python编程入门到精通 二 接口自动化项目实战 三 Web自动化项目实战 四 App自动化项目实战 五 一线大厂简历 六 测试开发DevOps体系 七 常用自动化测试工具 八 JMeter性能测试 九 总结 尾部小
  • [大话IT]圈套玄机—《圈子圈套》中的案例分析

    2006 02 22 00 20 14 Filter pattern 楼主 supernal pig 地址 http www12 tianya cn new Publicforum Content asp idWriter 2974942
  • 【拒绝主观!】C++继承中父类的构造函数和析构函数调用情况

    C 继承中父类的构造函数和析构函数调用情况 父类构造函数调用规则 子类会默认调用父类的无参构造函数 且发生在子类所有代码执行之前 原因 父类里面的一些成员可能被设置为private 导致该成员变量只能由父类自己初始化 如果父类不存在无参构造
  • java求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+2....(java50道经典编程题)

    题目 求s a aa aaa aaaa aa a的值 其中a是一个数字 例如2 22 222 2222 22222 此时共有5个数相加 几个数相加有键盘控制 对于这个题目来说还是比较简单的不过我在编码过程中好像漏了点东西 调试了几遍才好 这
  • React路由懒加载的方式之一

    第一步 在组件中引入 lazy Suspense这两个api import React Component lazy Suspense from react 导入我们的路由组件 示例 import Home from Home import
  • vue-router路由中对query中的参数进行加密

    vue router路由中对query中的参数进行加密 源码地址在文末 在创建路由的时候 添加两个方法 stringifyQuery 序列化传入的query参数 方法可以接收一个对象参数 在new Router的时候传递这个属性 在序列化q
  • HDU寝室断电快乐上网指南(基于树莓派3B+的软路由

    HDU寝室断电快乐上网指南 基于树莓派3B 的软路由 前言 准备工作 1 PPPOE拨号上网 2 解除禁用网卡 3 安装一些其它必要程序 3 1 hostapd 3 2 dnsmasq 4 WIFI热点配置 4 1 解除禁用hostapd
  • MySQL的子查询

    文章目录 什么是子查询 单行子查询和多行子查询 单行子查询 多行子查询 什么是子查询 子查询 是指一个查询语句嵌套在另一个查询语句内的查询 因此也称为 嵌套查询 比如 要查询谁的工资比Abel高 谁的工资比Abel高 方式1 两次查询 SE