zoukankan      html  css  js  c++  java
  • 关于子查询

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

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

      

  • 相关阅读:
    无参考数据集
    dropout层
    postgresql查询表的大小
    vue 消息订阅与发布
    echarts实现pie自定义标签
    elementUI 时间线居左显示
    css+div实现各种常见边框
    css实现中括号边框
    div中多行内容垂直居中显示
    vue 实现组件全屏展示及退出
  • 原文地址:https://www.cnblogs.com/juncaoit/p/12374155.html
Copyright © 2011-2022 走看看