現在是時候把這些東西全部串起來,學會怎麼用 SELECT、WHERE 跟 ORDER BY 組合出簡單又實用的查詢啦。這個技能超級實用,從拿到用戶清單到做小型報表都用得到。
在開始之前,先提醒一下,簡單 SQL 查詢的結構長這樣:
SELECT 欄位1, 欄位2, 欄位3
FROM 資料表
WHERE 條件
ORDER BY 欄位 ASC
LIMIT 筆數
OFFSET 筆數;
如果 SQL 是一本小說,SELECT 就是章節標題,FROM 是內容,WHERE 是劇情解釋。然後 ORDER BY 加上排序,讓你看起來更有條理!
語法順序一定要照規定來。 有些可以省略(不寫),但順序不能亂。
範例 1:選出成績最好的學生名字
假設我們有一個 students 資料表,結構跟資料如下:
| id | name | age | grade |
|---|---|---|---|
| 1 | Otto | 21 | A |
| 2 | Maria | 22 | B |
| 3 | Alex | 20 | A |
| 4 | Nat | 23 | C |
| 5 | Dan | 25 | B |
你要拿到所有成績是 A 的學生清單(也就是 grade = 'A'),而且要照名字排序。這樣寫就對了:
SELECT name
FROM students
WHERE grade = 'A'
ORDER BY name ASC;
結果:
| name |
|---|
| Alex |
| Otto |
說明:
SELECT name— 只選名字。沒必要浪費資源撈不需要的資料。WHERE grade = 'A'— 過濾出成績是 A 的人。ORDER BY name ASC— 用名字做字母排序。
範例 2:用價格找商品
現在假設我們有一個 products 資料表,裡面有商品資訊:
| id | product_name | category | price |
|---|---|---|---|
| 1 | 智慧型手機 | Electronics | 30000 |
| 2 | 電視 | Electronics | 45000 |
| 3 | 冰箱 | Appliances | 50000 |
| 4 | 吸塵器 | Appliances | 15000 |
| 5 | 燈泡 | Lighting | 500 |
我們的任務是拿到 "Electronics" 分類的商品清單,然後照價格從高到低排。查詢這樣寫:
SELECT product_name, price
FROM products
WHERE category = 'Electronics'
ORDER BY price DESC;
結果:
| product_name | price |
|---|---|
| 電視 | 45000 |
| 智慧型手機 | 30000 |
說明:
SELECT product_name, price— 選商品名稱跟價格。WHERE category = 'Electronics'— 只要 "Electronics" 分類的商品。ORDER BY price DESC— 用價格從高到低排(最貴的在最前面)。
範例 3:用邏輯組合複雜過濾
還是用 students 這張表。假設我們要找年齡超過 21 歲,成績是 B 或 C 的學生,然後照年齡排序。這裡要組合多個條件:
SELECT name, age, grade
FROM students
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
ORDER BY age ASC;
結果:
| name | age | grade |
|---|---|---|
| Maria | 22 | B |
| Nat | 23 | C |
| Dan | 25 | B |
說明:
WHERE age > 21— 只選年齡超過 21 歲的學生。AND (grade = 'B' OR grade = 'C')— 過濾成績是B或C的人。括號是用來分組條件。ORDER BY age ASC— 用年齡從小到大排。
範例 4:排序跟過濾一起用
回到 products 這張表。我們想找價格低於 50,000 的商品,先照分類排,然後每個分類裡再照價格從低到高排。
SELECT product_name, category, price
FROM products
WHERE price < 50000
ORDER BY category ASC, price ASC;
結果:
| product_name | category | price |
|---|---|---|
| 吸塵器 | Appliances | 15000 |
| 智慧型手機 | Electronics | 30000 |
| 電視 | Electronics | 45000 |
| 燈泡 | Lighting | 500 |
說明:
WHERE price < 50000— 先過濾出價格低於 50,000 的商品。ORDER BY category ASC, price ASC— 先照分類(字母順序)排,每個分類裡再照價格從低到高排。
範例 5:常見錯誤 — 忘記分組條件
來看看會出什麼錯。如果你忘了用括號分組條件,像這樣:
錯誤查詢:
SELECT name, age, grade
FROM students
WHERE age > 21 AND grade = 'B' OR grade = 'C'
ORDER BY age ASC;
這裡 OR grade = 'C' 會直接執行,沒考慮 AND age > 21,查詢結果會把所有成績是 C 的人都撈出來,不管他幾歲。
所以一定要用 括號,才不會搞混:
WHERE age > 21 AND (grade = 'B' OR grade = 'C')
GO TO FULL VERSION