對于SQL入門我分享一個(gè)個(gè)人觀點(diǎn):如果重視SQL練習(xí)的話,難度不大,如果光看書,難度很大。
我自己學(xué)習(xí)SQL花了1周左右,把SQL的經(jīng)歷總結(jié)為8個(gè)關(guān)卡,通過8張圖來表示,期間也遇到了很多的坑,這里一并總結(jié)出來。領(lǐng)會(huì)了這8張圖,基本上面試方面可以過關(guān)了。
我基于的學(xué)習(xí)材料如下:
1,SQL自學(xué)網(wǎng),包含教程,視頻,練習(xí),算是一個(gè)全套資源了
自學(xué)SQL網(wǎng)(教程 視頻 練習(xí)全套) xuesql.cn
對小白入門還算友好吧。
¥第1關(guān),用20%語法解決80%的數(shù)據(jù)
學(xué)習(xí)SQL同樣適用 20/80原則,學(xué)會(huì)20%的語法就能解決80%的問題,第一步學(xué)會(huì)基礎(chǔ)的查詢語句,足夠運(yùn)用在實(shí)際工作中了。
學(xué)習(xí)時(shí)間:2天。

- 坑點(diǎn)分析:第一步不要去安裝什么數(shù)據(jù)庫,或者去學(xué)創(chuàng)建表,寫入數(shù)據(jù)那些語法,你會(huì)被坑。為什么呢,相比于查詢哪些語法更復(fù)雜,可以先照貓畫虎把查詢語句練起來
簡單入手,可以提振自信心。一練就有效果sai~。
推薦一個(gè)初學(xué)者用到 《SQL手冊》,用查字典的方法寫SQL,在線的可查,避免死記語法。

我這里截圖不全,可以在線打開
手冊網(wǎng)址:點(diǎn)擊打開手冊網(wǎng)址
- 關(guān)鍵點(diǎn),打死記住****SQL****法則:
SELECT col,col,col 找什么? FROM table 從哪找? WHERE col 條件 條件是啥?
這個(gè)法則教你怎么一步步寫一個(gè)查詢SQL,可以當(dāng)做一種寫SQL的思維吧,我覺得非常好用。
簡言之,寫任何一個(gè)查詢語句,都分解成3步:
第一步:思考FROM后面的(也即是表)
第二步:思考WHERE條件(查手冊就可以)
第三步:完善SELECT后面的(也就是老板要顯示的數(shù)據(jù))。
可能跟大部分普通的思路不太一樣,不過適用于初學(xué),訓(xùn)練。
- 再說一個(gè)坑點(diǎn),關(guān)于時(shí)間。
簡單SELECT查詢的入門學(xué)習(xí)時(shí)間,安排50%都不過分,這部分突破之后,后面很順。這塊我是反反復(fù)復(fù)折騰幾次,大家吸取我的教訓(xùn)sai~。
¥第2關(guān),搞定統(tǒng)計(jì)和排序
統(tǒng)計(jì)都是寫在SELECT后面,也就是對結(jié)果統(tǒng)計(jì),可以用WHERE篩選數(shù)據(jù)后統(tǒng)計(jì)。
排序都是最后執(zhí)行,也就是所有計(jì)算做完,才做排序. 也就是最終結(jié)果排序。
學(xué)習(xí)時(shí)間:1天

