首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 進階 SELECT(三):NOT、GROUP BY/HAVING、ORDER BY、LIMIT 進階用法

     編輯:MySQL 資料庫相關知識

接續前兩篇,本文聚焦 NOT 邏輯否定、分組聚合 GROUP BY/HAVING、排序 ORDER BY 多種寫法、分頁 LIMIT 雙參數機制與 PROCEDURE 保留字。

1. NOT:邏輯否定

可用於任何邏輯表達式或關鍵字前:


WHERE NOT (a > 10)
WHERE name NOT LIKE 'A%'
WHERE status NOT NULL
WHERE id NOT BETWEEN 1 AND 100

2. GROUP BY 與 HAVING:分組統計與組過濾


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;

3. ORDER BY:排序的三種引用方式


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。

4. LIMIT:分頁核心

注意:偏移量基於 0。大偏移量(如 LIMIT 1000000, 20)效能極差,建議用「游標分頁」或「延遲關聯」優化。

5. PROCEDURE 保留字

語法保留 PROCEDURE procedure_name,原意支援存儲過程處理結果集,MySQL 早期不支援存儲過程(5.0+ 才支援),目前實際無效果,屬前瞻性保留。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
語法含義等價寫法
LIMIT 5前 5 行(偏移 0)LIMIT 0, 5
LIMIT 10, 20跳過 10 行,取 20 行第 2 頁,每頁 20 行