SQL优化--关联查询

       关联查询,要确保ON或者USING子句中的列上有索引,并且在建立索引时需要考虑到关联的顺序。只需要在关联顺序中的第二个表的相应列上创建索引。例如,当表A和表B用列c关联的时候,假设关联的顺序是B、A,那么就不需要在B表的c列上建立索引。同时,确保任何的GROUP BY和ORDER BY中的表达式只涉及到一个表中的列,这样才能使用索引来优化这个过程。

SELECT S.SNo
    ,S.NAME
    ,SC.Num AS [选修课程数]
FROM Student S
JOIN (--查询选修3门以上的学生
    SELECT SNo
        ,COUNT(*) AS Num
    FROM SC
    GROUP BY SNo -- 按学生分组
    HAVING COUNT(*) >= 3 -- 超过3门
    ) SC ON SC.SNo = S.No

  子查询优化

  应该尽可能用关联替换子查询,可以提高查询效率。

Having与where的区别

  “Where” 是一个约束声明,是在查询结果集返回之前约束来自数据库的数据,且Where中不能使用聚合函数。“Having”是一个过滤声明,是在查询结果集返回以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。

  “聚合函数”——SQL语言中一种特殊的函数。例如SUM, COUNT, MAX, AVG等。

  通过使用GROUP BY 子句,可以让SUM 和 COUNT 这些函数对属于一组的数据起作用(作用域是每个分组,而不是全部)。当你指定 GROUP BY region 时,只有属于同一个region(地区)的一组数据才将返回一行值,也就是说,表中所有除region(地区)外的字段,只能通过 SUM, COUNT等聚合函数运算后返回一个值。
(ps:题目中出现“每个”,则查询语句中一定必用GROUP BY,例如“每个部门中的...”,“每个班级中的...”)

  HAVING子句可以筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.就是说作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后对组记录进行筛选。

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region

  以region把返回记录分成多个组,就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。显示每个地区的总人口数和总面积.仅显示那些人口数量超过1000000的地区。

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(population)>1000000

  不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以让我们筛选成组后的各组数据.

  

  

  

posted on 2023-03-25 08:18  溪水静幽  阅读(122)  评论(0)    收藏  举报