報表常需將多欄位合併顯示(如「職位 姓名 出生於 日期」)。
SELECT job_title || ' ' || emp_name || '出生於' || birth_date AS emp_info
FROM employees;
場景:查詢「有員工的部門與職位組合」。
SELECT DISTINCT dept_name, job_title FROM employees;同時滿足「有員工」與「無重複」兩大業務需求。
大表查詢不加 WHERE → 全表掃描 → 響應慢、資源耗盡。
-- 差:全表掃描後再過濾
SELECT * FROM books WHERE category = '會計師輔導';
-- 好:索引範圍掃描(假設 category 有索引)
SELECT book_id, title, author FROM books WHERE category = '會計師輔導';
COUNT(seq_id) 會統計含 NULL 的行(序號通常不為 NULL),但 COUNT(nullable_col) 會忽略 NULL。**建議統計業務主鍵或 NOT NULL 欄位**(如 COUNT(emp_id))。
預設 COUNT(ALL col) 含重複。需去重時用 COUNT(DISTINCT col)。
-- 查詢有員工的部門數
SELECT COUNT(DISTINCT dept_id) FROM employees;
SELECT
COUNT(DISTINCT CASE WHEN status='ACTIVE' THEN dept_id END) AS active_depts,
COUNT(DISTINCT CASE WHEN status='INACTIVE' THEN dept_id END) AS inactive_depts
FROM employees;
同一張員工表支援多種查詢需求(正式員工、管理層、合同到期)。
| 策略 | 優點 | 缺點 |
|---|---|---|
| 單一視圖 SELECT * | 開發快 | 傳輸冗餘欄位、權限粗糙、掃描成本高 |
| 多個專用視圖 | 欄位精簡、權限細粒度、索引利用佳、安全性高 | 初期設計耗時 |
結論:投入設計時間換取長期效能與安全紅利,極具性價比。
這五個技巧看似基礎,實戰中卻常被忽略。理解原理、靈活組合、拒絕生搬硬套,才能真正轉化為查詢調優的核心競爭力。