雖然學習 SQL 語法至關重要,但真正掌握該語言需要了解如何編寫有效且高效的查詢。
下面對不該做的事進行逆向分析,指導你寫出清晰、最佳化、強大的 SQL 語句:
1、避免不明確的列命名:
Don’t
CREATETABLE table1 (idint , namevarchar(50), value money);
SELECTid, name, valueFROM table1;
Do
CREATETABLE table1 (customer_id int , full_name varchar(50), purchase_amount money);
SELECT customer_id, full_name, purchase_amount FROM customer_orders;
使用描述性且有意義的列名稱,清楚地傳達它們所代表的數據。這增強了可讀性並減少了混亂,特別是在處理復雜查詢或與其他人協作時。
2. 不要選擇所有內容(除非必要):
Don’t
SELECT * FROM table1;
Do
SELECT customer_id, email, phone_number FROM customers;
選擇所有列可能效率很低,尤其是對於大型表。僅指定您需要的列,以避免不必要的數據傳輸並提高查詢效能。
3. 避免不必要的連線:
Don’t
SELECT * FROM
customer c
JOIN
order o
ON
c.id = o.id
JOIN
products p
ON
c.id = p.id
Do
SELECT
c.customer_id,
o.order_date,
p.product_name
FROM customers c
INNERJOIN orders o
ON
c.customer_id = o.customer_id
INNERJOIN products p
ON
o.product_id = p.product_id
僅在需要檢索相關數據時才連線表。不必要的連線會顯著減慢查詢速度,尤其是對於大型數據集。在連線表之前,請確保您清楚地了解表之間的關系。
4.當心缺少 WHERE 子句:
Don’t
SELECT * FROM customers;
Do
SELECT * FROM
customers
WHERE activ_ind = 'Y';
如果沒有 WHERE 子句,您將從表中檢索所有行,這可能效率低下且難以承受。使用 WHERE 子句根據特定條件過濾數據,確保您只檢索相關資訊。
5.為了清晰起見,不要忘記 ORDER BY:
Don’t
SELECT * FROM products;
Do
SELECT * FROM
products
ORDERBY product_name ASC
除非您明確指定順序,否則結果可能會以不可預測的順序出現。使用 ORDER BY 子句根據特定列對結果進行升序或降序排序,以便更好地組織和清晰。
6.避免不明確的別名:
Don’t
SELECT
c.id AS customer,
o.date AS order_date
FROM customers c, orders o
Do
SELECT
c.customer_id AS customer_id,
o.order_date
FROM customers c
INNERJOIN orders o ON
c.customer_id = o.customer_id
對表名和列名使用有意義的別名,尤其是在連線表或使用復雜查詢時。這提高了可讀性並避免了參照不同數據元素時的混淆。
7.不要忽視錯誤處理:
Don’t
(No error handling)
Do
BEGIN TRY -- Your SQL statement here --
END TRY
BEGIN CATCH -- Handle potential errors here --
END CATCH
實施錯誤處理以妥善處理意外情況,例如無效數據或連線問題。這可確保查詢執行不會突然終止,並為故障排除提供有價值的反饋。
8.繞過冗余子查詢:
Don’t
SELECT customer_id FROM customers WHEREidIN
(SELECT customer_id FROM orders WHERE order_date > '2023-01-01')
Do
SELECT c.customer_id
FROM customers c
INNERJOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_date > '2023-01-01';
盡可能避免巢狀子查詢。它們可能讀起來很復雜並且效率較低。探索在主查詢中使用聯接或過濾的替代方法以獲得相同的結果。
9.不要忽略評論和文件:
Don’t
(No comments or documentation)
Do
-- This query retrieves all active customers with their recent orders