MySQL核心技術之aggregation(聚合操作)
阿新 • • 發佈:2019-02-14
在資料庫技術中,Aggregation function又稱之為set function,其含義為輸入為一個set,輸出為聚合結果。具體包括:
COUNT()
AVE()
MN()
MAX()
SUM()
Aggregation function有兩種用法,一種單獨使用,另一種是和GROUP聯合使用。我們先討論單獨使用的情形。
當單獨使用的時候,其輸出只有一條結果。在MySQL的原始碼中,涉及到兩個位置標記QUERY是否使用了aggregation function,這兩個位置都位於st_select_lex類中(sql_lex.h):
class st_select_lex { /** @return true if this query block is implicitly grouped and returns exactly one row, which happens when it does not have a HAVING clause. */ bool is_single_grouped() const { return m_agg_func_used && group_list.elements == 0 && m_having_cond == NULL; } bool m_agg_func_used; // /** True if contains or aggregates set functions. @note this is wrong when a locally found set function is aggregated in an outer query block. */ bool with_sum_func; }
看到了吧,有兩個成員變數m_agg_func_used和with_sum_func,都是用來標記該query是否使用了aggregation function。其中with_sum_func是在parse階段就被賦值了,而with_sum_func是在handle_query中(select->prepare)被賦值的,也就是在parse之後,optimize之前被賦值的。
這兩個變數的作用實際上重複了,本人懷疑是不同的開發人員引入了各自的變數導致的。
待續。。。