SQL中WHERE子句用OR查询时COUNT结果不符预期的原因咨询
问题原因分析
你的SQL逻辑和预期需求完全不匹配,这是结果差异的核心:
你当前执行的SQL:
SELECT COUNT(*) FROM CUSTOMERS WHERE CUSTOMERS.AGE = '22' OR CUSTOMERS.COUNTRY = 'UK';
这个语句的作用是统计所有满足「年龄为22」或者「国家为UK」的用户数量,统计范围只包含符合这两个条件之一(或同时符合)的行,结果3说明这类行共有3条。而你的预期是排除掉同时满足「年龄22且国家UK」的行之后的总用户数,这个需求对应的统计范围是整个表中,除了同时符合两个条件的行之外的所有行(包括既不满足年龄22也不满足国家UK的行),结果4说明这类行共有4条。
简单说,你写的SQL是在「挑符合条件的行统计」,但你实际想做的是「排除特定行后统计剩余所有行」,两者的统计范围完全不同,自然结果不一样。
如果你的真实需求是统计「满足年龄22或者国家UK,但不同时满足两者」的用户数,那正确的SQL应该是:
SELECT COUNT(*) FROM CUSTOMERS WHERE (CUSTOMERS.AGE = '22' OR CUSTOMERS.COUNTRY = 'UK') AND NOT (CUSTOMERS.AGE = '22' AND CUSTOMERS.COUNTRY = 'UK');
或者部分数据库支持异或运算,可以简化为:
SELECT COUNT(*) FROM CUSTOMERS WHERE CUSTOMERS.AGE = '22' XOR CUSTOMERS.COUNTRY = 'UK';
内容的提问来源于stack exchange,提问作者OLIVE99
相关产品推荐
相关产品推荐

