目录
- 方便的子查询及EXISTS
- 使用子查询作为计算手段
- 使用子查询过滤数据(IN)
- 使用子查询过滤数据(EXISTS)
- 组合查询UNION ALL
- 如何使用UNION ALL合并多个结果集
- 如何使用UNION去除集合的重复记录
- 如何合并2个以上的结果集?
方便的子查询及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;
- 待合并的结果集的字段数量必须一致。
- 合并后的结果集的title与第一个结果集保持一致。
- 待合并的结果集的字段顺序、字段类型的大类及字段值的含义尽量保持一 致。