本文導讀:在MYSQL中使用GROUP BY分組時,我們可以select 多個非聚合字段,但是這些字段不在GROUP BY中,這樣的SQL查詢在SQL SERVER、ORACLE中是不合理的,且會報錯,MYSQL的這種特異性,有時查詢出來的結果並不是我們需要的,那么,我們在使用時應該注意哪些呢?
一、下列語句在MySql中是合規的
select count(1),task_type,status from action where biz_date='20141014' group by status
select count(1),task_type from action where biz_date='20141014' group by status
二、使用時易出現的問題
1、實例數據
mysql> select * from test;
+----+-------+------+-------+
| id | name | age | class |


| 1 | qiu | 22 | 1 |

| 2 | liu | 42 | 1 |

| 4 | zheng | 20 | 2 |

| 3 | qian | 20 | 2 |

| 0 | wang | 11 | 3 |

| 6 | li | 33 | 3 |

+----+-------+------+-------+
6 rows in set (0.00 sec)

2、找到每個class里面的最大的age的基本信息
如下的sql語句,則輸出結果不准確


mysql> select id,name,max(age),class from test group by class;


+----+-------+----------+-------+

| id | name | max(age) | class |

+----+-------+----------+-------+

| 1 | qiu | 42 | 1 |

| 4 | zheng | 20 | 2 |

| 0 | wang | 33 | 3 |

+----+-------+----------+-------+

3 rows in set (0.00 sec)
備注
雖然找到的age是最大的age,但是與之匹配的用戶信息卻不是真實的信息
原因
如果 id,name 不能唯一確定的話,mysql會隨機選一行做為值。
三、使用是注意事項
1、這個寫法不標准, 因為假如沒group的字段如果有多個值, 可能導致這個字段會有不確定的值,且不利於數據庫移植
2、假如可以確定這個字段都是重復的值(譬如多表聯接), 那就沒有這方面的困擾,反而會簡化SQL語句,也有可能會提高性能,可以推薦這種方式查詢
例如


select A.id, B.desc, B.XXX, B.YYY SUM(A.AMT)

FROM A

join b on a.id=b.id

where a.id=? and b.xxx=?

group a.id
轉載自:http://www.studyofnet.com/news/1233.html