在MySQL练习中使用!= on日期时获取错误的结果集

时间:2016-01-11 18:03:07

标签: mysql sql database

我正在做一个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);

首先是我的结果集的屏幕截图,然后是正确的结果集。我理解我的结果集是错误的,我只是不明白为什么我的查询会获得该信息。

This is the result I get

This is the correct result set

2 个答案:

答案 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.00NOT。您可以使用上述数据验证条件。

答案也可以表示为

SELECT * FROM orders 
WHERE ord_date != '2012-09-10' AND (salesman_id <= 505 OR purch_amt <= 1000.00);

答案 1 :(得分:1)

在您的查询中,与正确答案相反,NOT不包括所有条件。直到现在,似乎很明显,是的。

但结果是您返回两者

  • 满足第一个条件的所有记录(即使那些_not_satisfying the 2nd one)
  • 满足第二个条件的所有记录(即使那些_not_satisfying第一个条件)

因此,结果集不仅包括预期的(正确答案)记录,还包括仅满足两个条件之一的记录。

编辑,阅读@Philipxy的评论。

我同意这项工作的制定有些含糊不清 但我选择使用所说的&#34;正确的答案&#34;,这清楚地表明了所需要的。在此基础上,我们可以理解其他查询是如何失败的。