本文導讀:在MYSQL中使用GROUP BY分組時,咱們能夠select 多個非聚合字段,可是這些字段不在GROUP BY中,這樣的SQL查詢在SQL SERVER、ORACLE中是不合理的,且會報錯,MYSQL的這種特異性,有時查詢出來的結果並非咱們須要的,那麼,咱們在使用時應該注意哪些呢?html
1、下列語句在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
2、使用時易出現的問題sql
一、實例數據數據庫
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)
二、找到每一個class裏面的最大的age的基本信息性能
以下的sql語句,則輸出結果不許確spa
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)
備註htm
雖然找到的age是最大的age,可是與之匹配的用戶信息卻不是真實的信息io
緣由class
若是 id,name 不能惟一肯定的話,mysql會隨機選一行作爲值。test
3、使用是注意事項
一、這個寫法不標準, 由於假如沒group的字段若是有多個值, 可能致使這個字段會有不肯定的值,且不利於數據庫移植
二、假如能夠肯定這個字段都是重複的值(譬如多表聯接), 那就沒有這方面的困擾,反而會簡化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