DROP TABLE IF EXISTS tbl_student_class;
CREATE TABLE tbl_student_class (
id int(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
sno varchar(12) NOT NULL COMMENT '學號',
cno varchar(5) NOT NULL COMMENT '班級號',
cname varchar(20) NOT NULL COMMENT '班級名',
PRIMARY KEY (id)
) COMMENT='學生班級表';
-- ---
-- Records of tbl_student_class
-- ---
INSERT INTO tbl_student_class VALUES ('1', '20190607001', '0607', '影視7班');
INSERT INTO tbl_student_class VALUES ('2', '20190607002', '0607', '影視7班');
INSERT INTO tbl_student_class VALUES ('3', '20190608003', '0608', '影視8班');
INSERT INTO tbl_student_class VALUES ('4', '20190608004', '0608', '影視8班');
INSERT INTO tbl_student_class VALUES ('5', '20190609005', '0609', '影視9班');
INSERT INTO tbl_student_class VALUES ('6', '20190609006', '0609', '影視9班');
SELECT cno,cname,count(sno),MAX(sno)
FROM tbl_student_class
GROUP BY cno,cname;
SELECT cno,cname,count(sno),MAX(sno)
FROM tbl_student_class
GROUP BY cno;
[Err] 1055 - Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.tbl_student_class.cname' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
提示信息:SELECT 列表中的第二個表達式(cname)不在 GROUP BY 的子句中,同時它也不是聚合函數;這與 sql 模式:ONLY_FULL_GROUP_BY 不相容。為什麼 GROUP BY 之後不能直接引用原表(不在 GROUP BY 子句)中的列 ?莫急,我們慢慢往下看。SQL 模式MySQL 伺服器可以在不同的 SQL 模式下運行,並且可以針對不同的客戶端以不同的方式應用這些模式,具體取決於 sql_mode 系統變量的值。DBA 可以設置全局SQL模式以匹配站點伺服器操作要求,並且每個應用程式可以將其會話 SQL 模式設置為其自己的要求。模式會影響 MySQL 支持的 SQL 語法以及它執行的 數據驗證檢查,這使得在不同環境中使用MySQL以及將MySQL與其他資料庫伺服器一起使用變得更加容易。更多詳情請查閱官網:Server SQL Modes。MySQL 版本不同,內容會略有不同(包括默認值),查閱的時候注意與自身的 MySQL 版本保持一致。SQL 模式主要分兩類:語法支持類和數據檢查類,常用的如下語法支持類 對於 GROUP BY 聚合操作,如果在 SELECT 中的列、HAVING 或者 ORDER BY 子句的列,沒有在GROUP BY中出現,那麼這個SQL是不合法的啟用 ANSI_QUOTES 後,不能用雙引號來引用字符串,因為它被解釋為識別符,作用與 ` 一樣。設置它以後,update t set f1="" …,會報 Unknown column 『』 in field list 這樣的語法錯誤將 || 視為字符串的連接操作符而非 或 運算符,這和Oracle資料庫是一樣的,也和字符串的拼接函數 CONCAT() 相類似使用 SHOW CREATE TABLE 時不會輸出MySQL特有的語法部分,如 ENGINE ,這個在使用 mysqldump 跨DB種類遷移的時候需要考慮字面意思不自動創建用戶。在給MySQL用戶授權時,我們習慣使用 GRANT … ON … TO dbuser 順道一起創建用戶。設置該選項後就與oracle操作類似,授權之前必須先建立用戶數據檢查類 認為日期 『0000-00-00』 非法,與是否設置後面的嚴格模式有關1、如果設置了嚴格模式,則 NO_ZERO_DATE 自然滿足。但如果是 INSERT IGNORE 或 UPDATE IGNORE,』0000-00-00』依然允許且只顯示warning;2、如果在非嚴格模式下,設置了NO_ZERO_DATE,效果與上面一樣,』0000-00-00』 允許但顯示warning;如果沒有設置NO_ZERO_DATE,no warning,當做完全合法的值;3、NO_ZERO_IN_DATE情況與上面類似,不同的是控制日期和天,是否可為 0 ,即 2010-01-00 是否合法;使用 ALTER TABLE 或 CREATE TABLE 指定 ENGINE 時, 需要的存儲引擎被禁用或未編譯,該如何處理。啟用 NO_ENGINE_SUBSTITUTION 時,那麼直接拋出錯誤;不設置此值時,CREATE用默認的存儲引擎替代,ATLER不進行更改,並拋出一個 warning設置它,表示啟用嚴格模式。注意 STRICT_TRANS_TABLES 不是幾種策略的組合,單獨指 INSERT、UPDATE 出現少值或無效值該如何處理:-- 查看 MySQL 版本
SELECT VERSION();
-- 查看 sql_mode
SELECT @@sql_mode;
我們可以看到,5.7.21 的默認模式包含:
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
我們發現,上述報錯的 SQL
-- 寬鬆模式下 可以執行
SELECT cno,cname,count(sno),MAX(sno)
FROM tbl_student_class
GROUP BY cno;
a ≠ {a}
《SQL基礎教程》
《SQL進階教程》
作者:青石路
cnblogs.com/youzhibing/p/11516154.html
版權申明:內容來源網絡,版權歸原創者所有。除非無法確認,都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。祝願每一位讀者生活愉快!謝謝!