sql语句的执行顺序

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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