关于子查询

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 即为相关条件。其他的例子均只对一张表进行操作,为非相关子查询。

  需要注意的是相关子查询主查询执行一回,子查询就执行一回,十分耗费时间,尤其是当数据多的时候。

  

以上是关于关于子查询的主要内容,如果未能解决你的问题,请参考以下文章

中继fetchQuery:如何在没有片段结构的情况下获取查询结果

查询优化。重复子查询

关于子查询

切换片段时如何维护子视图的状态?

关于代码片段的时间复杂度

关于高级查询的知识