統計查詢是業務報表核心。本文涵蓋 COUNT 效能優化、HAVING 過濾、條件聚合單查詢多指標等實戰模式。
-- 推薦:統計主鍵或 *
SELECT COUNT(*) FROM `user`;
SELECT COUNT(`id`) FROM `user`; -- id 為主鍵
-- 不推薦:統計非索引字符欄位
SELECT COUNT(`name`) FROM `user`; -- 全表掃描較慢
COUNT(*) 在 InnoDB 不掃描全表(優化器讀取表統計資訊),極快。COUNT(col) 忽略 NULL 值,需掃描該欄位。-- 每位學生總分
SELECT `student`, SUM(`score`) AS total FROM `score` GROUP BY `student`;
-- 及格門數 < 2 的學生(補考名單)
SELECT `student`, SUM(`score` < 60) AS fail_cnt
FROM `score` GROUP BY `student`
HAVING fail_cnt > 1;
SUM(condition) 利用布林值 1/0 實現條件計數,比 CASE WHEN 更簡潔。
SELECT `name`,
SUM(`score` >= 60) AS pass_cnt,
SUM(`score` < 60) AS fail_cnt
FROM `score`
GROUP BY `name`;
原理:IF(condition, 1, 0) 或直接用布林運算式,MySQL 自動轉為 1/0。
SELECT `course`,
SUM(CASE WHEN `score` >= 90 THEN 1 ELSE 0 END) AS excellent,
SUM(CASE WHEN `score` BETWEEN 60 AND 89 THEN 1 ELSE 0 END) AS pass,
SUM(CASE WHEN `score` < 60 THEN 1 ELSE 0 END) AS fail
FROM `score`
GROUP BY `course`;
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', 'pass');
$sql = 'SELECT COUNT(*) FROM `user`';
$total = $pdo->query($sql)->fetchColumn();
echo "總用戶數: $total";
COUNT(*) 仍可能較慢(InnoDB MVCC 需掃描可見行),考慮快取計數表或 INFORMATION_SCHEMA.TABLES.TABLE_ROWS 估算值。INDEX (group_col, filter_col) 讓聚合查詢走索引掃描。