这个符号(<>)对这个select语句做了什么?

时间:2017-02-26 15:55:50

标签: sql sql-server select where-clause

以下代码从数据库中检索了74,700行。

select * from Orders O
      inner join customers C
     on O.CustomerID <> c.CustomerID

带=的相同代码检索830条记录。

 select * from Orders O
      inner join customers C
     on O.CustomerID = c.CustomerID

这不等于符号对我的搜索查询做什么?外连接也有相同的区别。

谢谢。

4 个答案:

答案 0 :(得分:3)

<>是SQL中的“not-equals”运算符。

查询获取customerId列不同的所有配对或订单和客户。您真正想要的可能是没有有效客户ID的订单:

select o.*
from orders o left join
     customers c
     on o.CustomerID = c.CustomerID
where c.CustomerId is null;

(实际上,如果您设置了正确的外键关系,这似乎不太可能。)

或者更有可能是没有订单的客户:

select c.*
from customers c left join
     orders o 
     on o.CustomerID = c.CustomerID
where o.CustomerId is null;

答案 1 :(得分:0)

&LT;&GT;符号表示不等于ie)O.CustomerID 不等于 c.CustomerID或 你可以使用!=这也意味着在sql中不等于

答案 2 :(得分:0)

当值为NOT EQUAL时,不等于<>运算符返回true

代码on O.CustomerID <> c.CustomerID似乎将orders表的每一行与customers表的每一行都不相等。这是SQL小提琴中的一个例子。

http://sqlfiddle.com/#!9/e05f92/2/0

如您所见,在顶部选择(使用了=符号的那个)中,它只选择订单customerID等于Customer customerID的行

在底部选择(使用&lt;&gt;)的情况下,它会连接每个客户行,每个可能的订单行都不相等,这就是为什么你得到&lt;&gt;的结果很多的原因。查询。

答案 3 :(得分:0)

ON运营商

逻辑上,每个SQL查询都按以下顺序执行:

FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY

  

您可以从MSDN的官方文档中进一步了解这一点。 SELECT (Transact-SQL)

这意味着on谓词与表之间的基数匹配相关,而WHERE子句则过滤结果。

基数表示1:N,或与一方匹配的数量。在您的示例中,ON A.CUSTOMER_ID = B.CUSTOMER_ID将为源表

中的每个匹配集返回一行
  

LEFTRIGHT指的是源表的哪一侧。默认情况下   left被认为是源表。

因此,如果表A有3行ID = 3,那么即使表B只有一个ID为3,也会返回3行;表A中的每一行都是单独处理的。

良好的连接仅使用返回唯一连接所需的列数,因此不会返回不需要的重复值。即使你打算使用CROSS JOIN,你仍然需要确保使用独特的匹配集。

关系,联接是什么意思?

这是一个真正的问题:表格代表什么以及他们如何回答问题? 关系是指回答的价值,信息,问题或疑问。

当您知道批处理或proc的作用或脚本的用途时,识别愚蠢的查询会变得更容易。

<强>结论

  • ON ID = ID - 选择匹配的行。
  • ON ID <> ID - 返回源表中每一行的每一行 。基本上是交叉连接减去实际的连接行。

好的做法是使用ON来标识匹配的唯一行,并使用WHERE子句在源表的一侧过滤此结果。