记录 SQL 语句 遇到的错误 | 行列变换
计算25岁以上和以下的用户数量
https://www.nowcoder.com/practice/30f9f470390a4a8a8dd3b8e1f8c7a9fa
找错误
先看错误代码:
select
(
case age
when age >= 25 then '25岁及以上'
else '25岁以下'
end
) as age_cut,
count(*) `number`
from
user_profile
group by
age_cut;
再看正确代码:
select
(
case
when age >= 25 then '25岁及以上'
else '25岁以下'
end
) as age_cut,
count(*) `number`
from
user_profile
group by
age_cut;
细心可以发现:第一个sql 的 case 后面跟了一个 age,这就是错误点!!!
第一个 SQL 错误原因
在 SQL 中,CASE 表达式有两种形式:简单 CASE 表达式和搜索 CASE 表达式。
- 简单
CASE表达式:格式为CASE 表达式 WHEN 值1 THEN 结果1 WHEN 值2 THEN 结果2 ... ELSE 结果N END,它会将CASE后面的表达式与每个WHEN后面的值进行精确比较。 - 搜索
CASE表达式:格式为CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 ... ELSE 结果N END,它会依次计算每个WHEN后面的条件表达式。
在第一个 SQL 里,使用了简单 CASE 表达式的语法,但 when age >= 25 并非一个具体的值,而是一个条件表达式,这就导致了语法错误,使得查询无法得到正确的结果。
第二个 SQL 正确原因
第二个 SQL 使用了搜索 CASE 表达式,WHEN age >= 25 是一个合法的条件表达式,SQL 会依次计算每个 WHEN 后面的条件,当条件为真时返回对应的结果。所以这个 SQL 语法正确,可以正常执行,它会根据 user_profile 表中用户的年龄进行分组统计,将年龄大于等于 25 岁的用户归为一组,小于 25 岁的用户归为另一组,并分别统计每组的用户数量。
SQL练练练 文章被收录于专栏
记录自己sql的每一步提升!
查看1道真题和解析