【MySQL】避免空集的二义性时,处理sql语句的输出语义

为什么要转化?

  • MySQL 的聚合函数也处理了可能存在的二义性
    avg()sum() 是允许出现null值的,为什么这么设计?
    当待统计的字段全为NULL,返回值为NULL
    当待统计的字段全为0,返回值为0
    当待统计的字段有非NULL值 ,返回值忽略NULL的行进行统计,返回值为非NULL的数字
    此时NULL代表无法统计(unknow) 0, 代表统计值为0

  • 当空集具有二义性时,如没有找到找到了但是数值为0。如何处理?
    如何解决 —— 允许返回值存在NULL 如:[1],[2],[3],[0],[null]
    这组记录。0代表找到了但是数值为0null 代表没有找到
    此时空集代表 null,不再具有二义性。

LeetCode题目

在这里插入图片描述

CASE WHEN 对结果集处理

 select 
 (case 
 when count(a.num) = 0 then null 
 else a.num
 end) as num
  from 
  (select num from MyNumbers group by num having count(num) = 1 order by num desc limit 1) a;

聚合函数对结果集处理

count(num) 的返回值为0,其余为null

SELECT MAX(num) AS 'num'
FROM 
    (
        SELECT num
        FROM mynumbers
        GROUP BY num
        HAVING COUNT(num) = 1
    ) AS tmp

ifnull()对结果集处理

SELECT 
    IFNULL(
        (SELECT 
            num 
        FROM
            my_numbers 
        GROUP BY num 
        HAVING COUNT(*) = 1 
        ORDER BY num DESC 
        LIMIT 1),
        NULL
    ) AS num ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值