一文整理新手最常犯的SQL高頻語(yǔ)法錯(cuò)誤和避坑合集
前言
新手學(xué)SQL,最頭疼的不是記不住語(yǔ)法,而是「寫(xiě)了語(yǔ)句報(bào)錯(cuò),卻找不到原因」——可能是一個(gè)分號(hào)沒(méi)寫(xiě)、一個(gè)字段名拼錯(cuò)、一個(gè)括號(hào)漏了,就導(dǎo)致整個(gè)SQL執(zhí)行失敗。
本篇整理了 新手最常犯的10類(lèi)SQL語(yǔ)法錯(cuò)誤,每類(lèi)都包含「錯(cuò)誤示例+正確示例+避坑提示」,幫你快速排查報(bào)錯(cuò)、養(yǎng)成規(guī)范寫(xiě)SQL的習(xí)慣,少走彎路。
一、基礎(chǔ)語(yǔ)法錯(cuò)誤(最高頻)
1. 遺漏分號(hào)(;)
SQL語(yǔ)句以分號(hào)結(jié)尾,遺漏分號(hào)會(huì)導(dǎo)致語(yǔ)句無(wú)法執(zhí)行,甚至后續(xù)語(yǔ)句報(bào)錯(cuò)。
-- ? 錯(cuò)誤:遺漏分號(hào) SELECT name FROM user SELECT age FROM user -- ? 正確:每條語(yǔ)句結(jié)尾加英文分號(hào) SELECT name FROM user; SELECT age FROM user;
避坑:寫(xiě)完一條語(yǔ)句,立刻加英文分號(hào),不要等到全部寫(xiě)完再補(bǔ)。
2. 字段名/表名拼寫(xiě)錯(cuò)誤
最常見(jiàn)的錯(cuò)誤,字段名、表名和創(chuàng)建時(shí)不一致(大小寫(xiě)敏感,取決于數(shù)據(jù)庫(kù)配置)。
-- 假設(shè)表名是user,字段名是name、age -- ? 錯(cuò)誤:表名拼錯(cuò)(user寫(xiě)成users)、字段名拼錯(cuò)(age寫(xiě)成agee) SELECT name, agee FROM users; -- ? 正確:和創(chuàng)建時(shí)的表名、字段名完全一致 SELECT name, age FROM user;
避坑:寫(xiě)SQL時(shí),先確認(rèn)表結(jié)構(gòu)(desc 表名; 可查看字段),避免憑記憶拼寫(xiě)。
3. 關(guān)鍵字拼寫(xiě)錯(cuò)誤
SQL關(guān)鍵字(SELECT、FROM、WHERE、INSERT等)拼寫(xiě)錯(cuò)誤,MySQL會(huì)無(wú)法識(shí)別。
-- ? 錯(cuò)誤:SELECT寫(xiě)成SELEC、INSERT寫(xiě)成INSER
SELEC name FROM user;
INSER INTO user (name) VALUES ('張三');
-- ? 正確:關(guān)鍵字拼寫(xiě)完整
SELECT name FROM user;
INSERT INTO user (name) VALUES ('張三');避坑:關(guān)鍵字可大寫(xiě)(推薦,區(qū)分字段和關(guān)鍵字),比如 SELECT、FROM,不容易拼錯(cuò)。
二、CRUD操作類(lèi)錯(cuò)誤
4. INSERT 語(yǔ)句字段和值不匹配
字段數(shù)量、順序和VALUES后面的值數(shù)量、順序不一致,會(huì)直接報(bào)錯(cuò)。
-- ? 錯(cuò)誤1:字段3個(gè),值2個(gè)(數(shù)量不匹配)
INSERT INTO user (name, age, gender) VALUES ('張三', 20);
-- ? 錯(cuò)誤2:字段順序和值順序不一致(name對(duì)應(yīng)20,age對(duì)應(yīng)'張三')
INSERT INTO user (name, age) VALUES (20, '張三');
-- ? 正確:字段和值數(shù)量、順序完全一致
INSERT INTO user (name, age, gender) VALUES ('張三', 20, 1);5. UPDATE/DELETE 忘記加 WHERE 條件
新手最危險(xiǎn)的錯(cuò)誤,忘記加WHERE會(huì)修改/刪除全表數(shù)據(jù),無(wú)法恢復(fù)(無(wú)備份)。
-- ? 錯(cuò)誤:無(wú)WHERE條件,修改全表用戶(hù)年齡 UPDATE user SET age = 20; -- ? 錯(cuò)誤:無(wú)WHERE條件,刪除全表數(shù)據(jù) DELETE FROM user; -- ? 正確:加WHERE條件,精準(zhǔn)操作 UPDATE user SET age = 20 WHERE id = 1; DELETE FROM user WHERE id = 1;
避坑:寫(xiě)UPDATE/DELETE時(shí),先寫(xiě)WHERE條件,再寫(xiě)SET/DELETE,養(yǎng)成習(xí)慣。
三、查詢(xún)類(lèi)錯(cuò)誤
6. WHERE 條件中使用聚合函數(shù)
WHERE 用于過(guò)濾行,不能使用聚合函數(shù)(COUNT、SUM、AVG等),過(guò)濾聚合結(jié)果需用HAVING。
-- ? 錯(cuò)誤:WHERE中使用COUNT(*) SELECT name FROM user WHERE COUNT(*) > 2; -- ? 正確:用HAVING過(guò)濾聚合結(jié)果(需搭配GROUP BY) SELECT gender, COUNT(*) AS user_count FROM user GROUP BY gender HAVING user_count > 2;
7. GROUP BY 和 SELECT 字段不匹配
SELECT 中只能出現(xiàn)「分組字段」和「聚合函數(shù)」,不能出現(xiàn)其他無(wú)關(guān)字段。
-- ? 錯(cuò)誤:name不是分組字段,也不是聚合函數(shù) SELECT name, gender, COUNT(*) FROM user GROUP BY gender; -- ? 正確1:將name加入分組 SELECT name, gender, COUNT(*) FROM user GROUP BY gender, name; -- ? 正確2:用聚合函數(shù)包裹name SELECT MAX(name), gender, COUNT(*) FROM user GROUP BY gender;
8. 模糊查詢(xún) LIKE 遺漏通配符
LIKE 用于模糊查詢(xún),若不搭配 % 或 _,等價(jià)于 =,無(wú)法實(shí)現(xiàn)模糊匹配。
-- ? 錯(cuò)誤:LIKE后面無(wú)通配符,等價(jià)于 WHERE name = '張' SELECT name FROM user WHERE name LIKE '張'; -- ? 正確:搭配%,匹配包含“張”的所有名字 SELECT name FROM user WHERE name LIKE '%張%';
四、其他常見(jiàn)錯(cuò)誤
9. 字符串值未加引號(hào)
字符串類(lèi)型(varchar、char等)的字段,賦值或條件匹配時(shí),必須加英文單引號(hào)。
-- ? 錯(cuò)誤:字符串值未加引號(hào)
INSERT INTO user (name) VALUES (張三);
SELECT name FROM user WHERE name = 張三;
-- ? 正確:字符串值加英文單引號(hào)
INSERT INTO user (name) VALUES ('張三');
SELECT name FROM user WHERE name = '張三';避坑:數(shù)值類(lèi)型(int、decimal)不加引號(hào),字符串類(lèi)型必須加英文單引號(hào)。
10. 括號(hào)、逗號(hào)遺漏或多余
多條件、多字段、子查詢(xún)中,容易遺漏或多余括號(hào)、逗號(hào),導(dǎo)致語(yǔ)法錯(cuò)誤。
-- ? 錯(cuò)誤1:INSERT語(yǔ)句VALUES后面遺漏括號(hào)
INSERT INTO user (name, age) VALUES '張三', 20;
-- ? 錯(cuò)誤2:多條件AND連接時(shí),多余逗號(hào)
SELECT name FROM user WHERE gender = 1, AND age > 20;
-- ? 正確
INSERT INTO user (name, age) VALUES ('張三', 20);
SELECT name FROM user WHERE gender = 1 AND age > 20;五、新手避坑通用技巧
1. 寫(xiě)SQL時(shí),關(guān)鍵字大寫(xiě)、字段名/表名小寫(xiě),區(qū)分明顯,減少拼寫(xiě)錯(cuò)誤;
2. 復(fù)雜語(yǔ)句(如多表關(guān)聯(lián)、分組查詢(xún)),分多行寫(xiě),縮進(jìn)對(duì)齊,便于排查;
3. 執(zhí)行SQL前,先檢查:分號(hào)、引號(hào)、括號(hào)、逗號(hào)是否完整;
4. 報(bào)錯(cuò)時(shí),重點(diǎn)看報(bào)錯(cuò)信息的「最后一行」,MySQL會(huì)提示錯(cuò)誤位置和原因。
結(jié)尾
新手犯SQL語(yǔ)法錯(cuò)誤很正常,不用慌,記住上面的錯(cuò)誤類(lèi)型和避坑技巧,寫(xiě)得多了,自然就能避免。建議每次報(bào)錯(cuò)后,記錄下來(lái),下次就不會(huì)再犯同樣的錯(cuò)。
到此這篇關(guān)于一文整理新手最常犯的SQL高頻語(yǔ)法錯(cuò)誤和避坑合集的文章就介紹到這了,更多相關(guān)SQL高頻語(yǔ)法錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中l(wèi)eft join設(shè)置條件在on與where時(shí)的用法區(qū)別分析
這篇文章主要介紹了mysql中l(wèi)eft join設(shè)置條件在on與where時(shí)的用法區(qū)別,結(jié)合實(shí)例形式分析了mysql中l(wèi)eft join設(shè)置條件在on與where時(shí)的相關(guān)用法區(qū)別與操作注意事項(xiàng),需要的朋友可以參考下2020-02-02
mysql中 ${param}與#{param}使用區(qū)別
這篇文章主要介紹了mysql中 ${param}與#{param}使用區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
mysql 操作總結(jié) INSERT和REPLACE
用于操作數(shù)據(jù)庫(kù)的SQL一般分為兩種,一種是查詢(xún)語(yǔ)句,也就是我們所說(shuō)的SELECT語(yǔ)句,另外一種就是更新語(yǔ)句,也叫做數(shù)據(jù)操作語(yǔ)句。2009-07-07
mysql正確刪除數(shù)據(jù)的方法(drop,delete,truncate)
這篇文章主要給大家介紹了關(guān)于mysql正確刪除數(shù)據(jù)的相關(guān)資料,DELETE語(yǔ)句是MySQL中最常用的刪除數(shù)據(jù)的方式之一,但也有幾種其他方法來(lái)實(shí)現(xiàn),需要的朋友可以參考下2023-10-10
如何使用分區(qū)處理MySQL的億級(jí)數(shù)據(jù)優(yōu)化
mysql在查詢(xún)上千萬(wàn)級(jí)數(shù)據(jù)的時(shí)候,通過(guò)索引可以解決大部分查詢(xún)優(yōu)化問(wèn)題。但是在處理上億數(shù)據(jù)的時(shí)候,應(yīng)該怎么解決,本文就是用分區(qū)來(lái)優(yōu)化一下,感興趣的一起來(lái)了解一下2021-06-06

