MySQL统计函数记录——按条件计数

本文通过一个趣味的故事介绍了在MySQL中按条件计数的三种方法:GROUP BY、嵌套的SELECT和CASE WHEN。通过案例分析了每种方法的优缺点,强调在确定分类条件下,避免使用GROUP BY以提升查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述
为使讨论简单易懂,我将问题稍作简化,去掉诸多的背景。

从前有一个皇帝,他有50个妃子,这些妃子很没有天理的给他生了100,000个儿子,于是,皇帝很苦恼,海量的儿子很难管理,而且,他想知道每个妃子给他生了多少个儿子,从而论功行赏,这很难办。于是,皇帝请了一个程序员帮他编了一个程序,用数据库来存储所有的儿子的信息,这样就可以用程序来统计和管理啦。

数据库的结构如下:
id 皇子的唯一编号
mother 皇子母亲的唯一编号
皇帝把妃子分成了两个等级,天宫娘娘(编号小于25)和地宫娘娘(编号大于等于25),他想知道天宫娘娘们和地宫娘娘们的生育能力孰强孰弱。于是,程序员开始写SQL Query了。

方法1:使用GROUP BY
SQL Query
SELECT COUNT(*) FROM `prince` GROUP BY `mother` > 24;

执行结果
count(*)
50029
49971
在100,000行数据上的运行时间:0.0335 秒

分析
这种GROUP BY方法的最大问题在于:无法区分所得到的结果。这两个数字哪一个是天宫娘娘们所生的皇子数,哪一个是地宫娘娘们所生的皇子数呢?不知道。所以,尽管它统计出了总数,但是没有什么意义。
因此,为了区分统计结果,必须要把条件 mother > 24 也作为一个字段在结果集中作为一个字段体现出来,修改后的sql如下:

SELECT COUNT(*) AS `number`, `mother` > 24 AS `type` FROM `prince` GROUP BY `mother` > 24;

执行结果
number type
50029 <
### MySQL 聴集函数及其条件应用 #### 基本概念 MySQL 的聚合函数用于执行特定计算并返回单个值。常见的聚合函数包括 `MIN()`、`MAX()`、`SUM()` 和 `GROUP_CONCAT()` 等[^1]。 #### 条件的应用方式 当需要在聚合函数中加入条件时,可以利用 SQL 提供的控制流语句来实现。例如,在 `SELECT` 查询中嵌套使用 `IF()` 或者 `CASE WHEN THEN ELSE END` 表达式,从而动态调整数据筛选逻辑[^3]。 以下是具体示例: --- #### 示例 1: 使用 IF() 添加条件 (COUNT) 假设有一个表名为 `profile_visit_log`,记录用户的访问日志。如果要统计某个日期之前某用户的具体访问次数,则可以通过如下查询完成: ```sql SELECT COUNT( IF(create_date < '2017-01-01' AND host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2', TRUE, NULL) ) AS visit_count FROM profile_visit_log; ``` 此查询通过 `IF()` 判断每条记录是否满足给定条件,并仅对符合条件的数据计数。 --- #### 示例 2: 使用 CASE WHEN 实现更复杂的条件 (SUM) 对于考试成绩表 (`exam_result`),若需按科目分类求和,可采用以下写法: ```sql SELECT subject, SUM(CASE WHEN grade >= 60 THEN score ELSE 0 END) AS passed_score_sum FROM exam_result WHERE subject = 'Math' GROUP BY subject; ``` 这里运用了 `CASE WHEN` 结构定义了一个简单的业务规则——只有分数大于等于 60 才计入总分[^2]。 --- #### 示例 3: 多字段组合过滤 (GROUP_CONCAT) 考虑场景:有一张员工技能清单表格 `employee_skills` ,其中包含员工 ID 及其对应的技能名称。现在希望查看每位员工所具备的所有技能列表。 ```sql SELECT employee_id, GROUP_CONCAT(skill_name SEPARATOR ', ') AS skills_list FROM employee_skills WHERE skill_level > 3 -- 这里添加额外约束条件 GROUP BY employee_id; ``` 上述代码片段展示了如何借助 `GROUP_CONCAT` 将多行结果拼接为单一字符串形式的同时支持附加过滤器操作[^4]。 --- #### 综合说明 以上各例子均体现了不同类型的聚合运算配合相应限定条款的实际应用场景。值得注意的是,尽管这些技术手段能够极大增强灵活性,但在实际开发过程中也应注重性能优化以及SQL书写清晰度等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值