掌握這 10 大 SELECT 技巧,覆蓋 90% 日常查詢場景,提升 SQL 可讀度與效能。
$sql = "SELECT * FROM article
WHERE id = 1"; -- 換行不影響執行,長查詢強烈建議分行
SELECT * FROM article WHERE id IN (1,3,5);
優於多個 OR,優化器可轉為範圍查詢。
SELECT CONCAT(id, '-', content) AS res FROM article WHERE id = 1;
-- 回傳 "1-article content"
SELECT LOCATE('hello', 'hello baby'); -- 1(位置從 1 起算)
SELECT LOCATE('x', 'hello'); -- 0(不存在)
SELECT city, COUNT(*) FROM customer GROUP BY city;
-- 等價於 DISTINCT city + 計數,常搭配 AVG/MIN/MAX/SUM
SELECT city, COUNT(*), MIN(birth_day)
FROM customer
GROUP BY city
HAVING COUNT(*) > 10;
注意:HAVING 欄位必須出現在 SELECT 清單或聚合函數中;GROUP BY + HAVING 較慢,大數據集建議子查詢或索引優化。
SELECT ...
FROM ...
WHERE ...
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...
嚴格遵循此順序撰寫,避免語法錯誤。
SELECT DISTINCT city FROM customer ORDER BY id DESC;
-- 第 101 筆之後所有資料
SELECT * FROM article LIMIT 100, -1;
-- 等價 LIMIT 100, 18446744073709551615(最大無符號長整數)
MySQL 8.0+ 建議使用 OFFSET 100 ROWS FETCH NEXT 10 ROWS ONLY 標準語法。
SELECT u.user_name
FROM user u, member m
WHERE u.id = m.id
AND m.reg_date >= '2006-12-28'
ORDER BY u.id DESC;
同名欄位必須加表別名:u.user_name 而非單獨 user_name,否則報錯 Column 'user_name' in field list is ambiguous。
EXPLAIN SELECT * FROM article WHERE id IN (1,3,5);
-- 關注 type=range、key=PRIMARY、rows=3 確認索引生效
熟練運用上述技巧,配合 EXPLAIN 持續優化,寫出高效能、易維護的 SQL。