MySQL中ONLY_FULL_GROUP_BY模式的使用
引言:作為一個(gè)菜鳥(niǎo),當(dāng)寫(xiě)sql中涉及到group by這樣簡(jiǎn)單的語(yǔ)句時(shí),也會(huì)出現(xiàn)問(wèn)題,我在牛客網(wǎng)上做sql題時(shí),總報(bào)這個(gè)錯(cuò):

ONLY_FULL_GROUP_BY 到底是什么東西呢?
今天寫(xiě)篇文章解釋一下。
一、GROUP BY使用時(shí)的關(guān)鍵要點(diǎn)
1. 理解 GROUP BY 的作用
GROUP BY 用于將數(shù)據(jù)集分割成多個(gè)組,每個(gè)組由一組具有相同屬性的行組成。這使得聚合函數(shù)可以應(yīng)用于每一組,而不是整個(gè)數(shù)據(jù)集。例如,使用 GROUP BY 可以按產(chǎn)品類別統(tǒng)計(jì)銷售總額。
2. 遵守 ONLY_FULL_GROUP_BY 規(guī)則
在 MySQL 中,如果啟用了 ONLY_FULL_GROUP_BY 模式,那么 SELECT 子句中除聚合函數(shù)之外的所有列都必須在 GROUP BY 子句中出現(xiàn)。這是為了避免不確定性和潛在的數(shù)據(jù)歧義。
3. 使用 HAVING 進(jìn)行條件過(guò)濾
HAVING 子句用于對(duì)分組后的結(jié)果進(jìn)行過(guò)濾,類似于 WHERE 子句,但 HAVING 適用于聚合結(jié)果。例如,你可以使用 HAVING COUNT(*) > 1 來(lái)找出至少出現(xiàn)兩次的組。
4. 正確排序結(jié)果
雖然 GROUP BY 自身不會(huì)自動(dòng)排序結(jié)果,但你通常會(huì)希望在結(jié)果集中應(yīng)用 ORDER BY 來(lái)排序分組。例如,你可以按銷售額降序排序產(chǎn)品類別。
5. 注意空值和 NULL 值
在 GROUP BY 中,NULL 值會(huì)被視為相同的值,這意味著所有包含 NULL 的行會(huì)被歸入同一組。如果需要區(qū)分 NULL 和非 NULL 值,可以使用 COALESCE() 或者條件表達(dá)式。
二、 ONLY_FULL_GROUP_BY 規(guī)則
1. 什么是 ONLY_FULL_GROUP_BY?
ONLY_FULL_GROUP_BY 是 MySQL 中的一個(gè) SQL 模式,它要求在任何包含聚合函數(shù)的查詢中,所有在 SELECT 子句中出現(xiàn)的非聚合列也必須在 GROUP BY 子句中出現(xiàn)。換句話說(shuō),如果一個(gè)查詢使用了聚合函數(shù),那么除了聚合函數(shù)包裹的列以外,所有在 SELECT 子句中出現(xiàn)的列都必須被 GROUP BY 子句引用。
這個(gè)規(guī)則確保了查詢結(jié)果的確定性和一致性,避免了由于 SQL 語(yǔ)句的模糊性而導(dǎo)致的潛在錯(cuò)誤。
2. 為什么需要 ONLY_FULL_GROUP_BY?
在 ONLY_FULL_GROUP_BY 被引入之前,MySQL 允許在沒(méi)有 GROUP BY 或者 GROUP BY 不充分的情況下進(jìn)行查詢。這意味著,即使查詢中包含了沒(méi)有被聚合的列,MySQL 也會(huì)返回任意一個(gè)結(jié)果,這可能會(huì)導(dǎo)致誤導(dǎo)性的結(jié)果或數(shù)據(jù)丟失。
例如,假設(shè)我們有以下查詢:
SELECT prod_name, COUNT(order_num) FROM products p JOIN orders o ON p.prod_id = o.prod_id;
這里,prod_name 列沒(méi)有被聚合函數(shù)包裹,也沒(méi)有在 GROUP BY 子句中出現(xiàn)。在 ONLY_FULL_GROUP_BY 模式下,這個(gè)查詢會(huì)失敗,因?yàn)?MySQL 不知道如何從多個(gè)可能的 prod_name 值中選擇一個(gè)來(lái)展示。
3.如何啟用或禁用 ONLY_FULL_GROUP_BY?
在 MySQL 中,默認(rèn)情況下 ONLY_FULL_GROUP_BY 是啟用的。你可以通過(guò)檢查 @@sql_mode 系統(tǒng)變量來(lái)確認(rèn)這一點(diǎn):
SELECT @@sql_mode;
如果 ONLY_FULL_GROUP_BY 已經(jīng)被啟用,并且你想要暫時(shí)禁用它(盡管這不是一個(gè)推薦的長(zhǎng)期解決方案),你可以通過(guò)以下命令在會(huì)話級(jí)禁用它:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
或者,你也可以在 MySQL 配置文件(my.cnf 或 my.ini)中修改 sql_mode 設(shè)置來(lái)全局禁用它。
總結(jié)
雖然禁用 ONLY_FULL_GROUP_BY 可能會(huì)方便一些查詢的編寫(xiě),但從長(zhǎng)遠(yuǎn)來(lái)看,遵循這個(gè)規(guī)則對(duì)于保持?jǐn)?shù)據(jù)查詢的準(zhǔn)確性和一致性至關(guān)重要。在編寫(xiě) SQL 查詢時(shí),始終應(yīng)確保遵循 ONLY_FULL_GROUP_BY 的指導(dǎo)原則,以避免潛在的數(shù)據(jù)解釋錯(cuò)誤。
到此這篇關(guān)于MySQL中ONLY_FULL_GROUP_BY模式的使用的文章就介紹到這了,更多相關(guān)MySQL ONLY_FULL_GROUP_BY 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql存儲(chǔ)表情報(bào)錯(cuò)的排查解決
隨著互聯(lián)網(wǎng)的發(fā)展,產(chǎn)生了許多新類型的字符,例如emoji這種類型的符號(hào),也就是我們通常在聊天時(shí)發(fā)的小黃臉表情,下面這篇文章主要給大家介紹了關(guān)于MySql存儲(chǔ)表情報(bào)錯(cuò)的排查解決,需要的朋友可以參考下2022-07-07
mysql啟動(dòng)報(bào)錯(cuò)MySQL server PID file could not be found
這篇文章主要介紹了mysql啟動(dòng)報(bào)錯(cuò)MySQL server PID file could not be found,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
centos7.2下安裝mysql5.7數(shù)據(jù)庫(kù)的命令詳解
這篇文章主要介紹了centos7.2下安裝mysql5.7數(shù)據(jù)庫(kù),文中給出了所有的命令,按照命令執(zhí)行就會(huì)安裝上 ,需要的朋友可以參考下2019-07-07
解析如何使用Zend Framework 連接數(shù)據(jù)庫(kù)
本篇文章是對(duì)如何使用Zend Framework 連接數(shù)據(jù)庫(kù)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
phpmyadmin報(bào)錯(cuò):#2003 無(wú)法登錄 MySQL服務(wù)器的解決方法
通過(guò)phpmyadmin連接mysql數(shù)據(jù)庫(kù)時(shí)提示:“2003 無(wú)法登錄 MySQL服務(wù)器”。。。很明顯這是沒(méi)有啟動(dòng)mysql服務(wù),右擊我的電腦-管理-找到服務(wù),找到mysql啟動(dòng)一下2012-04-04
數(shù)據(jù)庫(kù)SQL調(diào)優(yōu)的幾種方式匯總
在項(xiàng)目中,SQL的調(diào)優(yōu)對(duì)項(xiàng)目的性能來(lái)講至關(guān)重要,所有掌握常見(jiàn)的SQL調(diào)優(yōu)方式是必不可少的,下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)庫(kù)SQL調(diào)優(yōu)的幾種方式,需要的朋友可以參考下2022-10-10
MySQL中binlog2sql實(shí)現(xiàn)數(shù)據(jù)誤刪恢復(fù)工具
本文介紹了binlog2sql工具的使用,它能從MySQL binlog中解析出SQL語(yǔ)句,用于數(shù)據(jù)回滾、主從切換后的數(shù)據(jù)修復(fù)等場(chǎng)景,通過(guò)設(shè)置不同參數(shù),可以獲取原始SQL、回滾SQL等,具有一定的參考價(jià)值,感興趣的可以了解一下2025-09-09

