MySQL報(bào)錯(cuò):sql_mode=only_full_group_by的4種輕松解決方法(含舉例)
前言?
作為初學(xué)者,我們?cè)谑褂肕ySQL的時(shí)候總是會(huì)遇到各種各樣的報(bào)錯(cuò),讓人頭痛不已。其中有一種報(bào)錯(cuò),sql_mode=only_full_group_by,十分常見(jiàn),每次都是老長(zhǎng)的一串出現(xiàn),然后帶走你所有的好心情

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

select Beijing,group_concat(Shanghai) from city group by Beijing
方法四:開(kāi)動(dòng)腦筋,修改代碼
舉個(gè)例子,在??偷牡?06題中,就出現(xiàn)了類(lèi)似的情況
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=
題目如下:

如果我們不用上面的方法,直接用下面這種方式查詢,很明顯會(huì)出現(xiàn) ONLY_FULL_GROUP_BY 的報(bào)錯(cuò):
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,一張表為每個(gè)部門(mén)最高員工薪資表 表b。然后通過(guò)表連接 on d.emp_no = s.emp_no 使這兩張表結(jié)合,通過(guò)on a.salary = b.salary使薪資統(tǒng)一,即這兩張表連接后的表的薪資為每個(gè)部門(mén)的最高員工薪資。最后,再通過(guò)一次查詢得到每個(gè)部門(mén)中當(dāng)前員工薪水最高的相關(guān)信息。
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
當(dāng)然,具體問(wèn)題,具體對(duì)待。遇到相差比較大的問(wèn)題,就需要換一種查詢方式了。
如果需要練習(xí)此題,可以點(diǎn)擊文中代碼直接進(jìn)入??停蛘咴谠u(píng)論區(qū)找到創(chuàng)建該題目的代碼,在電腦中運(yùn)行,試一試,有沒(méi)有其他更巧妙的辦法解決這道題。
總結(jié)
到此這篇關(guān)于MySQL報(bào)錯(cuò):sql_mode=only_full_group_by的4種輕松解決方法的文章就介紹到這了,更多相關(guān)MySQL報(bào)錯(cuò)sql_mode=only_full_group_by內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL 5.7升級(jí)8.0報(bào)異常:ONLY_FULL_GROUP_BY的問(wèn)題解決
- MySQL中ONLY_FULL_GROUP_BY模式的使用
- mysql ONLY_FULL_GROUP_BY設(shè)置sql_mode無(wú)效排查問(wèn)題(windows)
- 解決MySQL this is incompatible with sql_mode=only_full_group_by 問(wèn)題
- mysql怎么關(guān)閉sql_mode=ONLY_FULL_GROUP_BY模式
- mysql報(bào)錯(cuò)sql_mode=only_full_group_by解決
- 解決MySql版本問(wèn)題sql_mode=only_full_group_by
- MySQL錯(cuò)誤提示:sql_mode=only_full_group_by完美解決方案
- Mysql5.7及以上版本 ONLY_FULL_GROUP_BY報(bào)錯(cuò)的解決方法
- MySQL中ONLY_FULL_GROUP_BY的使用小結(jié)
相關(guān)文章
利用mysql的inet_aton()和inet_ntoa()函數(shù)存儲(chǔ)IP地址的方法分享
當(dāng)前很多應(yīng)用都適用字符串char(15)來(lái)存儲(chǔ)IP地址(占用16個(gè)字節(jié)),利用inet_aton()和inet_ntoa()函數(shù),來(lái)存儲(chǔ)IP地址效率很高,適用unsigned int 就可以滿足需求,不需要使用bigint,只需要4個(gè)字節(jié),節(jié)省存儲(chǔ)空間,同時(shí)效率也高很多2012-03-03
MySQL優(yōu)化GROUP BY(松散索引掃描與緊湊索引掃描)
這篇文章主要介紹了MySQL優(yōu)化GROUP BY(松散索引掃描與緊湊索引掃描),需要的朋友可以參考下2016-05-05
MySQL配置文件my.cnf中文詳解附mysql性能優(yōu)化方法分享
Mysql參數(shù)優(yōu)化對(duì)于新手來(lái)講,是比較難懂的東西,其實(shí)這個(gè)參數(shù)優(yōu)化,是個(gè)很復(fù)雜的東西,對(duì)于不同的網(wǎng)站,及其在線量,訪問(wèn)量,帖子數(shù)量,網(wǎng)絡(luò)情況,以及機(jī)器硬件配置都有關(guān)系,優(yōu)化不可能一次性完成,需要不斷的觀察以及調(diào)試,才有可能得到最佳效果。2011-09-09
Mysql數(shù)據(jù)庫(kù)性能優(yōu)化一
今天,數(shù)據(jù)庫(kù)的操作越來(lái)越成為整個(gè)應(yīng)用的性能瓶頸了,這點(diǎn)對(duì)于Web應(yīng)用尤其明顯。關(guān)于數(shù)據(jù)庫(kù)的性能,這并不只是DBA才需要擔(dān)心的事,而這更是我們程序員需要去關(guān)注的事情2016-04-04
如何利用Mysql計(jì)算地址經(jīng)緯度距離實(shí)時(shí)位置
最近工作中遇到了一個(gè)附近門(mén)店的功能,下面這篇文章主要給大家介紹了關(guān)于如何利用Mysql計(jì)算地址經(jīng)緯度距離實(shí)時(shí)位置的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
MySQL使用觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)自動(dòng)更新的應(yīng)用實(shí)例
觸發(fā)器是非常常見(jiàn)的自動(dòng)化數(shù)據(jù)庫(kù)操作方式,無(wú)論是在數(shù)據(jù)更新、刪除還是需要自動(dòng)添加一些內(nèi)容到數(shù)據(jù)表上,觸發(fā)器都可以發(fā)揮作用,熟悉 SQL 的基本語(yǔ)法和一些常見(jiàn)的用例,可以幫助你合理地設(shè)置自己的數(shù)據(jù)庫(kù)操作流程,2024-01-01
MySQL千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢優(yōu)化知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于MySQL千萬(wàn)級(jí)大數(shù)據(jù)SQL查詢優(yōu)化知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2019-12-12
MySQL數(shù)據(jù)庫(kù)Shell import_table數(shù)據(jù)導(dǎo)入
本文我們介紹一款高效的數(shù)據(jù)導(dǎo)入工具,MySQL Shell 工具集中的import_table,該工具的全稱(chēng)是Parallel Table Import Utility,需要的朋友請(qǐng)參考下文2021-08-08

