1. 程式人生 > >MySQL核心技術之aggregation(聚合操作)

MySQL核心技術之aggregation(聚合操作)

在資料庫技術中,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之前被賦值的。

這兩個變數的作用實際上重複了,本人懷疑是不同的開發人員引入了各自的變數導致的。

待續。。。