子查询+「EXISTS」 以及 组合查询UNION ALL

本文介绍了如何在SQL中使用子查询进行数据计算、过滤,以及如何利用EXISTS和NOTEXISTS优化查询。此外,还讲解了UNIONALL和UNION在合并结果集时的区别和用法,包括如何处理重复记录和合并多个条件的查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方便的子查询及EXISTS

使用子查询作为计算手段

比如:如何同时查询出学生编号、学生姓名、老师编号、老师姓名?

SELECT student_name, student_id, teacher_id,
(
	SELECT teacher_name FROM teacher b
	WHERE b.teacher_id = a.teacher_id
) AS teacherName
FROM student a;

注意: 子查询 里边不可返回多条查询记录,否则会直接报错。
上边查询后的数据如下:
请添加图片描述

使用子查询过滤数据(IN)

如何获取姓牛的老师教了哪些学生?

备注:老师表中有 teacher_name, teacher_id。 学生表中有 teacher_id 和老师表关联

代码:

SELECT * FROM teacher WHERE teacher_name LIKE '牛%';
SELECT student_id,student_name FROM student WHERE teacher_id IN ('T0010','T0011');

优化代码:

SELECT student_id, student_name FROM student
WHERE teacher_id IN 
(
	SELECT teacher_id FROM teacher WHERE teacher_name LIKE '牛%'
);

前伸「后边会学 表关联用法」

SELECT student_id, student_name FROM student a
INNER JOIN teacher b ON 
a.teacher_id = b.teacher_id AND teacher_name LIKE '牛%';

查询后的数据如下:
请添加图片描述

使用子查询过滤数据(EXISTS)

通过 exists实现 获取姓牛的老师教了哪些学生?

SELECT student_id, student_name FROM student a
WHERE EXISTS ( 
			SELECT 1 FROM teacher b
			WHERE a.teacher_id = b.teacher_id
			AND b.teacher_name LIKE '牛%'
			);

如何获取除姓牛的老师之外的其他老师教了哪些学生?

SELECT student_id, student_name FROM student a
WHERE NOT EXISTS ( 
				SELECT 1 FROM teacher b
				WHERE a.teacher_id = b.teacher_id
				AND b.teacher_name LIKE '牛%'
				);

组合查询UNION ALL

请添加图片描述

如何使用UNION ALL合并多个结果集

如何同时查询出年龄为10岁或一年级一班的所有学生?

SELECT * FROM student WHERE age = 10; --查询出 14 条记录
SELECT * FROM student WHERE class_id = ‘G0101’; --查询出 12 条记录

==>
SELECT * FROM student WHERE age = 10 OR class_id = ‘G0101’; --查询出 24 条记录

说明是 去重了。

使用 union all 试一试:

# 查询出 26 条记录。 
SELECT * FROM student WHERE age = 10
UNION ALL
SELECT * FROM student WHERE class_id = 'G0101'; 

如何使用UNION去除集合的重复记录

# 查询出 24 条记录。
SELECT * FROM student WHERE age = 10
UNION
SELECT * FROM student WHERE class_id = 'G0101';

如何合并2个以上的结果集?

如何同时查询出年龄为10岁或一年级一班或性别为男的所有学生?

SELECT * FROM student WHERE age = 10
UNION
SELECT * FROM student WHERE class_id = 'G0101'
UNION
SELECT * FROM student WHERE gender = '男';

如何同时查询出所有的学生编号、学生姓名和老师编号、老师姓名?
来源于不同的表

SELECT student_id,student_name FROM student
UNION
SELECT teacher_id,teacher_name FROM teacher;
  1. 待合并的结果集的字段数量必须一致。
  2. 合并后的结果集的title与第一个结果集保持一致。
  3. 待合并的结果集的字段顺序、字段类型的大类及字段值的含义尽量保持一 致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值