1. 什么是子查询
子查询就是在一个 SQL 语句中嵌入另一个 SELECT 语句,将子查询的执行结果作为外部查询的条件或表达式的一部分,从而实现复杂的查询功能。子查询可以嵌套多层,也可以嵌套在 WHERE 子句、HAVING 子句以及 INSERT、UPDATE、DELETE 语句中。
2. 子查询的应用场景
2.1 WHERE 子句中使用子查询
当查询需要根据某个条件筛选结果时,可以使用子查询。例如,我们需要查询所有学生的信息,但是只返回身高在班级中平均身高以上的学生。
SELECT * FROM student WHERE height > (SELECT AVG(height) FROM student);
2.2 HAVING 子句中使用子查询
当查询需要从分组结果中筛选结果时,可以使用子查询。例如,我们需要查询出每个班级身高最高的学生信息,但只返回身高在班级中平均身高以上的学生。
SELECT * FROM student GROUP BY grade HAVING height = (SELECT MAX(height) FROM student WHERE student.grade = grade) AND height > (SELECT AVG(height) FROM student WHERE student.grade = grade);
2.3 EXISTS子查询
EXISTS 子查询是一种判断子查询结果集是否为空的方式,通常用于检查子查询中是否存在某些记录。
例如,我们需要查询选修了“计算机基础”课程的学生学号。
SELECT DISTINCT student_id FROM elect WHERE EXISTS (SELECT * FROM course WHERE course_name = '计算机基础' AND course.course_id = elect.course_id);
3. 子查询的优缺点
3.1 优点
子查询能够让查询语句更简洁。
子查询在比联结查询条件复杂、或逻辑不容易表达的查询中可以发挥更强大的作用。
子查询能够实现从结果集中动态获取值,适应数据量变动较大的情况。
3.2 缺点
子查询效率不高,因为每次进行子查询都要先执行一遍子查询语句,然后将结果存在内存中,再用父查询去检索子查询的结果。
子查询不能嵌套的层数过多,否则性能会受到影响。
表之间有外键关联时,使用子查询就会涉及到多表联合查询,效率更低。
4. 总结
子查询是 SQL 查询语言中一种重要的查询方式,它能够让 SQL 查询更为灵活、强大。但是,作为一种查询方式,子查询也有其劣势,使用时需要在查询效率和代码简洁性之间进行折中,并选择最合适的查询方式。