當我們從資料庫撈資料時,很少會需要所有欄位。比如說,employees 這張員工表可能有 15 個欄位:名字、姓氏、生日、職稱、薪水、入職日期等等。但你可能只想知道他們的名字和職稱。全部撈出來其實沒什麼意義又沒效率。這時候,選擇特定欄位的技巧就派上用場啦。
打個比方,這就像你有一籃橘子、蘋果和香蕉,但你只想拿蘋果。是不是很酷?我們現在就來玩這個!
語法
提醒一下,SQL 設計得超 user-friendly。
首先,查詢語句的大小寫沒差。你可以寫 SELECT、Select 或 select,都 OK。再來,換行也不影響。DBMS 會自動把查詢變成一行,所以你想怎麼排版都行。
你大概也猜到了,SELECT 跟 FROM 只是開始。要不然 SQL 也不會這麼有話題。完整一點的 SQL 查詢長這樣:
SELECT 欄位
FROM 資料表
WHERE 條件
GROUP BY 欄位
HAVING 欄位
ORDER BY 排序
說明:
欄位— 你想要取得的欄位名稱。資料表— 你要從哪個表撈資料。條件— 用來篩選資料的條件。排序— 排序的欄位和順序。
是不是很簡單?我們來看個實際例子。不過先從簡單的開始。
基本查詢範例
假設我們有一張 students 學生表,裡面有學生的資料。表結構可能長這樣:
| id | first_name | last_name | age | grade |
|---|---|---|---|---|
| 1 | Alex | Lin | 20 | A |
| 2 | Anna | Song | 22 | B |
| 3 | Otto | Art | 19 | A |
現在我們只想知道所有學生的 last_name 跟 grade。
查詢會長這樣:
SELECT last_name, grade
FROM students;
執行結果:
| last_name | grade |
|---|---|
| Lin | A |
| Song | B |
| Art | A |
恭喜啦,你剛剛省下了資料庫資源,結果也更好讀!
字串合併
你已經會選資料了,來點有趣的吧。在我們的表裡,名字和姓氏是分開的。我們來寫個查詢,把學生的全名合併成一個欄位。
在 PostgreSQL 合併兩個字串用 ||。查詢會像這樣:
SELECT first_name || last_name, grade
FROM students;
執行結果:
| first_name || last_name | grade |
|---|---|
| AlexLin | A |
| AnnaSong | B |
| OttoArt | A |
嗯,好像少了點什麼。比如說名字和姓氏中間應該有個空格!我們來修正一下。
SELECT first_name || ' ' || last_name, grade
FROM students;
執行結果:
| first_name || ' ' || last_name | grade |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
這樣才對嘛。結果表的內容我很滿意,但標題怎麼變這樣?我想看到 full name 或 name,而不是 first_name || ' ' || last_name。這樣又醜又不實用。其實有解法啦。
用 alias(別名)選欄位
用 alias 可以讓 SQL 查詢更好讀。就是在查詢裡給欄位取個新名字。用 AS 關鍵字(雖然可以省略,但建議還是寫上去,比較清楚)。
來看個例子:
SELECT first_name AS "名字", last_name AS "姓氏", grade AS "成績"
FROM students;
執行結果:
| 名字 | 姓氏 | 成績 |
|---|---|---|
| Alex | Lin | A |
| Anna | Song | B |
| Otto | Art | A |
這裡我們:
- 把欄位名稱改成中文,看起來更直觀。
- 在查詢裡用
AS設定 alias。
如果你老闆或客戶要看資料又不想讓他們看得頭昏腦脹,alias 就是你的好朋友。
現在我們來優化一下全名的查詢。
SELECT first_name || ' ' || last_name AS "全名", grade AS "成績"
FROM students;
執行結果:
| 全名 | 成績 |
|---|---|
| Alex Lin | A |
| Anna Song | B |
| Otto Art | A |
完美,這才是我們想要的。
為什麼只選部分欄位?
- 效能
想像一下你在處理一張有幾百萬筆、幾百個欄位的超大表。用 SELECT * 全部撈出來可能要等好幾分鐘甚至幾小時,還會吃掉一堆 server 資源。只撈你要的欄位就好啦。
- 可讀性
只撈你要的欄位,結果一目了然。否則結果就像週五晚上刷不完的新聞。
- 減少錯誤
查詢處理的資料越少,出錯的機率也越低。尤其你還要再處理這些資料時。
還要注意什麼?
資料表 alias
另一個對付長資料表名稱的方法,就是用資料表 alias。alias 最好跟原本的表名有點關聯,或至少看得出來是什麼。
SELECT sa05.first_name, sa05.course_id
FROM students_archive_2005 AS sa05
這招特別適合那種超長表名,比如 university_students_enrollments_records,你可以用 usr 或 us 來簡化。
選特定欄位時常見錯誤
欄位名稱拼錯。如果你拼錯欄位名,會看到像這樣的錯誤訊息:
ERROR: column "lastname" does not exist。記得檢查拼字!欄位名稱衝突。多表查詢時,一定要標明是哪個表的欄位。例如
students.first_name。用
SELECT *—— 這是新手陷阱。雖然很方便,但在大專案裡這是壞習慣!永遠只選你真的需要的欄位。
GO TO FULL VERSION