【问题标题】:Difference between using (operator) and using (operator) ANYusing (operator) 和 using (operator) ANY 的区别
【发布时间】:2021-03-29 15:03:06
【问题描述】:

我无法区分何时只使用= 之类的运算符,何时使用= ANY。他们看起来和我很像。 例如,这里有两张表,问题是: 编写查询以显示姓名按字母顺序低于客户姓名的销售人员。 我的答案是

SELECT * FROM salesman WHERE name < (SELECT cust_name FROM customer);

但正确答案是

SELECT * FROM salesman WHERE name < ANY (SELECT cust_name FROM customer);

,意思是我错过了一个 ANY。谁能告诉我为什么我错了,什么时候使用 ANY 什么时候不使用。

【问题讨论】:

  • 您将相同的 SQL 粘贴了两次,请将表定义和数据作为文本而不是图像。

标签: sql any


【解决方案1】:
WHERE name < (SELECT cust_name FROM customer)

如果customer 中有多行,此条件将返回错误。为什么? &lt; 运算符需要一个 标量 值。可以使用子查询——但前提是它返回一列最多一行。

SQL 提供了ANYALL 来支持这种结构(以及SOME,它与ANY 相同)。正如问题所说,你想要ALL

WHERE name < ALL (SELECT cust_name FROM customer)

如果您想要一个小于最大值 cust_name 的名称,您可以使用:

WHERE name < ANY (SELECT cust_name FROM customer)

一般来说ANYALL不常用。大多数人发现聚合更容易理解:

WHERE name < (SELECT MIN(cust_name) FROM customer)
WHERE name < (SELECT MAX(cust_name) FROM customer)

customer 为空时会有细微的差别,但这并不重要(或者聚合表单符合预期)。

【讨论】:

  • 难道不是说只有子查询中的所有行都返回true才输出结果。如果使用 ALL,则不会有任何结果,因为(SELECT cust_name FROM customer) 必须返回一些按字母顺序小于name 的行。顺便说一句,谢谢你的回答,我注意到 之间的区别
  • @LightYagami 。 . .正如措辞所言,这个问题写得不好。我将其解释为“其名称的字母顺序低于盟友客户的名称”。
【解决方案2】:

在您的示例中,您没有利用 ANY / ALL 用法,因为您的子查询中没有 where 子句。

请参阅 w3school 中的示例以更好地使用 https://www.w3schools.com/sql/sql_any_all.asp

如果至少有一个子查询为真,则为真

WHERE name < ANY (SELECT cust_name FROM customer WHERE LEN(customer) > 0 )

仅当您的所有子查询都为真时才为真

WHERE name < ALL (SELECT cust_name FROM customer WHERE LEN(customer) > 0 )

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2019-08-14
    • 1970-01-01
    相关资源
    最近更新 更多