MYSQL中GROUP BY不包含全部的非聚合字段時的注意事項

本文導讀:在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
相關文章
相關標籤/搜索