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

MySQL SUM() 求和函數實戰指南與常見坑點

     編輯:MySQL 資料庫相關知識

核心語法速覽

SELECT SUM(column_name) [AS alias_name]
FROM table_name
[WHERE condition]
[GROUP BY group_column];

實戰範例:統計用戶總消費金額

假設有一張消費記錄表 buylist,欄位包含 mid (會員 ID)、prise (消費金額)。需求:查詢會員 ID 為 1 的總消費額。

❌ 錯誤示範(原始碼問題)

$sql = "SELECT SUM(prise) sum from buylist where mid = '1'";
$ress = mysql_query($sql);
echo $rowxiaofei = mysql_fetch_assoc($ress); // 直接 echo 陣列會報錯/只輸出 Array

問題解析:

  1. mysql_* 函數已在 PHP 7.0 移除,請改用 mysqli 或 PDO。
  2. mysql_fetch_assoc() 返回關聯陣列,需透過鍵名取值,不可直接 echo。
  3. 欄位別名 sum 為保留字,建議加反引號或改名。
  4. 缺乏錯誤處理與 SQL 注入防護。

✅ 現代化最佳實踐

<?php
// 推薦:PDO + 預處理語句
$dsn = 'mysql:host=localhost;dbname=shop;charset=utf8mb4';
$pdo = new PDO($dsn, 'user', 'pass', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);

$mid = 1;
$stmt = $pdo->prepare("SELECT SUM(`prise`) AS `total_amount` FROM `buylist` WHERE `mid` = ?");
$stmt->execute([$mid]);
$result = $stmt->fetch();

if ($result) {
    // SUM() 無匹配行時返回 NULL,建議用 COALESCE 處理
    $total = $result['total_amount'] ?? 0;
    echo "會員 {$mid} 總消費:¥{$total}";
} else {
    echo "查無資料";
}
?>

進階用法與避坑指南

1. 搭配 GROUP BY 做分組統計

-- 每位會員的總消費、筆數、平均單價
SELECT 
    `mid`,
    COUNT(*) AS `order_count`,
    SUM(`prise`) AS `total_amount`,
    AVG(`prise`) AS `avg_amount`
FROM `buylist`
GROUP BY `mid`
HAVING `total_amount` > 1000  -- 篩選高價值用戶
ORDER BY `total_amount` DESC;

2. 條件求和

-- 統計不同支付狀態的金額
SELECT 
    SUM(CASE WHEN `status` = 'paid' THEN `prise` ELSE 0 END) AS `paid_total`,
    SUM(CASE WHEN `status` = 'refunded' THEN `prise` ELSE 0 END) AS `refund_total`
FROM `orders`;

3. NULL 值陷阱

SUM() 會自動忽略 NULL 值,但若結果集為空(無匹配行或全為 NULL),返回 NULL 而非 0。應用層或 SQL 層面務必用 COALESCE(SUM(col), 0) 或 IFNULL() 兜底。

4. 精度與浮點數陷阱

金額欄位**嚴禁使用 FLOAT/DOUBLE**,必須用 DECIMAL(10,2) 或整數存分(如存 100 代表 1.00 元),避免浮點運算誤差導致對帳不平。

5. 大表效能優化

  • 被求和欄位建立索引(覆蓋索引更佳)。
  • 避免全表掃描:善用 WHERE 縮小範圍、分區表、或引入 OLAP 引擎。
  • 頻繁查詢的聚合指標,考慮物化視圖/摘要表/Redis 緩存異步更新。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved