分析sql語句的執行順序
SELECT col_a/(*)/(聚合函數) FROM tb WHERE 條件
GROUP BY col_a HAVING COUNT(*)>5 ORDER BY sum DESC
LIMIT 10;
一般,WHERE在前,GROUP BY在后,即先進行篩選,然后進行分組;
HAVING只能跟在GROUP BY之后,對分組后的聚合結果進行篩選;HAVING的前提是分組;WHERE在最前,最先對原始數據進行一遍篩選;
WHERE的條件里只能用已有的列進行條件判斷,不允許使用聚合函數。HAVING之后可以允許使用聚合函數;
聚合函數包括count(),sum(),avg(),max(),min()
當一個查詢語句同時出現了where,group by,having,order by的時候,執行順序和編寫順序是:
1.執行where xx對全表數據做篩選,返回第1個結果集。
2.針對第1個結果集使用group by分組,返回第2個結果集。
3.針對第2個結果集中的每1組數據執行select xx,有幾組就執行幾次,返回第3個結果集。
4.針對第3個結集執行having xx進行篩選,返回第4個結果集。
5.針對第4個結果集排序。
例子
SELECT A.name,COUNT(order_number) AS count_sum
FROM orders A, customer B
WHERE A.coustomer_id=B.id
GROUP BY customer_id
HAVING COUNT(order_number)>5
ORDER BY count_sum DESC
LIMIT 5;
或者(等價于)
SELECT A.name,COUNT(order_number) AS count_sum
FROM orders A, customer B
WHERE A.coustomer_id=B.id
GROUP BY customer_id
HAVING count_sum>5
ORDER BY count_sum DESC
LIMIT 5;
參考:原文地址