先上答案:where -> group by -> having -> order by
1.涉及知识点
这里涉及一个Oracle和MySql的区别,Oracle中having不能单独使用即使在没有where的情况下也不行,会有如下报错
而在MySql中则不会
所以得出结论:Oracle中having严格执行他是分组过滤的功能必须搭配group by使用;MySql中则同样把having视为二级过滤但可以不搭配group by。
2.拓展知识(另外一个顺序问题)
在多表联查的时候from后面多个表的顺序会影响这条查询sql的执行效率,按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先处理。
where也有相同的机制,也是从右向左处理。
我们在进行多表联查的时候要依据这样的机制,在写from的时候根据表数据量的多少,将数据量相对较少的放在后面;在写where条件的时候要把选择性强的条件放到最后,这样第一次过滤的时候就过滤掉了大部分无用数据,使得接下来执行前面的过滤条件是效率更高。
注意!having使用方面不同数据库有区别
SELECT system_code,COUNT(system_code) AS num
FROM trade
GROUP BY system_code HAVING num > 100;
mysql像上面这样写没有问题,如果是Oracle数据库就会报ORA-00936:表达式缺失的错误
Oracle数据库需要用如下写法
SELECT system_code,COUNT(system_code) AS num
FROM trade
GROUP BY system_code HAVING COUNT(system_code) > 100;