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子句可以让我们筛选成组后的各组数据.
浙公网安备 33010602011771号