SQL 是處理資料庫時不可或缺的語言,但一開始很容易會想著「先能跑就好」。
然而在實務上,SQL 不只要能正確執行,可讀性、可維護性、效能也同樣重要。
這次要介紹的是,針對剛開始學 SQL 的人,或是實務上開始有機會寫 SQL 的人,我認為「一開始就知道會很有幫助」的 5 個基本規則。
本文不只是介紹寫法,也會一起說明為什麼那樣寫很重要。
SELECT * 雖然可以取得所有欄位,很方便,但在實務上應該養成只取得必要欄位的習慣。
SELECT *
FROM Employee;
SELECT
EmployeeId,
EmployeeName,
Department
FROM Employee;
為什麼重要?
當資料表新增欄位時,如果使用 SELECT *,那些欄位可能會在你沒注意到的情況下被一併查出來。
此外,取得超出需求的資料也可能導致效能下降與可讀性變差,因此明確指定需要的欄位很重要。
在開發過程中做查詢確認時,可能會使用 SELECT *,但正式上線運行的 SQL,建議都明確指定要取得的欄位。
WHERE 子句是用來只取得必要資料的關鍵條件。
SELECT *
FROM Sales;
SELECT
SalesId,
Price
FROM Sales
WHERE SalesDate >= '2026-01-01';
為什麼重要?
如果忘了加上 WHERE 子句,不只可能會撈出不必要的大量資料,在 UPDATE 或 DELETE 時,還可能導致全表更新、全表刪除。
特別是在更新類 SQL 中,執行前先確認影響筆數的習慣非常重要。
SQL 的執行結果,如果沒有指定 ORDER BY,順序是不保證的。
SELECT
EmployeeId,
EmployeeName
FROM Employee
ORDER BY EmployeeId;
為什麼重要?
如果不指定 ORDER BY,取得資料的順序並不保證。
即使是同一段 SQL,每次執行時顯示順序也可能不同,這有時會造成測試或資料調查時的誤判。
為了避免「跟上次順序不一樣」這類問題,建議在需要時明確寫上 ORDER BY。
NULL 不是「空字串」也不是「0」,而是代表「沒有值存在的狀態」。
因此,不能用一般的比較運算子來判斷。
WHERE Name = NULL
WHERE Name IS NULL
如果想取得不是 NULL 的資料,則可寫成以下形式:
WHERE Name IS NOT NULL
IS NULL、IS NOT NULL為什麼重要?
因為 NULL 和一般值不同,即使使用 = 來比較,也不會得到預期結果。
先理解 NULL 的特性,能讓你在除錯和資料確認時更順利。
別名(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 會變得越來越複雜。
善用別名可以提升 SQL 的可讀性,也更方便維護與 review。
特別是大量使用 JOIN 的 SQL,透過別名可以減少重複書寫,寫出更容易閱讀的 SQL。
像 a、b、e 這類很短的別名,在 SQL 很短時通常沒問題,但當 JOIN 的資料表變多時,就可能讓人看不出它代表哪個資料表。
像 req、emp_account、admin_account 這種能看出角色的別名,能讓閱讀 SQL 的人更容易理解內容,也讓維護與 review 更順利。
這次介紹的內容雖然都是基本觀念,但在實務上非常重要。
SQL 不只是「能跑就好」,讓其他人也能看懂同樣很重要。
之後如果你有機會寫 SQL,不妨試著留意這些重點。
原文出處:https://qiita.com/T-furukubo/items/3ace375e1b8aafd014a2