當前位置: 妍妍網 > 碼農

要避免的 9 個 SQL 錯誤

2024-06-03碼農

雖然學習 SQL 語法至關重要,但真正掌握該語言需要了解如何編寫有效且高效的查詢。

下面對不該做的事進行逆向分析,指導你寫出清晰、最佳化、強大的 SQL 語句:

1、避免不明確的列命名:

Don’t

CREATETABLE table1 (idint , namevarchar(50), value money);
SELECTidnamevalueFROM 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