首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 統計查詢實戰:COUNT、條件統計、單語句多維度聚合

     編輯:MySQL 資料庫相關知識

基礎統計:COUNT 用法

-- 統計表總行數(最快,利用表元數據)
SELECT COUNT(*) FROM `user`;

-- 統計特定欄位非 NULL 行數
SELECT COUNT(`uid`) FROM `user`;

-- 統計去重值
SELECT COUNT(DISTINCT `role`) FROM `user`;

建議:單純統計行數用 COUNT(*),InnoDB 會優化;避免 COUNT(字串欄位)(較慢)。

PHP 完整範例

connect_errno) die('連接失敗: ' . $conn->connect_error);

$sql = "SELECT COUNT(*) AS `total` FROM `user`";
$row = $conn->query($sql)->fetch_assoc();
echo "共有用戶: {$row['total']} 位";
$conn->close();

進階技巧 1:條件統計(單表多維度)

需求:統計及格(≥60)與不及格(<60)人數。

傳統寫法(兩次查詢)

SELECT COUNT(*) FROM `score` WHERE `score` >= 60;
SELECT COUNT(*) FROM `score` WHERE `score` < 60;

單語句實現:SUM + IF/CASE

SELECT
    `name`,
    SUM(IF(`score` >= 60, 1, 0)) AS `pass_count`,
    SUM(IF(`score` < 60, 1, 0)) AS `fail_count`
FROM `score`
GROUP BY `name`;

原理:條件成立賦值 1,否則 0,SUM 即為計數。CASE WHEN 同理。

進階技巧 2:單語句多條件多維度統計

需求:按部門統計「在職」、「離職」、「面試中」三種狀態人數。

SELECT
    `dept`,
    SUM(CASE WHEN `status` = 1 THEN 1 ELSE 0 END) AS `active`,
    SUM(CASE WHEN `status` = 2 THEN 1 ELSE 0 END) AS `left`,
    SUM(CASE WHEN `status` = 3 THEN 1 ELSE 0 END) AS `interview`,
    COUNT(*) AS `total`
FROM `employee`
GROUP BY `dept`;

進階技巧 3:樞紐分析(行轉列)

SELECT
    `year`,
    SUM(CASE WHEN `quarter` = 1 THEN `amount` END) AS `Q1`,
    SUM(CASE WHEN `quarter` = 2 THEN `amount` END) AS `Q2`,
    SUM(CASE WHEN `quarter` = 3 THEN `amount` END) AS `Q3`,
    SUM(CASE WHEN `quarter` = 4 THEN `amount` END) AS `Q4`,
    SUM(`amount`) AS `Total`
FROM `sales`
GROUP BY `year`;

效能優化建議

  • 索引支援:統計欄位(WHERE/GROUP BY)加索引。
  • 避免 SELECT *:只查統計欄位。
  • 大表分區:按時間分區,分區裁剪加速。
  • 緩存結果:報表類查詢結果緩存至 Redis,定時刷新。
  • 物化視圖/摘要表:定時任務預聚合寫入摘要表,查詢毫秒級返回。

結語

掌握 COUNT(*)、SUM(IF/CASE)、GROUP BY 組合,能用單一 SQL 完成複雜多維度統計,大幅減少應用層迴圈與多次查詢。配合索引、分區、緩存,滿足高併發報表需求。

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