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


本文導讀:在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM