iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
自我挑戰組

從零開始的AI學習之路:非本科轉職的30天挑戰記系列 第 8

D8 | 真是不想面對SQL...但還是面對了🤣

  • 分享至 

  • xImage
  •  

颱風逼近,外面風雨交加,我這顆努力學習SQL的腦袋也是/images/emoticon/emoticon04.gif

自認學SQL的過程不是很順利,可能是因為以前學的是戲劇,習慣了視覺化的表現,突然來一堆抽象的表格就招架不住(欸並不是)(而且也才學沒幾天好嗎)
而且我太沮喪了,還去Google「SQL很難學嗎?」,結果:
https://ithelp.ithome.com.tw/upload/images/20250813/201779749Rk0tQu4yr.png

更沮喪了/images/emoticon/emoticon02.gif

但是!我有ChatGPT智慧好夥伴,立刻來問它:
「你是一個SQL專家,我是SQL小白,請你給我一套完整的講義,讓我一個小時內學會SQL的基礎,我用的軟體是MySQL,這對我來說很重要,謝謝你拜託了!」

然後我就收到了非常清晰的講義,是可以跟著實作一遍的;
還有我突然領悟到了,既然抽象的東西很難理解,那就把它具象化呀!

所以,如果你也是跟我一樣的SQL小白,可以試看看以下方法唷:

  1. 請ChatGPT生成一小時內能吸收的講義內容,最後記得請它出綜合考題給你(目前我已經用MySQL練習三題,是跑得動的)
  2. 一開始不是很理解沒關係,作中學!譬如,我對於INNER JOIN、LEFT JOIN、RIGHT JOIN感到很混淆,我就實際操作一遍,MySQL就會噴錯,然後再想辦法找出錯誤(有時候只是打錯字),也可以把寫好的程式碼丟去給ChatGPT請它解釋每一個步驟到底在幹嘛。
  3. 卡住的時候就畫出來,我覺得蠻有幫助的。例如:左表到底是什麼內容?右表要加去哪裡?哪一個表會有NULL值?等等。

我是怎麼練習的

先把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 填上

  • 範例:INNER JOIN
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 ──> 網頁設計

只保留三者都有的配對,沒有的丟掉

  • 範例:LEFT 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;

手繪結果:
學生 選課 課程
小明 ──> CS101 ──> 程式設計
小明 ──> CS102 ──> 資料庫
小華 ──> CS102 ──> 資料庫
小美 ──> CS103 ──> 網頁設計
小志 ──> NULL ──> NULL <-- 沒選課

左表全保留,右表沒資料用NULL。

  • 範例:RIGHT JOIN
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兩次的原因

還有一個小困惑:「咦!為什麼遇到要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的結果。

結果就是,猴~抓到!小芬沒選課:
https://ithelp.ithome.com.tw/upload/images/20250813/201779746w3bwXlqo1.png

我想了想,其實覺得SQL不好理解的原因應該是:

1️⃣ 邏輯思維和資料結構理解不夠熟
SQL 最核心就是「資料表之間的關聯」與「怎麼配對資料」。

要多多熟悉「表格、欄位、外鍵、主鍵」的概念,不然就會覺得「欄位怎麼對?主鍵很好懂但誰是外鍵?誰是左表誰是右表?」

2️⃣ 抽象層次比較高
SQL本質上是對資料集合做集合運算:JOIN、GROUP、FILTER…
這跟寫程式「一行行指令」不同,結果是一個整體表格。也許我同時還在學Python,語法上也會有點不習慣。

3️⃣ 語法和概念混在一起
例如:INNER JOIN、LEFT JOIN、RIGHT JOIN,這些又要熟悉語法,又要想清楚概念到底誰保留、誰是NULL。

4️⃣ 缺乏練習和直覺
看來SQL就是個動手做越多才會越熟悉的語言...🥲
加油💪


上一篇
D7 | 理解 HTML 格式:網頁裡暗藏的玄機真多
下一篇
D9 | Tkinter 學習心得:從入門到實作的小記錄
系列文
從零開始的AI學習之路:非本科轉職的30天挑戰記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言