MySQL報錯:sql_mode=only_full_group_by的4種輕松解決方法(含舉例)
前言?
作為初學者,我們在使用MySQL的時候總是會遇到各種各樣的報錯,讓人頭痛不已。其中有一種報錯,sql_mode=only_full_group_by,十分常見,每次都是老長的一串出現(xiàn),然后帶走你所有的好心情

出現(xiàn)這樣的報錯,并不是因為你的代碼寫得不好,而是因為在MySQL 5.7后,MySQL默認開啟了SQL_MODE嚴格模式,對數(shù)據(jù)進行嚴格校驗。如果代碼中含有group by聚合操作,那么select中的列,除了使用聚合函數(shù)之外的,如max()、min()等,都必須出現(xiàn)在group by中。
比如說,出現(xiàn)下面這種情況,就會報錯:
select Beijing,Shanghai from city group by Beijing
?如果改成這個樣子:
select Beijing,Shanghai from city group by Beijing,Shanghai
或者這個樣子:
select Beijing from city group by Beijing
就不會報錯了。
當然,這樣子隨意的改動代碼,我們可能就無法得到想要的信息了。
我們可以通過以下四種方法,解決該問題:
方法一:直接修改數(shù)據(jù)庫配置
首先,打開數(shù)據(jù)庫,輸入
select @@global.sql_mode;
這個時候,就會返回得到以下的信息:(不同電腦返回的信息可能不同)
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
如果里面包含 ONLY_FULL_GROUP_BY,那么就重新設置,在數(shù)據(jù)庫中輸入以下代碼,去掉ONLY_FULL_GROUP_BY即可:
SET GLOBAL sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
但是,當我們再一次重新啟動數(shù)據(jù)庫時,可能會恢復原樣,還是會出現(xiàn)ONLY_FULL_GROUP_BY的報錯,這就需要我們再一次修改數(shù)據(jù)庫配置。
那有沒有可以永久生效的辦法呢?當然有!參考方法二,就可以使修改數(shù)據(jù)庫配置永久生效!
方法二:修改數(shù)據(jù)庫配置(永久生效)
修改配置文件my.ini
在[mysqld]模塊下新增一行配置:
sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
運行后重啟,即可生效
方法三:使用 any_value() 或 group_concat()
1. any_value():將分到同一組的數(shù)據(jù)里第一條數(shù)據(jù)的指定列值作為返回數(shù)據(jù)。 (any_value()函數(shù)就是MySQL提供的用來抑制ONLY_FULL_GROUP_BY值被拒絕的)
select Beijing,any_value(Shanghai) from city group by Beijing
2. group_concat():將分到同一組的數(shù)據(jù)默認用逗號隔開作為返回數(shù)據(jù)

select Beijing,group_concat(Shanghai) from city group by Beijing
方法四:開動腦筋,修改代碼
舉個例子,在??偷牡?06題中,就出現(xiàn)了類似的情況
https://www.nowcoder.com/practice/4a052e3e1df5435880d4353eb18a91c6?tpId=82&tqId=29764&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DSQL%25E7%25AF%2587%26topicId%3D82&difficulty=undefined&judgeStatus=undefined&tags=&title=
題目如下:

如果我們不用上面的方法,直接用下面這種方式查詢,很明顯會出現(xiàn) ONLY_FULL_GROUP_BY 的報錯:
select dept_no,d.emp_no,max(s.salary) from dept_emp d join salaries s on d.emp_no = s.emp_no group by d.dept_no
我們可以換一種思路:首先查詢得到2張表,一張表為員工薪資表 表a,一張表為每個部門最高員工薪資表 表b。然后通過表連接 on d.emp_no = s.emp_no 使這兩張表結合,通過on a.salary = b.salary使薪資統(tǒng)一,即這兩張表連接后的表的薪資為每個部門的最高員工薪資。最后,再通過一次查詢得到每個部門中當前員工薪水最高的相關信息。
select a.dept_no, a.emp_no, b.salary
from
(select d.dept_no, s.emp_no, s.salary
from dept_emp as d join salaries as s
on d.emp_no = s.emp_no
) as a
join
(select d.dept_no, max(s.salary) as salary
from dept_emp as d join salaries as s
on d.emp_no = s.emp_no
group by d.dept_no
) as b
on a.salary = b.salary and a.dept_no = b.dept_no
order by a.dept_no
當然,具體問題,具體對待。遇到相差比較大的問題,就需要換一種查詢方式了。
如果需要練習此題,可以點擊文中代碼直接進入牛客,或者在評論區(qū)找到創(chuàng)建該題目的代碼,在電腦中運行,試一試,有沒有其他更巧妙的辦法解決這道題。
總結
到此這篇關于MySQL報錯:sql_mode=only_full_group_by的4種輕松解決方法的文章就介紹到這了,更多相關MySQL報錯sql_mode=only_full_group_by內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- MySQL 5.7升級8.0報異常:ONLY_FULL_GROUP_BY的問題解決
- MySQL中ONLY_FULL_GROUP_BY模式的使用
- mysql ONLY_FULL_GROUP_BY設置sql_mode無效排查問題(windows)
- 解決MySQL this is incompatible with sql_mode=only_full_group_by 問題
- mysql怎么關閉sql_mode=ONLY_FULL_GROUP_BY模式
- mysql報錯sql_mode=only_full_group_by解決
- 解決MySql版本問題sql_mode=only_full_group_by
- MySQL錯誤提示:sql_mode=only_full_group_by完美解決方案
- Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報錯的解決方法
- MySQL中ONLY_FULL_GROUP_BY的使用小結
相關文章
VS2022連接數(shù)據(jù)庫MySQL并進行基本的表的操作指南
鑒于MySQL數(shù)據(jù)庫的流行與強大,決定多學習使用,下面這篇文章主要給大家介紹了關于VS2022連接數(shù)據(jù)庫MySQL并進行基本的表的操作指南,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-05-05
數(shù)據(jù)庫Sql實現(xiàn)截取時間段和日期實例(SQL時間截取)
在許多情況下你也許只想得到日期和時間的一部分,而不是完整的日期和時間,下面這篇文章主要給大家介紹了關于數(shù)據(jù)庫Sql實現(xiàn)截取時間段和日期(SQL時間截取)的相關資料,需要的朋友可以參考下2023-05-05
mysql 5.7.17 免安裝版配置方法圖文教程(windows10)
這篇文章主要為大家詳細介紹了windows10下mysql 5.7.17 免安裝版配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01

