在哪里与AND

时间:2012-03-27 19:19:16

标签: sql

我正在尝试确定是否应该使用WHERE,或者,或者它是否重要:

FROM table1

LEFT OUTER JOIN table3
ON --------

JOIN table2 
ON --------
AND -------
AND --------
AND year = ii_year

对于最后一行,我还可以使用以下内容:     在哪里年= ii_year,我得到相同的结果。 我应该使用哪个? 谢谢 我实际上有一个LEFT OUTER JOIN

8 个答案:

答案 0 :(得分:3)

JOIN条件过滤之前执行的查询执行顺序WHERE中,因此连接条件是对结果集进行某种预过滤。

对于INNER JOIN,这没有任何区别,但OUTER(左/右)确实存在差异。

答案 1 :(得分:1)

如果我正确理解了您的问题,ANDWHERE语句中的两个条件必须返回true才有效的逻辑运算符。这是正确的语法:

SELECT column
FROM table
JOIN othertable ON ...
WHERE (column > 10) AND (column2 < 1)

答案 2 :(得分:1)

你问是否应该写这样的查询:

SELECT
FROM table1, table2
WHERE table1.year = table2.year;

对战:

SELECT
FROM table1 JOIN table2 ON table1.year = table2.year;

从逻辑上讲,没有区别。大多数解析器/查询引擎会将它们视为相同。我使用的经验法则是:

  • 如果正在使用比较条件以关联两个实体,请将其放在JOIN子句中
  • 如果比较用于过滤结果集,请将其放在WHERE子句中

我发现这两条规则使查询的目的更加清晰。在您的具体示例中,我需要更多信息来确定它属于哪个类别。

答案 3 :(得分:1)

(假设MySQL有这个答案)。

如果它是INNER JOIN,就像您的示例一样,它没有任何区别。但是如果您使用LEFT OUTER JOIN并将条件放在WHERE子句中,它将表现得像INNER JOIN

答案 4 :(得分:1)

使用WHERE,保存ON关键字以加入表格。它的可读性更高,在使用OUTER JOIN ...

时不会给您带来不良后果

答案 5 :(得分:1)

从概念上讲,区别在于ON子句表示与两个表相关的条件(例如ON table2.table1id = table1.id AND table2.is_active = 'Y'),而WHERE子句表示确定实际需要哪些行的条件(例如WHERE table1.name LIKE 'Foo %' AND table1.type = 3)。

但是,正如您所观察到的那样,当您使用INNER JOIN时,这种差异无效;如果您有LEFT OUTER JOIN或whatnot(ON子句中的失败条件意味着您省略table2中的数据,而WHERE中的条件失败,则它仅影响查询结果1}}子句意味着您从结果集中过滤掉整行。

因此,当您使用INNER JOIN时,您只需要决定哪种方式更直观地考虑某种情况。并不总是有一个“正确”的答案。

答案 6 :(得分:0)

我个人会为最后一个使用WHERE子句。然后,您使用ANDs表示加入表格的字段,使用WHERE进行过滤。

SELECT *
FROM table1 t1
  JOIN table2 t2
    ON t1.field1 = t2.field1
   AND t1.field2 = t2.field2
   AND t1.field3 = t2.field3
WHERE year = ii_year

答案 7 :(得分:0)

乍一看,它们看起来很相似,但事实并非如此。加入多个条件可能会导致与加入和过滤(where语句)不同的数据集。

例如:

SELECT * FROM customer
JOIN order ON customer.id = order.customerid
WHERE customer.id = 10

将返回客户ID 10的所有订单

SELECT * FROM customer
JOIN order ON customer.id = order.customerid AND order.id = 10

将返回所有客户,但仅加入客户10的订单详细信息,其余将为空白(取决于使用的加入方法)

如果您正在使用INNER JOIN,那么您可以使用其中一个,SQL优化器将更改查询以获得最佳执行计划。

如果您正在使用OUTER JOIN,则返回的数据集将包含所有客户,除了id = 10之外的每个客户都将具有NULL条目