CS50 SQL作业:两种逻辑等价的查询为何结果不同?
两种SQL查询结果不同的原因
你的第一个查询是严格匹配题目要求的两种场景:右手击球+左手投球,或者左手击球+右手投球:
SELECT COUNT(id) FROM players WHERE (bats = 'R' AND throws = 'L') OR (bats = 'L' AND throws = 'R');
第二个查询用了不等判断,逻辑是“击球和投球习惯不同且都不为空”:
SELECT COUNT(id) FROM players WHERE throws <> bats AND throws IS NOT NULL AND bats IS NOT NULL;
核心差异点
两者逻辑不等价的原因是:bats和throws列可能存在除了'R'(右手)和'L'(左手)之外的其他取值。比如:
- 有的球员
bats值为'B'(代表左右手均可击球),throws为'R',这时候throws <> bats会判定为真,被第二个查询统计,但这类情况并不符合题目要求的统计条件。 - 同理,只要
bats或throws存在其他枚举值(比如特殊标记),只要两者不相等,都会被第二个查询计入,但这些都不在题目要求的“右手击球/左手投球,或反之”的范围内。
验证方法
你可以执行以下SQL确认是否存在这类非R/L的取值:
-- 查看bats列的非R/L取值 SELECT DISTINCT bats FROM players WHERE bats NOT IN ('R', 'L'); -- 查看throws列的非R/L取值 SELECT DISTINCT throws FROM players WHERE throws NOT IN ('R', 'L');
如果查询返回结果,就说明确实存在这类额外值,这就是结果不同的根源。
等价修正写法
如果要让第二个查询和第一个逻辑等价,需要加上取值范围限制,确保只统计R和L的组合:
SELECT COUNT(id) FROM players WHERE throws <> bats AND throws IN ('R', 'L') AND bats IN ('R', 'L');
内容的提问来源于stack exchange,提问作者Ishan Dubey
相关产品推荐
相关产品推荐

