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

MySQL 統計查詢實戰:COUNT 優化、條件聚合與單查詢多維度統計技巧

     編輯:MySQL 綜合教學

前言

統計查詢是業務報表核心。本文涵蓋 COUNT 效能優化、HAVING 過濾、條件聚合單查詢多指標等實戰模式。

一、COUNT 基礎與優化

-- 推薦:統計主鍵或 *
SELECT COUNT(*) FROM `user`;
SELECT COUNT(`id`) FROM `user`;  -- id 為主鍵

-- 不推薦:統計非索引字符欄位
SELECT COUNT(`name`) FROM `user`;  -- 全表掃描較慢
  • COUNT(*) 在 InnoDB 不掃描全表(優化器讀取表統計資訊),極快。
  • COUNT(col) 忽略 NULL 值,需掃描該欄位。

二、分組統計與 HAVING 過濾

-- 每位學生總分
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 整合範例

<?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";

六、效能提醒

  1. 大表 COUNT(*) 仍可能較慢(InnoDB MVCC 需掃描可見行),考慮快取計數表或 INFORMATION_SCHEMA.TABLES.TABLE_ROWS 估算值。
  2. 複雜統計建議建立摘要表(Materialized View)定時刷新。
  3. 善用覆蓋索引:INDEX (group_col, filter_col) 讓聚合查詢走索引掃描。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved