WHERE 1=1 在邏輯上永真,不影響查詢結果,但在動態建構 SQL 字串時極為實用:
String sql = "SELECT * FROM table1 WHERE 1=1";
if (!name.isEmpty()) sql += " AND name = '" + name + "'";
if (!age.isEmpty()) sql += " AND age = " + age;
if (!height.isEmpty()) sql += " AND height = " + height;
無需判斷是否為第一個條件而決定加 WHERE 還是 AND,程式碼更簡潔、不易出錯。同理 1<>2、'a'='a' 等同樣效果。
| 情境 | 建議 | 說明 |
|---|---|---|
| 無主鍵 | COUNT(1) 較快 | 掃描單一常數列比掃描全列輕量 |
| 有主鍵(單欄或複合) | COUNT(主鍵欄位) 最快 | 利用叢集索引葉層計數,避免全表掃描 |
| 單一欄位表 | COUNT(*) 最快 | 優化器自動選擇最小索引 |
現代優化器會自動將 COUNT(*) 轉換為最有效率的計數方式(通常掃描最窄的非叢集索引或叢集索引),差異極微。實務上建議直接使用 COUNT(*),語意清晰且相容性最好。
WHERE 1=1 是動態 SQL 建構的最佳實踐,非效能優化手段。COUNT(*) 為標準寫法,優化器會自動處理,無需手動指定 COUNT(1) 或 COUNT(pk)。