目次

  • 前言
  • 不要過度使用 SELECT *
  • 意識 WHERE 子句
  • 寫上 ORDER BY
  • 理解 NULL 的處理
  • 善用別名
  • 總結

撰寫 SQL 前應該先知道的 5 個基本規則

前言

SQL 是處理資料庫時不可或缺的語言,但一開始很容易會想著「先能跑就好」。
然而在實務上,SQL 不只要能正確執行,可讀性、可維護性、效能也同樣重要。

這次要介紹的是,針對剛開始學 SQL 的人,或是實務上開始有機會寫 SQL 的人,我認為「一開始就知道會很有幫助」的 5 個基本規則。
本文不只是介紹寫法,也會一起說明為什麼那樣寫很重要


1. 不要過度使用 SELECT *

SELECT * 雖然可以取得所有欄位,很方便,但在實務上應該養成只取得必要欄位的習慣。

NG 範例

SELECT *
FROM Employee;

OK 範例

SELECT
    EmployeeId,
    EmployeeName,
    Department
FROM Employee;

重點

  • 只取得必要的資料
  • 可減少傳輸量與取得資料量
  • SQL 內容更容易理解
  • 較不受資料表結構變更影響

為什麼重要?
當資料表新增欄位時,如果使用 SELECT *,那些欄位可能會在你沒注意到的情況下被一併查出來。
此外,取得超出需求的資料也可能導致效能下降與可讀性變差,因此明確指定需要的欄位很重要。

在開發過程中做查詢確認時,可能會使用 SELECT *,但正式上線運行的 SQL,建議都明確指定要取得的欄位。


2. 意識 WHERE 子句

WHERE 子句是用來只取得必要資料的關鍵條件。

NG 範例

SELECT *
FROM Sales;

OK 範例

SELECT
    SalesId,
    Price
FROM Sales
WHERE SalesDate >= '2026-01-01';

重點

  • 只取得必要的資料
  • 有時可改善處理速度
  • 在 UPDATE 與 DELETE 中尤其重要

為什麼重要?
如果忘了加上 WHERE 子句,不只可能會撈出不必要的大量資料,在 UPDATE 或 DELETE 時,還可能導致全表更新、全表刪除。
特別是在更新類 SQL 中,執行前先確認影響筆數的習慣非常重要。


3. 寫上 ORDER BY

SQL 的執行結果,如果沒有指定 ORDER BY,順序是不保證的。

SELECT
    EmployeeId,
    EmployeeName
FROM Employee
ORDER BY EmployeeId;

重點

  • 可以明確指定顯示順序
  • 每次都能用相同順序確認結果
  • 比較容易做測試與資料確認

為什麼重要?
如果不指定 ORDER BY,取得資料的順序並不保證。
即使是同一段 SQL,每次執行時顯示順序也可能不同,這有時會造成測試或資料調查時的誤判。

為了避免「跟上次順序不一樣」這類問題,建議在需要時明確寫上 ORDER BY。


4. 理解 NULL 的處理

NULL 不是「空字串」也不是「0」,而是代表「沒有值存在的狀態」。

因此,不能用一般的比較運算子來判斷。

NG 範例

WHERE Name = NULL

OK 範例

WHERE Name IS NULL

如果想取得不是 NULL 的資料,則可寫成以下形式:

WHERE Name IS NOT NULL

重點

  • NULL 是一種特殊值
  • 比較時要使用 IS NULLIS NOT NULL
  • 了解 NULL 的規則後,也更容易進行原因調查

為什麼重要?
因為 NULL 和一般值不同,即使使用 = 來比較,也不會得到預期結果。
先理解 NULL 的特性,能讓你在除錯和資料確認時更順利。


5. 善用別名

別名(Alias)是替資料表或欄位暫時取一個別稱的功能。

使用別名的目的,不只是讓 SQL 寫得比較短,重點是讓資料表與欄位的角色更清楚,提升可讀性

沒有別名

SELECT
    ACCOUNT.account_name,
    REQUEST.request_date
FROM
    REQUEST
    INNER JOIN ACCOUNT
        ON ACCOUNT.account_id = REQUEST.employee_account_id;

因為每次都要寫完整資料表名稱,SQL 會變得很長;JOIN 越多時,也越難閱讀。

有別名

SELECT
    emp_account.account_name,
    req.request_date
FROM
    REQUEST req
    INNER JOIN ACCOUNT emp_account
        ON emp_account.account_id = req.employee_account_id;

使用別名後,不只能把 SQL 寫得更精簡,也更容易理解各資料表的角色。

另外,當同一個資料表會使用多次時,替它們加上能看出角色的名稱,可大幅提升可讀性。

SELECT
    req.request_id,
    emp_account.account_name   AS employee_name,
    admin_account.account_name AS admin_name
FROM
    REQUEST req
    INNER JOIN ACCOUNT emp_account
        ON emp_account.account_id = req.employee_account_id
    LEFT JOIN ACCOUNT admin_account
        ON admin_account.account_id = req.admin_account_id;

在這個例子中,雖然兩者都是 ACCOUNT 資料表,

  • emp_account:申請者的帳號
  • admin_account:核准者的帳號

從名稱就能看出各自的角色,因此可以立刻判斷「現在參照的是哪一個帳號」。

重點

  • 讓 SQL 更容易閱讀
  • 資料表的角色更容易理解
  • 同一資料表重複使用時也更容易區分
  • 維護與 code review 時更容易掌握內容

為什麼重要?

隨著資料表數量增加,SQL 會變得越來越複雜。
善用別名可以提升 SQL 的可讀性,也更方便維護與 review。
特別是大量使用 JOIN 的 SQL,透過別名可以減少重複書寫,寫出更容易閱讀的 SQL。
abe 這類很短的別名,在 SQL 很短時通常沒問題,但當 JOIN 的資料表變多時,就可能讓人看不出它代表哪個資料表。

reqemp_accountadmin_account 這種能看出角色的別名,能讓閱讀 SQL 的人更容易理解內容,也讓維護與 review 更順利。


總結

這次介紹的內容雖然都是基本觀念,但在實務上非常重要。

  • 不要過度使用 SELECT *
  • 用 WHERE 子句只取得必要資料
  • 用 ORDER BY 明確指定排序
  • 將 NULL 視為特殊值來處理
  • 善用別名寫出易讀的 SQL

SQL 不只是「能跑就好」,讓其他人也能看懂同樣很重要。

之後如果你有機會寫 SQL,不妨試著留意這些重點。

參考資料


原文出處:https://qiita.com/T-furukubo/items/3ace375e1b8aafd014a2


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
站長阿川
📝8   💬3   ❤️4
291
🥈
我愛JS
📝2   💬6   ❤️4
112
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登