MySQL 統計某欄位各值出現次數的標準寫法,使用 GROUP BY + COUNT(*),適用於分類統計、頻次分析、資料品質檢核等場景。
SELECT `VPDM`, COUNT(*) AS `cnt`
FROM `ipos_qtlsd`
GROUP BY `VPDM`
ORDER BY `cnt` DESC;
| 子句 | 作用 | 注意 |
|---|---|---|
SELECT VPDM | 分組依據欄位 (必須出現在 GROUP BY 中) | 非聚合欄位必須在 GROUP BY,否則 ONLY_FULL_GROUP_BY 模式報錯 |
COUNT(*) | 計算每組行數 (含 NULL 行) | COUNT(VPDM) 忽略 NULL,COUNT(*) 含 NULL |
GROUP BY VPDM | 按 VPDM 值分組 | 可多欄位 GROUP BY a,b |
ORDER BY cnt DESC | 按出現次數降序,高頻值優先 | 可加 LIMIT 10 取 Top-N |
SELECT VPDM, COUNT(*) cnt
FROM ipos_qtlsd
GROUP BY VPDM
HAVING cnt > 100
ORDER BY cnt DESC;
SELECT VPDM,
COUNT(*) cnt,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM ipos_qtlsd), 2) pct
FROM ipos_qtlsd
GROUP BY VPDM
ORDER BY cnt DESC;
SELECT VPDM, STATUS, COUNT(*) cnt
FROM ipos_qtlsd
GROUP BY VPDM, STATUS
ORDER BY VPDM, cnt DESC;
SELECT *, COUNT(*) OVER (PARTITION BY VPDM) AS vpdm_cnt
FROM ipos_qtlsd;
VPDM 上建立索引:CREATE INDEX idx_vpdm ON ipos_qtlsd(VPDM); 使 GROUP BY 走索引掃描 (type=index/ref) 而非全表掃描。EXPLAIN 確認是否使用 Using index for group-by (緊湊索引掃描)。SELECT VPDM, COUNT(*) FROM ipos_qtlsd TABLESAMPLE SYSTEM(10) GROUP BY VPDM (需 8.0+ 且表支援)。掌握 GROUP BY + COUNT 核心模式,靈活組合 HAVING、ORDER BY、窗口函數,滿足 90% 的分類頻次統計需求。