我正在尝试确定是否应该使用WHERE,或者,或者它是否重要:
FROM table1
LEFT OUTER JOIN table3
ON --------
JOIN table2
ON --------
AND -------
AND --------
AND year = ii_year
对于最后一行,我还可以使用以下内容: 在哪里年= ii_year,我得到相同的结果。 我应该使用哪个? 谢谢 我实际上有一个LEFT OUTER JOIN
答案 0 :(得分:3)
在JOIN
条件过滤之前执行的查询执行顺序WHERE
中,因此连接条件是对结果集进行某种预过滤。
对于INNER JOIN
,这没有任何区别,但OUTER
(左/右)确实存在差异。
答案 1 :(得分:1)
如果我正确理解了您的问题,AND
是WHERE
语句中的两个条件必须返回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)
例如:
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条目