MySQL中ONLY_FULL_GROUP_BY模式的使用
引言:作為一個菜鳥,當(dāng)寫sql中涉及到group by
這樣簡單的語句時,也會出現(xiàn)問題,我在??途W(wǎng)上做sql題時,總報這個錯:
ONLY_FULL_GROUP_BY
到底是什么東西呢?
今天寫篇文章解釋一下。
一、GROUP BY使用時的關(guān)鍵要點
1. 理解 GROUP BY 的作用
GROUP BY
用于將數(shù)據(jù)集分割成多個組,每個組由一組具有相同屬性的行組成。這使得聚合函數(shù)可以應(yīng)用于每一組,而不是整個數(shù)據(jù)集。例如,使用 GROUP BY
可以按產(chǎn)品類別統(tǒng)計銷售總額。
2. 遵守 ONLY_FULL_GROUP_BY 規(guī)則
在 MySQL 中,如果啟用了 ONLY_FULL_GROUP_BY
模式,那么 SELECT
子句中除聚合函數(shù)之外的所有列都必須在 GROUP BY
子句中出現(xiàn)。這是為了避免不確定性和潛在的數(shù)據(jù)歧義。
3. 使用 HAVING 進(jìn)行條件過濾
HAVING
子句用于對分組后的結(jié)果進(jìn)行過濾,類似于 WHERE
子句,但 HAVING
適用于聚合結(jié)果。例如,你可以使用 HAVING COUNT(*) > 1
來找出至少出現(xiàn)兩次的組。
4. 正確排序結(jié)果
雖然 GROUP BY
自身不會自動排序結(jié)果,但你通常會希望在結(jié)果集中應(yīng)用 ORDER BY
來排序分組。例如,你可以按銷售額降序排序產(chǎn)品類別。
5. 注意空值和 NULL 值
在 GROUP BY
中,NULL 值會被視為相同的值,這意味著所有包含 NULL 的行會被歸入同一組。如果需要區(qū)分 NULL 和非 NULL 值,可以使用 COALESCE()
或者條件表達(dá)式。
二、 ONLY_FULL_GROUP_BY 規(guī)則
1. 什么是 ONLY_FULL_GROUP_BY?
ONLY_FULL_GROUP_BY
是 MySQL 中的一個 SQL 模式,它要求在任何包含聚合函數(shù)的查詢中,所有在 SELECT
子句中出現(xiàn)的非聚合列也必須在 GROUP BY
子句中出現(xiàn)。換句話說,如果一個查詢使用了聚合函數(shù),那么除了聚合函數(shù)包裹的列以外,所有在 SELECT
子句中出現(xiàn)的列都必須被 GROUP BY
子句引用。
這個規(guī)則確保了查詢結(jié)果的確定性和一致性,避免了由于 SQL 語句的模糊性而導(dǎo)致的潛在錯誤。
2. 為什么需要 ONLY_FULL_GROUP_BY?
在 ONLY_FULL_GROUP_BY
被引入之前,MySQL 允許在沒有 GROUP BY
或者 GROUP BY
不充分的情況下進(jìn)行查詢。這意味著,即使查詢中包含了沒有被聚合的列,MySQL 也會返回任意一個結(jié)果,這可能會導(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
列沒有被聚合函數(shù)包裹,也沒有在 GROUP BY
子句中出現(xiàn)。在 ONLY_FULL_GROUP_BY
模式下,這個查詢會失敗,因為 MySQL 不知道如何從多個可能的 prod_name
值中選擇一個來展示。
3.如何啟用或禁用 ONLY_FULL_GROUP_BY?
在 MySQL 中,默認(rèn)情況下 ONLY_FULL_GROUP_BY
是啟用的。你可以通過檢查 @@sql_mode
系統(tǒng)變量來確認(rèn)這一點:
SELECT @@sql_mode;
如果 ONLY_FULL_GROUP_BY
已經(jīng)被啟用,并且你想要暫時禁用它(盡管這不是一個推薦的長期解決方案),你可以通過以下命令在會話級禁用它:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
或者,你也可以在 MySQL 配置文件(my.cnf 或 my.ini)中修改 sql_mode
設(shè)置來全局禁用它。
總結(jié)
雖然禁用 ONLY_FULL_GROUP_BY
可能會方便一些查詢的編寫,但從長遠(yuǎn)來看,遵循這個規(guī)則對于保持?jǐn)?shù)據(jù)查詢的準(zhǔn)確性和一致性至關(guān)重要。在編寫 SQL 查詢時,始終應(yīng)確保遵循 ONLY_FULL_GROUP_BY
的指導(dǎo)原則,以避免潛在的數(shù)據(jù)解釋錯誤。
到此這篇關(guān)于MySQL中ONLY_FULL_GROUP_BY模式的使用的文章就介紹到這了,更多相關(guān)MySQL ONLY_FULL_GROUP_BY 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql服務(wù)器查詢慢原因分析與解決方法小結(jié)
在開發(fā)的朋友特別是和mysql有接觸的朋友會碰到有時mysql查詢很慢,當(dāng)然我指的是大數(shù)據(jù)量百萬千萬級了,不是幾十條了,下面我們來看看解決查詢慢的辦法2012-04-04如何修改Linux服務(wù)器中的MySQL數(shù)據(jù)庫密碼
這篇文章主要介紹了如何修改Linux服務(wù)器中的MySQL數(shù)據(jù)庫密碼問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06mysql查詢優(yōu)化之100萬條數(shù)據(jù)的一張表優(yōu)化方案
這篇文章主要介紹了mysql查詢優(yōu)化之100萬條數(shù)據(jù)的一張表優(yōu)化方案,需要的朋友可以參考下2021-05-05innodb_index_stats導(dǎo)入備份數(shù)據(jù)時報錯表主鍵沖突的解決方法
下面小編就為大家?guī)硪黄猧nnodb_index_stats導(dǎo)入備份數(shù)據(jù)時報錯表主鍵沖突的解決方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03