MySQL 中有关 NULL

java 复制代码
@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long id;
    private Long score;
}
    @Autowired
    private UserRepository userRepository;
    @PostConstruct
    public void init() {
        userRepository.save(new User());
    }
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query(nativeQuery=true,value = "SELECT SUM(score) FROM `user`")
    Long wrong1();
    @Query(nativeQuery = true, value = "SELECT COUNT(score) FROM `user`")
    Long wrong2();
    @Query(nativeQuery = true, value = "SELECT * FROM `user` WHERE score=null")
    List<User> wrong3();
}

显然,这三条 SQL 语句的执行结果和我们的期望不同:虽然记录的 score 都是 NULL,但 sum 的结果应该是 0 才对;虽然这条记录的 score 是 NULL,但记录 总数应该是 1 才对;使用 =NULL 并没有查询到 id=1 的记录,查询条件失效。

原因是:MySQL 中 sum 函数没统计到任何记录时,会返回 null 而不是 0,可以使用 IFNULL 函数把 null 转换为 0;MySQL 中 count 字段不统计 null 值, COUNT(*) 才是统计所有记录数量的正确方式。MySQL 中使用诸如 =、、> 这样的算数比较操作符比较 NULL 的结果总是 NULL,这种比较就显得没有任何意 义,需要使用 IS NULL、IS NOT NULL 或 ISNULL() 函数来比较。

java 复制代码
@Query(nativeQuery = true, value = "SELECT IFNULL(SUM(score),0) FROM `user`")
Long right1();
@Query(nativeQuery = true, value = "SELECT COUNT(*) FROM `user`")
Long right2();
@Query(nativeQuery = true, value = "SELECT * FROM `user` WHERE score IS NULL")
List<User> right3();
相关推荐
骆晨学长14 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
@月落20 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
楠枬30 分钟前
MySQL数据的增删改查(一)
数据库·mysql
goTsHgo35 分钟前
从底层原理上解释 clickhouse 保证完全的幂等性
数据库·clickhouse
阿华的代码王国2 小时前
MySQL ------- 索引(B树B+树)
数据库·mysql
Hello.Reader3 小时前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯3 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
liupenglove3 小时前
golang操作mysql利器-gorm
mysql·golang
yanglamei19623 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
叫我:松哥3 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap