我正在做一个sql练习:
编写一条SQL语句,以显示2012-09-10日未发出并由ID为505及以下的销售员或购买金额为1000.00及以下的订单发出的订单。
好吧,当我查看我的查询与正确答案时,他们似乎在逻辑上是平行的,但我得到了错误的结果集。任何人都可以帮助我理解为什么我的查询会出错吗?
我的查询:
SELECT * FROM orders WHERE
((ord_date != '2012-09-10' AND salesman_id <= 505) OR
purch_amt <= 1000);
正确答案:
SELECT * FROM orders WHERE NOT
((ord_date = '2012-09-10' AND salesman_id > 505)
OR purch_amt > 1000.00);
首先是我的结果集的屏幕截图,然后是正确的结果集。我理解我的结果集是错误的,我只是不明白为什么我的查询会获得该信息。
答案 0 :(得分:1)
根据您的查询,
SELECT * FROM orders WHERE
((ord_date != '2012-09-10' AND salesman_id <= 505) OR
purch_amt <= 1000);
你得到ord_no 70007的行,因为purch_amount(948.5)&lt; 1000为TRUE,另一个条件为FALSE。所以TRUE或FALSE的计算结果为TRUE,并返回该行。
你得到ord_no 70009行,因为purch_amount(270.65)&lt; 1000为TRUE,另一个条件为FALSE。所以TRUE或FALSE的计算结果为TRUE,并返回该行。
根据正确答案,
SELECT * FROM orders WHERE NOT
((ord_date = '2012-09-10' AND salesman_id > 505)
OR purch_amt > 1000.00);
where
条件相当于
因(ord_date != '2012-09-10' OR salesman_id <= 505) AND purch_amt <= 1000.00
而NOT
。您可以使用上述数据验证条件。
答案也可以表示为
SELECT * FROM orders
WHERE ord_date != '2012-09-10' AND (salesman_id <= 505 OR purch_amt <= 1000.00);
答案 1 :(得分:1)
在您的查询中,与正确答案相反,NOT不包括所有条件。直到现在,似乎很明显,是的。
但结果是您返回两者:
因此,结果集不仅包括预期的(正确答案)记录,还包括仅满足两个条件之一的记录。
编辑,阅读@Philipxy的评论。
我同意这项工作的制定有些含糊不清 但我选择使用所说的&#34;正确的答案&#34;,这清楚地表明了所需要的。在此基础上,我们可以理解其他查询是如何失败的。