You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:33:17