颱風逼近,外面風雨交加,我這顆努力學習SQL的腦袋也是
自認學SQL的過程不是很順利,可能是因為以前學的是戲劇,習慣了視覺化的表現,突然來一堆抽象的表格就招架不住(欸並不是)(而且也才學沒幾天好嗎)
而且我太沮喪了,還去Google「SQL很難學嗎?」,結果:
更沮喪了
但是!我有ChatGPT智慧好夥伴,立刻來問它:
「你是一個SQL專家,我是SQL小白,請你給我一套完整的講義,讓我一個小時內學會SQL的基礎,我用的軟體是MySQL,這對我來說很重要,謝謝你拜託了!」
然後我就收到了非常清晰的講義,是可以跟著實作一遍的;
還有我突然領悟到了,既然抽象的東西很難理解,那就把它具象化呀!
所以,如果你也是跟我一樣的SQL小白,可以試看看以下方法唷:
先把SELECT要擺什麼想清楚,再來把ON後面要擺什麼想清楚,例如:
ON e.student_id = s.id
→ 連接條件:enrollments表的student_id必須等於students表的id。
然後用最小規模的資料練習,不要一次用三十筆資料,以學生選課資料為例:
students(學生表)
id | name |
---|---|
1 | 小明 |
2 | 小華 |
3 | 小美 |
courses(課程表)
course_id | course_name |
---|---|
CS101 | 程式設計 |
CS102 | 資料庫 |
CS103 | 網頁設計 |
enrollments(選課表)(哪些學生選了哪些課)
student_id | course_id |
---|---|
1 | CS101 |
1 | CS102 |
2 | CS102 |
3 | CS103 |
然後手繪 JOIN 結果圖:
-先畫一個框框代表「左表」
-再畫一個框框代表「右表」
-用箭頭表示 ON 條件的配對
-每個配對成功的就寫在結果區
-LEFT/RIGHT JOIN 沒配對的用 NULL 填上
SELECT s.name, c.course_name
FROM enrollments e
JOIN students s ON e.student_id = s.id
JOIN courses c ON e.course_id = c.course_id;
手繪結果:
學生 選課 課程
小明 ──> CS101 ──> 程式設計
小明 ──> CS102 ──> 資料庫
小華 ──> CS102 ──> 資料庫
小美 ──> CS103 ──> 網頁設計
只保留三者都有的配對,沒有的丟掉
SELECT s.name, c.course_name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
LEFT JOIN courses c ON e.course_id = c.course_id;
手繪結果:
學生 選課 課程
小明 ──> CS101 ──> 程式設計
小明 ──> CS102 ──> 資料庫
小華 ──> CS102 ──> 資料庫
小美 ──> CS103 ──> 網頁設計
小志 ──> NULL ──> NULL <-- 沒選課
左表全保留,右表沒資料用NULL。
SELECT s.name, c.course_name
FROM students s
RIGHT JOIN enrollments e ON s.id = e.student_id
RIGHT JOIN courses c ON c.course_id = e.course_id;
學生 選課 課程
小明 ──> CS101 ──> 程式設計
小明 ──> CS102 ──> 資料庫
小華 ──> CS102 ──> 資料庫
小美 ──> CS103 ──> 網頁設計
NULL ──> CS104 ──> 課程名稱 <-- 課程沒學生選
右表全保留,左表沒有資料用 NULL。
還有一個小困惑:「咦!為什麼遇到要LEFT JOIN兩次?」
原來是因為,JOIN是一行一行處理的:
SELECT s.name, c.course_name
FROM students s
LEFT JOIN enrollments e ON s.id = e.student_id
LEFT JOIN courses c ON e.course_id = c.course_id;
先把學生表(左表)和選課表(右表)連起來 → 得到每個學生的選課紀錄(沒有選課就顯示NULL)
再把這個結果(左表)和課程表(右表)連起來 → 得到課程名稱(沒有對應課程就顯示NULL)
所以左表不是一定要原始表,也可以是前面JOIN的結果。
結果就是,猴~抓到!小芬沒選課:
我想了想,其實覺得SQL不好理解的原因應該是:
1️⃣ 邏輯思維和資料結構理解不夠熟
SQL 最核心就是「資料表之間的關聯」與「怎麼配對資料」。
要多多熟悉「表格、欄位、外鍵、主鍵」的概念,不然就會覺得「欄位怎麼對?主鍵很好懂但誰是外鍵?誰是左表誰是右表?」
2️⃣ 抽象層次比較高
SQL本質上是對資料集合做集合運算:JOIN、GROUP、FILTER…
這跟寫程式「一行行指令」不同,結果是一個整體表格。也許我同時還在學Python,語法上也會有點不習慣。
3️⃣ 語法和概念混在一起
例如:INNER JOIN、LEFT JOIN、RIGHT JOIN,這些又要熟悉語法,又要想清楚概念到底誰保留、誰是NULL。
4️⃣ 缺乏練習和直覺
看來SQL就是個動手做越多才會越熟悉的語言...🥲
加油💪