SQL 的执行顺序,记录一下。

虽然看过,但是在项目中遇到一个SQL,要求给用户按投票数排序,票数相等时按照先达到票数的时间排序,一开始竟然不会写????后来从网上找了一圈

SQL UID,SUM(VOTE) AS VOTES FROM TABLE WHERE STAR=? GROUP BY UID ORDER BY VOTES DESC,MAX(CREATE_TIME) ASC;

稍微解释一下:首先按照where找到要排序的粉丝,然后GROUP BY uid将用户分组,同时SUM(VOTE)计算出每个用户的总票数,并在ORDER BY 里按DESC排序,若票数相等则再按create_time排序,之所以用MAX(create_time)也是为了找出用户最后一票的时间,然后比较用户们最后一票的时间,当然是小的是靠前的了。就完成了查询。

这里涉及了一个GROUP BY的点,GROUP BY后会为每个组只保留一条数据,所以这时可以使用聚合函数来筛选出想要的数据,这里就是使用SUM 和 MAX筛选出想要的结果。

下面的结果是从网上摘录的,做个记录吧先。

下面我们来具体分析一下查询处理的每一个阶段

  1. FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1

  2. ON: 对虚表VT1进行ON筛选,只有那些符合<join-condition>的行才会被记录在虚表VT2中。

  3. JOIN: 如果指定了OUTER JOIN(比如left join、 right  join),那么保留表中未匹配的行就会作为外部行添加到虚拟表VT2中,产生虚拟表VT3, rug  from子句中包含两个以上的表的话,那么就会对上一个join连接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直到处理完所有的表为 止。

  4. WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合<where-condition>的记录才会被插入到虚拟表VT4中。

  5. GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操作,产生VT5.

  6. CUBE | ROLLUP: 对表VT5进行cube或者rollup操作,产生表VT6.

  7. HAVING: 对虚拟表VT6应用having过滤,只有符合<having-condition>的记录才会被 插入到虚拟表VT7中。

  8. SELECT: 执行select操作,选择指定的列,插入到虚拟表VT8中。

  9. DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.

  10. ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操作,产生虚拟表VT10.

  11. LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。


猜你喜欢

转载自blog.51cto.com/fulin0532/2336763