MySQL子查询及其案例

MySQL子查询及其案例

子查询

在查询中嵌套另一个查询

子查询案例

sql 复制代码
-- 创建部门表
create table department(
	dept_id int comment '部门id',
	dept_name varchar(10) comment '部门名称'
)comment '部门表';

-- 给部门表添加数据
insert into department values
	(1, '总部'),
	(2, '开发部'),
	(3, '咨询部'),
	(4, '财务部'),
	(5, '行政部'),
	(6, '人力部');

-- 创建经理表
create table manager(
	manager_id int comment '经理id',
	manager_name varchar(10) comment '经理名字',
	dept_id int comment '部门id'
)comment '经理表';

-- 给经理表添加数据
insert into manager values
	(1, '黄文隆', 1),
	(2, '张吉', 2),
	(3, '林玟', 3),
	(4, '林雅', 3),
	(5, '江奕', 3),
	(6, '刘柏', 4),
	(7, '吉茹', 4);
	
-- 创建员工表
create table employee(
	emp_id int,
	emp_name varchar(10),
	job_position enum(
		'CEO',
		'开发人员',
		'顾问',
		'经理',
		'HR',
		'会计',
		'行政'
	),
	salary decimal(10, 2),
	dept_id int,
	manager_id int 
);

-- 给员工表添加数据
insert into employee(emp_id, emp_name, job_position, salary, dept_id, manager_id) 
values 
(101, '黄文隆', 'CEO', 100000.00, 1, NULL),
(102, '张吉',   '经理', 30000.00, 2, 1),
(103, '谢彦',   '开发人员', 15000.00, 2, 2),
(104, '傅智翔', '开发人员', 12000.00, 2, 2),
(105, '林玟',   '经理', 35000.00, 3, 1),
(106, '荣姿康', '顾问', 12000.00, 3, 3),
(107, '林雅',   '经理', 32500.00, 3, 1),
(108, '雷进宝', '顾问', 12500.00, 3, 4),
(109, '江奕',   '经理', 31000.00, 3, 1),
(110, '李雅惠', '顾问', 26000.00, 3, 5),
(111, '吴佳瑞', 'HR',  12000.00, NULL, NULL),
(112, '周琼玟', '会计', 14000.00, NULL, NULL),
(113, '黄文',   '行政', 19000.00, NULL, NULL);

select * from department;   # 结果如下图1
select * from manager;      # 结果如下图2
select * from employee;     # 结果如下图3


图1. 部门表

图2. 经理表

图3. 员工表

sql 复制代码
-- 查询由咨询部的经理管理的员工
-- 1.查询咨询部对应的部门id
select dept_id from department where dept_name='咨询部';  # 结果为 3
-- 2.查询第一步得到的部门id对应的经理id
select manager_id from manager where dept_id=3;  # 结果为 3 4 5
-- 3.查询第二步得到的经理id对应的员工
select emp_name, job_position, salary from employee where manager_id in(3, 4, 5);  # 结果如下图4

-- 改为子查询的写法
select emp_name, job_position, salary 
from employee 
where manager_id in(
	select manager_id 
	from manager 
	where dept_id=(
		select dept_id 
		from department 
		where dept_name='咨询部'
	)
);   # 结果如下图4


图4. 由咨询部的经理管理的员工

sql 复制代码
-- 查询职位为开发人员或顾问的员工所属的部门名称
-- 1.查询开发人员或顾问对应的部门id
select dept_id from employee where job_position in('开发人员', '顾问');  # 结果为 2 2 3 3 3
-- 2.查询由第一步得到的部门id对应的部门名称
select dept_name from department where dept_id in(2, 3);  # 结果为 开发部 咨询部

-- 改为子查询的写法
select  distinct dept_name 
from department 
where dept_id in(
	select dept_id 
	from employee 
	where job_position 
	in('开发人员', '顾问')
);   # 结果为 开发部 咨询部
sql 复制代码
-- 查询薪资高于任意一个开发人员的非开发人员 
-- 任意 any()
select emp_name as 员工姓名, job_position as 职位, salary as 薪资
from employee 
where job_position != '开发人员'
and salary > any(
	select salary 
	from employee 
	where job_position='开发人员'
);   # 结果如下图5


图5. 薪资高于任意一个开发人员的非开发人员

相关推荐
精益数智工坊几秒前
拆解制造业仓库物料管理流程:如何通过标准化仓库物料管理流程解决账实不符难题
大数据·前端·数据库·人工智能·精益工程
nbwenren10 分钟前
办公AI实测:Gemini3、GPT-4o、Claude3.5谁更强?
服务器·数据库·php
2401_8242226914 分钟前
如何卸载并重装Oracle Grid_Deinstall脚本与ASM磁盘清理
jvm·数据库·python
杨云龙UP17 分钟前
Oracle数据库启动失败:ORA-29701、ORA-01565、ORA-17503故障处理记录_20260429
linux·运维·数据库·oracle·centos
qq_4142565717 分钟前
生产库如何利用Navicat实现配置特定触发器事件调度_提高管理效率
jvm·数据库·python
2301_8084143819 分钟前
MySQL表的约束
数据库·mysql
2301_7756398923 分钟前
mysql如何查看服务器支持的存储引擎_使用SHOW ENGINES命令
jvm·数据库·python
a7963lin25 分钟前
html标签怎样表示搜索框_input type=search语义优化【操作】
jvm·数据库·python
a7963lin29 分钟前
Python数据分析如何识别异常值_IQR四分位距检测法实战
jvm·数据库·python
m0_6138562931 分钟前
如何解决宝塔面板Web端文件管理器打开目录时反应极其缓慢
jvm·数据库·python