添加圖片注釋,不超過 140 字(可選)
坑1: 第一次對GROUP BY分組不好理解,這時(shí)候你可以用COUNT計(jì)數(shù)做實(shí)驗(yàn),比如按某一個(gè)列分組,你可以自己看一下表里的數(shù)據(jù),自己分分組,再和SQL計(jì)算出來的比對一下。
坑2:SELECT count() = 100 不要出現(xiàn)類似的這種語法錯(cuò)誤,SELECT后面不能做條件*
坑3:多列排序問題,DESC是默認(rèn)排序,所以
ORDER BY列1, 列2 表示兩個(gè)降序, ORDER BY列1 ASC, 列2 表示第一列升序,第二列降序。 特別是這個(gè) ORDER BY列1, 列2 ASC;不要以為是兩個(gè)升序,其實(shí)第一個(gè)只是默認(rèn)為DESC。
坑4:LIMIT 語法問題,LIMIT a,b 第一個(gè)a表示起始位置,第二個(gè)b表示個(gè)數(shù)
假設(shè)數(shù)據(jù)是 a1,a2,a3,a4,...an limit 1,2 結(jié)果 a2,a3 limit 0,2 結(jié)果 a1,a2 limit 1 結(jié)果 a1 limit 3,1 結(jié)果 a4
¥第3關(guān),我會(huì)聯(lián)表了
單表查詢掌握之后,有些問題一張表數(shù)據(jù)不夠,需要同時(shí)從多張表查數(shù)據(jù),就用到聯(lián)表語句了。
join聯(lián)表,其實(shí)就是豐富FROM后面的內(nèi)容,原始是FROM table一張表
現(xiàn)在是FROM table1 join table2 兩張表合成一張表看待?。ㄟ@個(gè)思維很重要,其實(shí)聯(lián)表完了看成新表就可以)
學(xué)習(xí)時(shí)間:0.5天

添加圖片注釋,不超過 140 字(可選)
坑1:內(nèi)聯(lián),左連,右連 傻傻搞不清,這幾乎是每一個(gè)人都會(huì)出現(xiàn)的問題。我到底用哪個(gè)聯(lián)表方法。關(guān)鍵就是記住一點(diǎn),你要留下哪些數(shù)據(jù)
table1 聯(lián) table2
留下兩個(gè)表都有的ID, table1 inner join table2 留下table1的所有數(shù)據(jù) table1 left join table2 留下table2的所有數(shù)據(jù) table1 right join table2
¥第4關(guān),復(fù)雜查詢I follow U
簡單查詢會(huì)了之后,有一種情況是查詢條件用到的數(shù)據(jù)正好是第二張表里的數(shù)據(jù),這時(shí)候就需要用到子查詢了,也就是查詢嵌套著查詢。
學(xué)習(xí)時(shí)間:0.5天

添加圖片注釋,不超過 140 字(可選)
坑1: 子查詢一開始不好理解,其實(shí)可以這么理解,比如:
select * from table where a = (select col from table2 where col1 = xx)
可以把這個(gè)sql拆成2步,先理解 (select col from table2 where col1 = xx),我們手動(dòng)的去執(zhí)行這個(gè)查詢,假設(shè)得到的結(jié)果是100
那么:
select * from table where a = 100 是不是就是我們要的條件?
思考一下:為什么不直接用兩步,第一步查出100,第二步直接用a=100來查,而要用子查詢呢?
其實(shí)思考清楚這個(gè)問題,你對子查詢就完全理解了。
select * from table where a = 100 select * from table where a = (select 100) select * from table where a = (select col from table2 where col1 = xx)
上面三句,在現(xiàn)在這個(gè)時(shí)刻效果是一樣的,都能查出要的數(shù)據(jù)。
但是第三句的子查詢有一個(gè)好處,就是當(dāng)table2的col數(shù)據(jù)變更的時(shí)候(數(shù)據(jù)總是不斷更新的),這種情況下第3句任然可以查出正確的結(jié)果,但是1,2句就不行了。
¥第5關(guān),新增,更新和刪除數(shù)據(jù)
有時(shí)候需要自己去新增數(shù)據(jù)庫的數(shù)據(jù),所有要學(xué)習(xí)一下 增,刪,改的語法。也就是INSERT,
UPDATE 和 DELETE
學(xué)習(xí)時(shí)間:0.5天

坑1:UPDATE 和 DELETE有一定的危險(xiǎn)性,一定要注意先SELECT出來看一下是不是你要更新的數(shù)據(jù)。特別是對公司的數(shù)據(jù)庫做操作的時(shí)候
坑2:INSERT新增一定要注意ID重復(fù)問題,大多數(shù)表的ID都是不可以重復(fù)的,你重復(fù)寫入相同的ID不會(huì)成功
¥第6關(guān),新建表和表的關(guān)系
有時(shí)候會(huì)用到新建數(shù)據(jù)庫和表的操作。庫-表的關(guān)系是庫大于表,不同名字的庫下面可以建立相同的表。
db1 包含 table1,table2 db2 包含 table1,table3
這是允許的,可以用 db1.table1, db2.table1 這樣來表示
學(xué)習(xí)時(shí)間:0.5天

