表 material 包含 type 列(值如 'news', 'image', 'video'...),需統計每類型出現次數,且新類型自動納入統計無需改代碼。
SELECT `type`, COUNT(1) AS `count`
FROM `material`
GROUP BY `type`;
+--------+-------+
| type | count |
+--------+-------+
| news | 1250 |
| image | 890 |
| video | 320 |
| audio | 45 |
+--------+-------+
COUNT(1) vs COUNT(*) vs COUNT(column)| 寫法 | 語義 | 性能 | 推薦度 |
|---|---|---|---|
COUNT(1) | 統計行數(常數表達式不為 NULL) | 最優,優化器直接讀行指針 | ⭐⭐⭐⭐⭐ |
COUNT(*) | 統計行數(標準 SQL) | 同 COUNT(1),現代優化器等價處理 | ⭐⭐⭐⭐ |
COUNT(type) | 統計 type 非 NULL 值個數 | 需檢查列是否 NULL,略慢 | ⭐⭐⭐ |
結論:統計行數統一用 COUNT(1),語義明確且性能最優。
GROUP BY 自動去重聚合type 值歸為一組ORDER BY count DESC 按頻次降序)ALTER TABLE `material` ADD INDEX `idx_type` (`type`);
有索引時 GROUP BY type 可走 Index Full Scan(Extra: Using index),避免臨時表 + filesort。
SELECT `type`, `status`, COUNT(1) AS `count`
FROM `material`
GROUP BY `type`, `status`
ORDER BY `type`, `count` DESC;
SELECT `type`, COUNT(1) AS `count`
FROM `material`
WHERE `create_time` > '2024-01-01'
GROUP BY `type`;
SELECT `type`, COUNT(1) AS `count`
FROM `material`
GROUP BY `type`
ORDER BY `count` DESC
LIMIT 10;
SELECT type, (SELECT COUNT(*) FROM material m2 WHERE m2.type=m1.type) FROM material m1 GROUP BY type 效率極低type 為 NULL 的行會單獨分為一組,業務上通常需 WHERE type IS NOT NULL 或 COALESCE(type, 'unknown')EXPLAIN 分析或抽樣統計,避免長時間鎖表掌握 GROUP BY + COUNT(1) 模式,即可高效解決 90% 的列值頻次統計需求,是 SQL 分析工具箱中的必備基礎招式。