好啦,我們已經開始搞懂 SELECT 這個 SQL 指令了,它就是用來從資料表(或多個表)裡面撈資料的。你可以把它想像成資料庫的 F5 鍵:「給我看看你有什麼」。最簡單的查詢長這樣:
SELECT 欄位1, 欄位2, … 欄位N
FROM 資料表
這裡:
SELECT— 查詢一定要從這個關鍵字開始。欄位1, 欄位2, ...— 這是你想要拿到的欄位清單。FROM 資料表— 指定你要從哪個表拿資料。
我們馬上來拆解一下,順便舉例!
SELECT 指令的基本結構
全部欄位都選出來。如果你想看 所有資料,可以用 星號 *。比如我們有個 students 資料表:
| id | name | age | grade |
|---|---|---|---|
| 1 | Alex | 17 | A |
| 2 | Maria | 19 | B |
| 3 | Otto | 21 | C |
要把這個表的所有資料撈出來,就寫:
SELECT * FROM students
結果就會是這樣的欄位跟資料:
| id | name | age | grade |
|---|---|---|---|
| 1 | Alex | 17 | A |
| 2 | Maria | 19 | B |
| 3 | Otto | 21 | C |
也就是說——整個表都給你看啦。
只選特定欄位
當然啦,通常你只想要你需要的欄位,不然資料太多很煩。比如你只想知道學生的 名字 跟 年齡,那查詢就要這樣寫:
SELECT name, age FROM students
查詢結果會是這樣:
| name | age |
|---|---|
| Alex | 17 |
| Maria | 19 |
| Otto | 21 |
有沒有發現差別?只選你要的欄位,查詢又快又乾淨。
查詢執行順序
SQL 查詢有點陰險:雖然我們寫 SELECT 在最前面,其實資料庫會先處理 FROM,然後才回傳結果。底層流程大概是這樣:
- 先處理
FROM的資料表:server 會找到你指定的表。 - 有條件的話先篩選資料列:只留下符合條件的資料。
- 選出你指定的欄位:從剩下的資料列撈出你要的資料。
所以像這個指令:
SELECT name FROM students
server 會先找到 students 這個表,再讀 name 欄位,最後才把結果丟給你。
實戰範例
範例 1:學生清單。
假設你是大學管理員,要拿到所有學生的名字。查詢:
SELECT name
FROM students;
結果:
| name |
|---|
| Alex |
| Maria |
| Otto |
範例 2:加上年齡和 id。
現在你要 id、名字和年齡。只要多加幾個欄位:
SELECT name, age, id
FROM students;
結果:
| name | age | id |
|---|---|---|
| Alex | 17 | 1 |
| Maria | 19 | 2 |
| Otto | 21 | 3 |
範例 3:加上運算式。
假設你想知道學生距離成年還差幾歲。
那你就把 age 換成 21-age。這裡我們假設 21 歲才算成年:
SELECT name, 21-age
FROM students;
結果會是這樣:
| name | 21-age |
|---|---|
| Alex | 4 |
| Maria | 2 |
| Otto | 0 |
更多運算式的用法之後還會講。現在來看看你可能遇到的錯誤。
用 SELECT 常見的錯誤
表名或欄位拼錯。
最常見的錯誤之一,就是表名或欄位名打錯。
如果資料庫裡沒有 studentsz 這個表,你會看到錯誤:
SELECT name
FROM studentsz; -- 錯誤:沒有這個表!
或是欄位叫 name,你卻寫 student_name,一樣錯:
SELECT student_name -- 錯誤:沒有這個欄位!
FROM students;
解法很簡單:一定要檢查表名跟欄位名。
查詢語法錯誤。
還有一個常見錯誤——忘記欄位之間要加逗號:
SELECT name age id -- 錯誤:少了逗號!
FROM students;
但不用太緊張。SELECT 查詢只會撈資料,不會動到你的資料庫。這種錯誤 不會害你的資料壞掉。不過等我們學到會改資料的指令時,錯誤就會比較嚴重了。
用 * 取代指定欄位。
你用 * 就是把所有資料都撈出來,連你不需要的也會有。這樣查詢會慢,資料表很大時更麻煩。記得只選你真的要的欄位就好。
GO TO FULL VERSION