case when then else end HAVING
时间: 2025-04-26 15:02:14 浏览: 17
### SQL 中 `CASE WHEN THEN ELSE END` 和 `HAVING` 子句的用法
#### 使用 `CASE WHEN THEN ELSE END`
在SQL查询中,`CASE WHEN THEN ELSE END` 是一种用于实现条件逻辑的强大工具。此结构允许基于不同条件返回不同的值[^2]。
例如,在统计学生选课数量和总成绩时可以使用 `CASE WHEN THEN ELSE END` 来处理可能存在的空值情况:
```sql
SELECT
a.s_id,
a.s_name,
COUNT(b.c_id),
SUM(CASE
WHEN b.s_score IS NOT NULL THEN b.s_score
ELSE 0
END) AS total_score
FROM student AS a
LEFT JOIN score AS b ON a.s_id = b.s_id
GROUP BY a.s_id, a.s_name;
```
这段代码通过 `CASE WHEN THEN ELSE END` 结构来确保当分数为空时不计入总分计算之中[^3]。
#### 使用 `HAVING` 子句
`HAVING` 子句通常与聚合函数一起使用,用来过滤由 `GROUP BY` 创建的结果集中的记录组。它类似于 `WHERE` 子句,但是作用于已经完成分组的数据上。
考虑这样一个场景:想要找出至少选择了两门课程的学生及其平均成绩超过85分的情况,则可以在上述基础上加入 `HAVING` 进行筛选:
```sql
SELECT
a.s_id,
a.s_name,
COUNT(b.c_id) AS course_count,
AVG(CASE
WHEN b.s_score IS NOT NULL THEN b.s_score
ELSE 0
END) AS avg_score
FROM student AS a
LEFT JOIN score AS b ON a.s_id = b.s_id
GROUP BY a.s_id, a.s_name
HAVING COUNT(b.c_id) >= 2 AND AVG(CASE
WHEN b.s_score IS NOT NULL THEN b.s_score
ELSE 0
END) > 85;
```
这里不仅应用了 `CASE WHEN THEN ELSE END` 处理潜在缺失数据的问题,还利用 `HAVING` 对最终结果进行了进一步限定。
阅读全文
相关推荐


















