| 類別 | 運算符 |
| 比較 | =, <>, !=, <, <=, >, >=, <=>, BETWEEN, IN, LIKE, REGEXP, IS NULL |
| 邏輯 | AND / &&, OR / ||, NOT / !, XOR |
優先級(高→低): 比較 → NOT → AND → OR → XOR。
禁忌: WHERE 中不可使用選取清單別名(尚未計算)。
4. GROUP BY 子句
- 支援多欄位:
GROUP BY col1 [ASC|DESC], col2 ...
- 搭配聚合函數:
COUNT(*)(含 NULL)、COUNT(col)(排除 NULL)
- MySQL 5.7+ 預設
ONLY_FULL_GROUP_BY,非聚合欄位必須出現在 GROUP BY 或函數中
5. HAVING 子句
- 分組後過濾,可使用聚合函數、選取別名
- 無 GROUP BY 時等同 WHERE(但可用聚合)
- 不能替代 WHERE(WHERE 先於 GROUP BY 執行,效率更高)
6. ORDER BY 子句
ASC(預設)遞增,DESC 遞減
- 多欄位排序:先按第一欄,相同才按第二欄
- 隱含主鍵作為最終 tie-breaker(InnoDB 聚簇索引順序)
- 可使用選取別名、聚合函數、任意運算式
7. LIMIT 子句(分頁利器)
LIMIT 行數 -- 等同 LIMIT 0, 行數
LIMIT 偏移量, 行數 -- 從偏移量開始取行數行(偏移量從 0 起算)
-- 分頁公式:第 page 頁,每頁 size 條
LIMIT (page - 1) * size, size
大偏移量效能陷阱: LIMIT 1000000, 10 需掃描 100 萬行再丟棄。優化:
→ 使用覆蓋索引 WHERE id > last_seen_id ORDER BY id LIMIT 10(游標式分頁)
→ 或延遲關聯:SELECT * FROM t JOIN (SELECT id FROM t ORDER BY id LIMIT 1000000, 10) d USING (id)
完整範例
-- 查詢 2023 年每月訂單金額前 3 高的客戶
SELECT
DATE_FORMAT(o.created_at, '%Y-%m') AS month,
c.name AS customer,
SUM(o.amount) AS total_amount
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.created_at >= '2023-01-01' AND o.created_at < '2024-01-01'
GROUP BY month, c.id
HAVING total_amount > 10000
ORDER BY month ASC, total_amount DESC
LIMIT 3;
常見錯誤速查
| 錯誤 | 原因 | 修正 |
| Unknown column 'alias' in 'where clause' | WHERE 用了 SELECT 別名 | 改用原欄位名或移至 HAVING |
| Mixing of GROUP columns ... | ONLY_FULL_GROUP_BY 違規 | 補全 GROUP BY 或用 ANY_VALUE() |
| LIMIT offset 巨大導致慢查詢 | 掃描大量行再丟棄 | 改用游標式分頁 |
- 上一篇文章: MySQL 數據類型完整指南:數值、字串、日期時間、空間與 JSON 類型詳解
- 下一篇文章: MySQL 視圖深度解析:虛擬表的運作原理與實戰應用
Copyright ©
程式碼之家 All Rights Reserved