学习MySQL第七天

夕阳无限好

只是近黄昏

一、子查询

1.1 定义

将一个查询语句嵌套到另一个查询语句内部的查询

我们通过具体示例来进行演示,这一篇博客更侧重于通过具体的小问题来引导大家独立思考,然后熟悉子查询相关的知识点

1.2 问题1

谁的工资比Tom高

sql 复制代码
方式1:
SELECT name,salary
FROM employees
WHERE name='Tom'

SELECT NAME,salary
FROM employees
WHERE salary > 500

方式2:自连接
SELECT t2.NAME,t2.salary
from employees t1,employees t2
WHERE t2.salary > t1.salary  AND 
t1.name = 'Tom'

方式3:子查询
# 外部
SELECT name,salary
FROM employees
WHERE salary > (
# 内部
  SELECT salary 
  FROM employees
  WHERE name ='Tom'
)
1.3 称谓的规范

(1) 外查询(主查询)、内查询(子查询)

(2) 子查询(内查询)在主查询之前一次执行完成

(3) 子查询的结果被主查询(外查询)使用

1.4 注意事项

(1) 子查询要包含在括号内

(2) 将子查询放在比较条件的右侧,提高可读性

(3) 单行操作符对应单行子查询,多行操作符对应多行子查询

1.5 子查询分类

1.单行子查询和多行子查询

子查询部分只返回一个值供使用,就比如C语言中副函数每次return只返回一个值,这种情况叫做单行子查询

2.根据内查询是否被执行多次

分为相关子查询和不相关子查询

不相关子查询:子查询固定返回的值不受外部的影响

二、单行子查询

2.1 单行操作符: = > < >= <=> !=
2.2 练习1:查询工资大于id为3的员工工资的员工信息
sql 复制代码
SELECT id,name,salary
from employees
WHERE salary > (
	SELECT salary
	FROM employees
	WHERE id=3
)
2.3 练习2:返回top_id与id=3相同的员工的工资比他多的 name、id
sql 复制代码
SELECT name,id,salary
FROM employees
WHERE top_id = (
	SELECT top_id
	FROM employees
	WHERE id = 3
) 
AND salary > (
	SELECT salary
	FROM employees
	WHERE id =3
)
2.4 练习3:返回公司里面工资最少的人的信息,包含name、id、top_id、salary
sql 复制代码
SELECT name,id,top_id,salary
FROM employees
WHERE salary = (
	SELECT MIN(salary)
	FROM employees
)
2.5 问题4:查询最低工资大于top_id为1的部门的最低工资的部门top_id和最低工资
sql 复制代码
SELECT top_id,MIN(salary)
FROM employees
GROUP BY top_id
HAVING MIN(salary) > (
	SELECT MIN(salary)
	FROM employees
	WHERE top_id = 1
)

三、多行子查询

3.1 引言

与单行查询不同的是,内查询返回多行,也就是多个值,你用一个可以选择其中的一个作为你的选择,你也可以全部都接收,但需要用同等数量的字段来接受

3.2 命令语句

(1) IN 等于列表中的任意一个

(2) ANY 只选一个

(3) SOME ANY的别名和ANY作用一样

(4) ALL 全部选择

3.3 练习: 这里演示一个 IN
sql 复制代码
# 查找工资等于各个top_id中最低工资的人员姓名
SELECT name,salary
FROM employees
WHERE salary IN (
				SELECT MIN(salary)
				FROM employees
				GROUP BY top_id
)
3.4 练习: 这里演示ALL
sql 复制代码
按照top_id进行分组,求平均工资最小的那一组
SELECT top_id,AVG(salary)
FROM employees
GROUP BY top_id
HAVING avg(salary)<=ALL(
	# 小于所有部门的最小值就相当于值最小的那个组
	SELECT AVG(salary)
	FROM employees
	GROUP BY top_id 					
)
3.5 注意

这里我们要特别注意下空值问题,下面的题目中,我们的department_id中包含一个空值,当我们对其内查询时,就会出现错误,此时我们可以通过加注判断条件来避免

报错演示

sql 复制代码
# 查询已经分配好部门的员工信息
# 示例
SELECT name,department_id
FROM employees
WHERE department_id NOT IN (
	SELECT department_id
	FROM employees
)

四、结语

山不在高,有仙则名;水不在深,有龙则灵。希望我们都可以通过自己的努力成为那个关键的要素

须知少日拏云志,曾许人间第一流。我们还年轻,我们还有无限可能!

相关推荐
农民也会写代码20 分钟前
php将json数据保存在MySQL中并读取
mysql·json·php
独行soc29 分钟前
2025年渗透测试面试题总结-某战队红队实习面经(附回答)(题目+回答)
linux·运维·服务器·学习·面试·职场和发展·渗透测试
奋斗者1号1 小时前
神经网络:节点、隐藏层与非线性学习
网络·神经网络·学习
极小狐1 小时前
如何创建并使用极狐GitLab 项目访问令牌?
数据库·ci/cd·gitlab·devops·mcp
真的想上岸啊2 小时前
学习Linux的第二天
学习
吃货界的硬件攻城狮2 小时前
【STM32 学习笔记】EXTI外部中断
笔记·stm32·学习
吃货界的硬件攻城狮2 小时前
【STM32 学习笔记 】OLED显示屏及Keil调试
笔记·stm32·学习
言之。3 小时前
【Django】REST 常用类
数据库·django·sqlite
njsgcs3 小时前
chili3d调试笔记12 deepwiki viewport svg雪碧图 camera three.ts
笔记
非凡ghost3 小时前
NoxLucky:个性化动态桌面,打造独一无二的手机体验
学习·智能手机·软件需求