首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 查詢進階筆記(二):聚合函數、分組、排序、分頁與 SELECT 選項參數深度解析

     編輯:MySQL 綜合教學

SELECT 選項參數速查

選項作用
ALL返回所有匹配行(默認)
DISTINCT / DISTINCTROW去除結果集重複行
HIGH_PRIORITY提升查詢優先級
STRAIGHT_JOIN強制按 FROM 順序連接
SQL_SMALL_RESULT結果集小,用臨時表避免排序
SQL_BIG_RESULT結果集大,優先排序
SQL_BUFFER_RESULT結果放入臨時表,早釋放鎖
SQL_CACHE / SQL_NO_CACHE控制查詢緩存
SQL_CALC_FOUND_ROWS忽略 LIMIT 計算總行數,配合 FOUND_ROWS()

聚合函數 (Aggregation Functions)

函數說明忽略 NULL
COUNT(expr) / COUNT(*)行數 / 非NULL值數是 / 否(*)
SUM(expr)求和是
AVG(expr)平均值是
MAX(expr) / MIN(expr)最大/最小值是
STDDEV(expr) / STD(expr)標準差是
VARIANCE(expr)方差是
GROUP_CONCAT(expr)分組拼接字符串,默認 1024 字節上限是
BIT_AND / BIT_OR / BIT_XOR位運算聚合是

COUNT 變體差異

COUNT(*)      -- 統計所有行(含 NULL)
COUNT(col)    -- 統計該列非 NULL 行
COUNT(DISTINCT col) -- 去重後統計非 NULL 行

GROUP_CONCAT 實用參數

GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR ','])
-- 調大長度限制
SET SESSION group_concat_max_len = 1000000;

GROUP BY 分組查詢

SELECT major, COUNT(*) AS stu_cnt, AVG(credits) AS avg_credits
FROM student
GROUP BY major;

WITH ROLLUP 超級聚合

SELECT major, gender, COUNT(*) AS cnt
FROM student
GROUP BY major, gender WITH ROLLUP;
-- 輸出:各專業+性別分組 → 各專業小計( gender=NULL ) → 總計( major=NULL, gender=NULL )

HAVING 過濾分組

⚠️ WHERE 過濾原始行,HAVING 過濾分組後結果。HAVING 可用聚合函數,WHERE 不可。
-- 平均分 ≥ 85 的學生
SELECT stu_id, AVG(score) AS avg_score
FROM score
GROUP BY stu_id
HAVING AVG(score) >= 85;

ORDER BY 排序

ORDER BY col_name | expr | position [ASC | DESC], ...
  • 位置數字:ORDER BY 2 DESC 按 SELECT 列表第 2 列降序
  • NULL 排序:ASC 置頂,DESC 置底
  • 多鍵排序:先按第一鍵,相等再按第二鍵

LIMIT 分頁

LIMIT [offset,] row_count
LIMIT row_count OFFSET offset
-- 前 5 行
LIMIT 5
-- 第 2 頁,每頁 10 行
LIMIT 10 OFFSET 10   -- 或 LIMIT 10, 10
⚠️ 深分頁性能陷阱:LIMIT 1000000, 10 需掃描 100 萬行。優化方案:
1. 記住上頁最大主鍵 WHERE id > last_id LIMIT 10
2. 覆蓋索引 INDEX (id, col...)
3. 延遲關聯:子查詢取 ID 再 JOIN 回表

子句執行順序(重要)

  1. FROM / JOIN
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT (含 DISTINCT)
  6. ORDER BY
  7. LIMIT

理解順序可避免「WHERE 用別名」「HAVING 用未分組列」等常見錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved