记录 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的每一步提升!