A Beginner’s Guide to the True Order of SQL Operations
sql语句的执行顺序如下(逻辑上应该如此,实际上可能有所调整):
- FROM:任何sql语句都应该先执行FROM子句,加载数据表的所有数据行。
- WHERE:筛选出符合WHERE条件的数据行,快速缩减所需处理的数据行数。
- GROUP BY:得到一个
Map<String, List<Row>>
结构,GROUP BY子句字段相同的数据行被放到同一个Key对应的List<Row>
中,且只包含GROUP BY子句字段,而且List<Row>
中的这些字段只能被聚合函数访问。至此,能够被select查询到的实际上只剩下Key中的字段值和聚合函数的结果值了(其他字段无法再被查询返回)。 - aggregations:聚合函数对每个group的
List<Row>
进行操作,操作完成后,这个List<Row>
就会被删除。如果没有GROUP BY子句,那么默认将所有数据行看做一个大的group进行操作。 - HAVING:使用聚合函数的结果值,进行条件过滤。
- WINDOW:略
- SELECT:根据前面所有子句执行后所得的结果集,从中挑选字段组成新的结果集。
- DISTINCT:字段去重,去掉重复的数据行。
- UNION, INTERSECT, EXCEPT:略
- ORDER BY:经过上面一连串的执行,大大的削减了数据规模,最后才进行排序,效率更高。(假如放前面执行排好序,有可能还会被后面其他子句的执行所打乱)
- OFFSET:不要使用OFFSET,据说OFFSET的开销很大,是从前往后遍历的方式一个个地去查找的,参考Faster SQL Pagination with jOOQ Using the Seek Method
- LIMIT, FETCH, TOP:最后从结果集中取出前面一部分数据行返回。
本文地址:https://blog.csdn.net/weixin_41519463/article/details/107668623