为什么这些查询会返回不同的结果?

时间:2017-12-02 16:15:37

标签: mysql sql

SELECT DISTINCT productName, listPrice 
FROM product 
WHERE productID IN (SELECT productID FROM saleItem WHERE quantity = 2)
  AND productID NOT IN (SELECT productID FROM saleItem WHERE quantity <> 2)

大家好,我正在查询数据库中的课程,以便从本学期回顾教训,我有点困惑。上面的查询返回的结果数不同于下面的查询。这是一门入门级课程,我仍然无法弄清楚quantity = 2NOT in (SELECT productID FROM saleItem WHERE quantity <> 2)的区别。我正在阅读语法的方式似乎他们应该只返回2的数量。如果有人可以提供帮助,那将非常感激!如果这是一个格式不正确的问题,我道歉。

SELECT DISTINCT productName, listPrice 
FROM product 
WHERE productID IN (SELECT productID FROM saleItem WHERE quantity = 2)

4 个答案:

答案 0 :(得分:8)

考虑出现在多行saleItem中的产品ID:

  • 某些行的quantity
  • 2
  • 其他一些行的quantity2
  • 不同

如果同一saleItem有两个productId行,且这些行中至少有一行的数量不等于2,则该行productId对应的行将从第一个查询中排除。

例如,如果您的saleItem看起来像这样

saleItemId ProductId Quantity
---------- --------- --------
       100         1        2
       101         2        3
       102         2        2

然后第一个查询将排除productId=2,而第二个查询将包含它。

答案 1 :(得分:3)

  

我仍然无法弄清楚数量= 2与NOT的区别(SELECT productID FROM saleItem WHERE quantity&lt;&gt; 2)

可能是NULL值,您可以通过以下方式进行简单检查:

SELECT distinct productName, listPrice 
FROM product 
WHERE productID NOT IN (SELECT COALESCE(productID,-1) 
                        FROM saleItem 
                        WHERE quantity <> 2) --assuming that quantity is NOT NULL

答案 2 :(得分:1)

让我们假设您的表格包含以下示例数据:

<强>产品:

productID | productName | listprice
-------------------------------------
   1      |      A      |   100
-------------------------------------
   2      |      B      |   200
-------------------------------------
   3      |      C      |   300
-------------------------------------
   4      |      D      |   400

<强> saleItem:

productId | quantity
----------------------
    1     |   2
----------------------
    2     |   2
----------------------
    3     |   5
----------------------
    4     |   Null
----------------------
    1     |    3

注意:我假设quantity字段没有Not Null约束。

查询:

       SELECT  productID FROM saleItem WHERE quantity =2

<强>结果:

   productID
  -----------
       1
  -----------
       2
  -----------
       1

查询:

       SELECT distinct productID FROM saleItem WHERE quantity =2

<强>结果:

   productID
  -----------
       1
  -----------
       2

查询:

SELECT  productID FROM saleItem WHERE quantity <> 2 // <> operator won't include rows with quantity having NULL values 

<强>结果:

   productID
  ------------
       1
  -----------
       3
  -----------
       1    

查询:

SELECT  distinct productID FROM saleItem WHERE quantity <> 2 

<强>结果:

   productID
  ------------
       1
  -----------
       3

因此,查询1可以转换为:

SELECT distinct productName, listPrice 
FROM product 
WHERE productID IN (1,2,1) 
AND productID NOT in (1,3,1);

<强>结果:

    productID | productName | listprice
    -------------------------------------
       2      |      B      |   200

因此,查询1显示productID的结果,quantity只有2的一个值,即SELECT distinct productName, listPrice FROM product WHERE productID IN (1,2,1);

查询2:

    productID | productName | listprice
    -------------------------------------
       1      |      A      |   100
    -------------------------------------
       2      |      B      |   200

<强>结果:

productID

因此,Query2将返回2数量为quantity的信息,但可能也可能没有其他值quantity <> 2。{/ p>

最后注意:

1) Not IN ( quantity <> 2)不包含NULL数量的行。但quantity将包含除2以外的NULL的值,包括* 11e604e (HEAD -> master) Some comment * a50932a Another comment .... .... * 0d85332 Activities: service <-- dupes below * 5323616 Activities: setup <-- * e4f5063 Results: fix <-- * 5bf3ec0 Composer: update | * 0ac0e6b XController Setup (tag: sometag) <-- THIS BRANCH HAS NO NAME | * a34b800 | * dccbd3b | * 020b15e Activities: service <-- dupes above | * f4231cf Activities: setup <-- | * 118536f Results: fix <-- |/ * c42ad6f Some comment

希望有所帮助:

答案 3 :(得分:0)

我找不到您提供的两个查询之间的区别。但是,根据您的描述,我猜这是您的第二个查询:

SELECT distinct productName, listPrice FROM product WHERE productID NOT IN ( SELECT productID FROM saleItem WHERE quantity <>2)

也许我错过了某些东西,因为查询看起来应该向我返回相同的结果。我只能想到NULL没有值的解释,因此无法进行比较。有些记录可能有NULL作为数量值。然后这个查询: SELECT productID FROM saleItem WHERE quantity <>2不会返回这些记录。

因此在外部查询中,它选择NOT IN因此,由于具有NULL数量的记录不在内部查询中,因此您将在最终结果中使用它。

简而言之,第二个查询将包含quantity = 2和quantity = NULL的记录。