接續前兩篇,本文聚焦 NOT 邏輯否定、分組聚合 GROUP BY/HAVING、排序 ORDER BY 多種寫法、分頁 LIMIT 雙參數機制與 PROCEDURE 保留字。
可用於任何邏輯表達式或關鍵字前:
WHERE NOT (a > 10)
WHERE name NOT LIKE 'A%'
WHERE status NOT NULL
WHERE id NOT BETWEEN 1 AND 100
SELECT 列表
FROM 表
[WHERE 條件]
GROUP BY [ALL] 欄位/運算式 [, ...]
[HAVING 組條件]
[ORDER BY ...]
[LIMIT ...]
SELECT 列表中非聚合欄位必須出現在 GROUP BY 中(ONLY_FULL_GROUP_BY 模式強制)。HAVING 可引用聚合函數(COUNT(*)、SUM() 等),WHERE 不可。ALL 關鍵字(T-SQL 擴展)保留被 WHERE 過濾掉的組,但與 HAVING 共用時語義互斥,MySQL 不支援此關鍵字。GROUP BY YEAR(created_at), MONTH(created_at)。
-- 每月訂單量與金額,只顯示金額超過 10 萬的月份
SELECT YEAR(created_at) AS yr, MONTH(created_at) AS mo,
COUNT(*) AS orders, SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY yr, mo
HAVING total > 100000
ORDER BY yr DESC, mo DESC;
SELECT id AS myid, name AS myname FROM t GROUP BY id;
-- 以下三種等價:
ORDER BY id
ORDER BY myid
ORDER BY 1 -- 不推薦,可讀性差
ASC 升序(預設),DESC 降序。ORDER BY yr DESC, mo ASC。| 語法 | 含義 | 等價寫法 |
|---|---|---|
LIMIT 5 | 前 5 行(偏移 0) | LIMIT 0, 5 |
LIMIT 10, 20 | 跳過 10 行,取 20 行 | 第 2 頁,每頁 20 行 |