关于子查询
Posted juncaoit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于子查询相关的知识,希望对你有一定的参考价值。
在优化sql的sql后的一个思考,原本的sql中使用的是三张比较大的表join,每个表的数据也上百万了,在执行接口时,有时候容易熔断,然后将join修改为子查询,速度竟然大幅度提升了,在这里研究研究子查询的使用。
一:子查询
1.什么是子查询
子查询就是嵌套在主查询中的查询。
2.子查询主要的位置
SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY
3.使用两张表做演示
能更好的理解sql
二:Select位置
1.需求
学生信息和班级名称位于不同的表中,要在同一张表中查出学生的学号、姓名、班级名称:
2.sql
SELECT s.student_id, s.student_name, ( SELECT class_name FROM t_class c WHERE c.class_id = s.class_id ) FROM t_student s GROUP BY s.student_id;
三:Where位置
1.需求
查出C语言成绩最高的学生的信息
2.sql
SELECT * FROM t_student WHERE student_subject = ‘C语言‘ AND student_score >= ALL ( SELECT student_score FROM t_student WHERE student_subject = ‘C语言‘ )
说明:
分类:
–ALL运算符
和子查询的结果逐一比较,必须全部满足时表达式的值才为真。
–ANY运算符
和子查询的结果逐一比较,其中一条记录满足条件则表达式的值就为真。
–EXISTS/NOT EXISTS运算符
EXISTS判断子查询是否存在数据,如果存在则表达式为真,反之为假。NOT EXISTS相反。
在子查询或相关查询中,要求出某个列的最大值,通常都是用ALL来比较,大意为比其他行都要大的值即为最大值。
3.需求二
查出C语言成绩比李四高的学生的信息
这种是比较常见的sql。
4.sql
SELECT * FROM t_student WHERE student_subject = ‘C语言‘ AND student_score > ( SELECT student_score FROM t_student WHERE student_name = ‘李四‘ AND student_subject = ‘C语言‘ );
5.需求三
查出每门课最高成绩的学生的信息:(这个也是相关子查询)
6.sql
SELECT * FROM t_student s1 WHERE s1.student_score >= ALL ( SELECT s2.student_score FROM t_student s2 WHERE s1.`student_subject` = s2.student_subject );
四:子查询说明
1.说明
–相关子查询
执行依赖于外部查询的数据。(就是table1在该select外面,而select里面table1.xx=table2.xx)
外部查询返回 一行 ,子查询就执行一次。(对于该select,里面的子select会重复很多次执行)
–非相关子查询
独立于外部查询的子查询。
子查询总共执行一次,执行完毕后后将值传递给外部查询。
上文提到的例子中,第一个例子求学生对应班级名的即为相关子查询,其中WHERE c.class_id=s.class_id 即为相关条件。其他的例子均只对一张表进行操作,为非相关子查询。
需要注意的是相关子查询主查询执行一回,子查询就执行一回,十分耗费时间,尤其是当数据多的时候。
以上是关于关于子查询的主要内容,如果未能解决你的问题,请参考以下文章