-- 反模式:全欄位掃描,效能差
SELECT * FROM customers;
-- 最佳實務:明確列出需要欄位
SELECT cust_id, cust_name, email FROM customers;
避免 SELECT *:減少網路傳輸、避免隱性相依、利用 Covering Index。
-- 單表
SELECT * FROM students;
-- 多表連接 (現代 ANSI JOIN 語法)
SELECT s.name, c.course_name
FROM students s
JOIN enrollments e ON s.id = e.student_id
JOIN courses c ON e.course_id = c.id;
| 運算子 | 功能 | 範例 |
|---|---|---|
=, <>, != | 等於、不等於 | WHERE status = 'A' |
>, >=, <, <= | 比較 | WHERE score >= 60 |
BETWEEN | 範圍 (含邊界) | WHERE age BETWEEN 18 AND 65 |
LIKE | 模式比對 | WHERE name LIKE '張%' |
IN | 集合成員 | WHERE dept_id IN (10,20,30) |
IS NULL / IS NOT NULL | 空值判斷 | WHERE bonus IS NULL |
%:零或多個任意字元_:單一任意字元[abc]:字元集合中任一[^abc]:排除字元集合NOT > AND > OR。善用括號明確分組:
WHERE name = '王小明' AND (score > 90 OR bonus IS NOT NULL)
SELECT * FROM products
ORDER BY category ASC, price DESC NULLS LAST;
ASC 遞增 (預設)、DESC 遞減NULLS FIRST / LAST 控制空值排序位置