添加圖片注釋,不超過 140 字(可選)
坑1:DROP 操作極其危險(xiǎn),也就是平時(shí)我們聽到的刪庫跑路操作,一般情況不要用。
¥第7關(guān),函數(shù)使用幫我解決難題
在SQL運(yùn)用的高級階段,往往用到各種函數(shù),查詢條件里可以用函數(shù),數(shù)據(jù)結(jié)果的計(jì)算也可以用函數(shù)。
你可以把函數(shù)理解為數(shù)據(jù)庫提供給我們的一些算法,這樣我們就可以在SQL里直接計(jì)算了。這些算法組合到一起就能發(fā)揮給常大的能力。
學(xué)習(xí)時(shí)間:1天

添加圖片注釋,不超過 140 字(可選)
坑1:substr字符串截圖函數(shù),substr(a,b) 老是有人糾結(jié)這個(gè)a和b的含義,其實(shí)真的記不住,實(shí)際用的時(shí)候去調(diào)一下a,b大小就可以了
坑2:like模糊匹配,簡單點(diǎn)理解就是用一個(gè)字符串 表示一個(gè)系列的字符串。把%符號理解成一張萬能牌。
坑3:case 語法無法理解。這個(gè)是真的不好理解。你可以把case 心里想成if,如果的意思。
作用就是把1堆數(shù)據(jù)按規(guī)則分類。
¥第8關(guān),匯總各種奇奇怪怪的SQL符號
這一關(guān)復(fù)習(xí)一下,其實(shí)我發(fā)現(xiàn)SQL就是跟各種符號打交道,出錯(cuò)也大部分因?yàn)檫@些符號,所以做了一個(gè)整理匯總,盡量把這些符號搞清楚吧。
學(xué)習(xí)時(shí)間:0.5天

添加圖片注釋,不超過 140 字(可選)
- 總結(jié)
SQL的語法,說多也不多,說少也不少,想要靈活運(yùn)用,千萬不能死記硬背。我還是忍不住把這個(gè)公式貼出來:
SELECT col,col,col 找什么? FROM table 從哪找? WHERE col 條件 條件是啥?
這個(gè)SQL法則告訴我們SELECT才是最重要的語法,INSERT ,UPDATE等變更數(shù)據(jù)平時(shí)不怎么用,你記它干啥,需要的時(shí)候翻書就可以找到。
第二點(diǎn),寫查詢語句其實(shí)就是三板斧,先思考FROM這一段,再思考 WHERE這一段,最后再優(yōu)化SELECT后面的。
要是你每一個(gè)SQL都能這么思考,我保證你可以學(xué)的賊快
- 說說一個(gè)改變我思維
你的SQL出過錯(cuò)嗎?其實(shí)一開始我看到SQL出錯(cuò)是很煩的,誰不煩,誰不想一次性寫對。 無數(shù)次教訓(xùn)加上大牛的指導(dǎo),我才明白SQL不是一次性寫出來,真的是一步步調(diào)出來的(很多次看著大牛調(diào)試我的SQL)。遇到出錯(cuò)了,可以簡化一下,換一換條件,甚至一個(gè)字一個(gè)字比對,一點(diǎn)點(diǎn)的調(diào)試+分析,要真有這個(gè)耐心。
不知道你學(xué)習(xí)過程是不是也覺得SQL要一次性寫出來,是的話真的可以換一個(gè)思維了。
- 最后,練習(xí)真的很重要
看100遍,不如練習(xí)1遍(誰練誰知道)。
重點(diǎn):除了SQL練習(xí),我還重點(diǎn)整理了100多個(gè)大廠的面試真題
[圖片上傳失敗...(image-5eb057-1715131893187)]