轉載自:https://blog.csdn.net/Peacock__/article/details/90608246
MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默認設置為打開狀態。
ONLY_FULL_GROUP_BY的語義就是確定select target list中的所有列的值都是明確語義,簡單的說來,在此模式下,target list中的值要么是來自於聚合函數(sum、avg、max等)的結果,要么是來自於group by list中的表達式的值。網上有很多通過修改sql_mode的方式來解決此問題。但除此方法,MySQL也提供了any_value()函數來抑制ONLY_FULL_GROUP_BY值被拒絕
舉例:表里存了員工姓名,部門名稱,員工薪資信息
由於在通過部門分組的時候,ename的值出現的碰撞,以第一部門舉例,通過group by后,第一部門會以一條數據的形式展示,但是部門里有兩個員工姓名是不一樣的,那么應該展示哪個呢?
額外補充:如果是5.7版本以上的話,即使所有記錄的ename的值都一樣,也會出現這個錯誤。因為上面提到了如果ONLY_FULL_GROUP_BY模式開啟,那么select target list中的所有列的值都必須有明確語義。其實例子中的ename對我們來說意義不大,我們完全可以將其從target list中移除。但是如果真實的業務場景中必須要查詢這一項,那我們就可以使用any_value()函數。
嘗試用一下any_value()函數
根據結果猜想:any_value()會選擇被分到同一組的數據里第一條數據的指定列值作為返回數據。
這次查詢第一部門的ename展示了一號員工,那我們換一下部門里員工的順序,重新查詢一下,驗證我們的猜想
根據結果可知,我們的猜想是正確的。