MySQL資料庫對GROUP BY子句的功能擴充套件(1)

junsansi發表於2011-04-20

標準SQL語法中,對SELECT語句執行GROUP BY操作的話,SELECT選擇的列必須出現在GROUP BY子句中,也就是說先要明確根據什麼分組,然後才能選擇分沒分組。不過MySQL資料庫不完全是這樣,只要MySQL資料庫不是執行在ANSI模式下(什麼是執行模式,簡單講就是指支援的SQL語法,執行模式是在啟動mysql服務時以--sql-mode設定,預設應為空,ANSI是一套通行的標準SQL語法體系),就可以簡化GROUP BY操作時的選擇列。

出現在GROUP BY子句,但沒有出現在SELECT的選擇列中,這我們可以理解對吧,不過如果是SELECT選擇了列,但該列卻並沒有出現在GROUP BY子句中,這樣的SQL能執行嗎?MySQL中是可以的,舉個例子:
mysql> create table j1 (id int,vl varchar(20));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into j1 values (1,'a');
Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (1,'b');
Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (2,'c');
Query OK, 1 row affected (0.00 sec)

mysql> insert into j1 values (3,'d');
Query OK, 1 row affected (0.00 sec)

我們要按id分組,查詢不同組的數量及其vl值,在mysql中會怎麼寫呢,看好了:
mysql> select vl,count(0) from j1 group by id;
+------+----------+
| vl   | count(0) |
+------+----------+
| a    |        2 |
| c    |        1 |
| d    |        1 |
+------+----------+
3 rows in set (0.00 sec)

標準SQL中,要查詢vl列則vl必須在GROUP BY子句中,而MySQL資料庫中,vl可被忽略,這種寫法按照官方文件中的說法是為了提高效能,避免不必要的排序和分組。

但是,要注意了,在這種設定下,一定要明確自己想要的結果到底是什麼,以及實際執行的SQL語句返回結果,是否符合自己的預期。

MySQL在執行這類查詢語句時,它會預設理解為,沒寫到GROUP BY子句的列,其列值是唯一的,如果GROUP BY省略的列值其實並不唯一,那麼最好不要使用這項功能,仍以前面的示例來說明,id為1的記錄實際有兩條,分別對應vl in('a','b'),但實際查詢的結果集則只有a對應的數量,vl=b的記錄量被忽略了,這種情況就不一定是我們想要的結果了,在實際應用時需要特別注意。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-692946/,如需轉載,請註明出處,否則將追究法律責任。

相關文章