为何MySQL在无匹配数据时仍返回含NULL值的记录?
问题解释:无匹配数据时为何仍返回含NULL的记录?
问题场景
表中不存在符合B.t_id=1条件的数据,本应无返回结果,实际却返回了一条B.ts_id为NULL的记录。
表数据
tbl_food_item表:1条记录,o_id=1table_sale表:1条记录,ts_id=1,t_id=20
执行的SQL语句
SELECT A.o_id,B.ts_id,SUM(s_price) tot FROM tbl_food_item A, table_sale B WHERE A.o_id=B.ts_id AND B.t_id=1
返回结果
| o_id | ts_id | tot |
|---|---|---|
| 1 | Null | Null |
原因分析
核心问题出在**聚合函数SUM()**上:即使没有符合条件的匹配行,聚合函数会将整个空结果集视为一个分组,返回一行统计值(这里无匹配数据,SUM结果为NULL)。同时,未被聚合的字段A.o_id在MySQL默认非严格模式下,会被直接保留表中的唯一值(也就是tbl_food_item里的o_id=1),最终形成了这条看似奇怪的结果。
如果是遵循ANSI SQL标准的数据库,这种未聚合字段和聚合函数混用的写法会直接报错,但MySQL默认允许这种非标准行为,才导致了这个结果。
解决方案
要避免这种情况,有两种常用方法:
- 方法1:使用JOIN并显式分组
先通过内连接过滤出匹配行,再执行聚合,确保只有存在有效匹配时才返回结果:SELECT A.o_id,B.ts_id,SUM(s_price) tot FROM tbl_food_item A INNER JOIN table_sale B ON A.o_id=B.ts_id WHERE B.t_id=1 GROUP BY A.o_id,B.ts_id - 方法2:添加分组有效性判断
在原SQL基础上加上GROUP BY和HAVING子句,确保只有存在匹配行时才返回:SELECT A.o_id,B.ts_id,SUM(s_price) tot FROM tbl_food_item A, table_sale B WHERE A.o_id=B.ts_id AND B.t_id=1 GROUP BY A.o_id,B.ts_id HAVING COUNT(*) > 0
内容的提问来源于stack exchange,提问作者kuma DK
相关产品推荐
相关产品推荐

