首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MySQL 分段統計 SQL 寫法:UNION ALL 實現成績區間分布查詢

     編輯:程式設計綜合問答

需求場景

學生成績表 student(score),需統計各分數段人數:

  • < 60 分
  • 60-70 分
  • 70-80 分
  • 80-90 分
  • ≥ 90 分

標準 SQL 寫法(UNION ALL)

SELECT '60分以下' AS `type`, COUNT(*) FROM student WHERE score < 60
UNION ALL
SELECT '60-70分', COUNT(*) FROM student WHERE score >= 60 AND score < 70
UNION ALL
SELECT '70-80分', COUNT(*) FROM student WHERE score >= 70 AND score < 80
UNION ALL
SELECT '80-90分', COUNT(*) FROM student WHERE score >= 80 AND score < 90
UNION ALL
SELECT '90分以上', COUNT(*) FROM student WHERE score >= 90;

執行結果示例

+-----------+----------+
| type      | COUNT(*) |
+-----------+----------+
| 60分以下  | 1        |
| 60-70分   | 1        |
| 70-80分   | 2        |
| 80-90分   | 1        |
| 90分以上  | 3        |
+-----------+----------+

進階優化:單次掃描 + CASE WHEN(性能更優)

SELECT 
    SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS '60分以下',
    SUM(CASE WHEN score >= 60 AND score < 70 THEN 1 ELSE 0 END) AS '60-70分',
    SUM(CASE WHEN score >= 70 AND score < 80 THEN 1 ELSE 0 END) AS '70-80分',
    SUM(CASE WHEN score >= 80 AND score < 90 THEN 1 ELSE 0 END) AS '80-90分',
    SUM(CASE WHEN score >= 90 THEN 1 ELSE 0 END) AS '90分以上'
FROM student;

優點:只掃描一次表,大數據量下性能遠優於 UNION ALL 多次掃描。

動態分段:配合參數化/存儲過程

若分段邏輯常變,建議建立 分段配置表 score_range(id, label, min_score, max_score),應用層動態拼接 SQL 或使用存儲過程循環查詢。

總結

  • 小數據量、固定分段:UNION ALL 寫法直觀易維護。
  • 大數據量、高頻查詢:CASE WHEN 單次聚合,配合索引 INDEX(score) 效果最佳。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved