大家好,我是anyux。本文介紹MySQL資料庫的分組操作,語句拼接,列轉行操作。
關於group by 的sql_mode
only_full_group_by
說明:僅是MySQL5.7中存在,5.6和8.0都沒有,查看sql_mode
select @@sql_mode;
在帶有group by 子句的select中,select後的條件列(非主鍵列),要麼是group by 後面的列,要麼需要在函數中
示例group by 錯誤
select user,host from mysql.user group by user;
報錯內容
ERROR 1055 (42000): Expression 2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mysql.user.Host' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解釋以上報錯 select 查詢的欄位不在 group by 子句中,並且未使用聚合函數包含'mysql.user.Host',這和sql_mode=only_full_group_by 不兼容 臨時關閉sql_mode
set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
永久關閉sql_mode 在/etc/my.cnf中找到[mysqld],粘貼以下內容,保存退出,重啟MySQL務
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
concat的使用
可以將多個列合併成一個列,做列值拼接
select concat(user,host) as 'user@host' from mysql.user;
group_concat的使用
可以做列轉行
use school;select cno as 學號, group_concat(score) as 成績總覽 from sc group by cno;