JOIN-ON vs Just =在WHERE子句中

时间:2012-11-08 19:55:30

标签: sql

大多数RDBMS都支持这两种语法:

SELECT ...
FROM table1 t1 JOIN table2 t2
ON t1.jfield = t2.jfield

以及

SELECT ...
FROM table1 t1, table2 t2
WHERE t1.jfield = t2.jfield

就个人而言,我更喜欢后一版本,因为它的冗长程度较低,但它在性能和查询执行方面是否存在任何差异?我在这个论坛上看到人们发表评论说第二种风格已经过时,表现不佳。

3 个答案:

答案 0 :(得分:3)

性能没有差异。但在稳健性方面却有很多。在第二个示例中保留WHERE子句,最后使用不需要的笛卡尔积。在第一个示例中省略ON,您只是得到语法错误。这对于两个表连接可能是显而易见的,但是一旦你有10个或15个表,那么很难发现这些错误。

此外,当您开始使用外部联接时,使用LEFT OUTER JOIN将在所有DBMS中工作,而任何特定于DBMS的外部联接语法就是:DBMS特定的(例如Oracle的(+)运算符不能执行LEFT OUTER JOIN可以做的所有事情。

所以习惯使用JOIN关键字。

答案 1 :(得分:1)

看看两种表格的执行计划,你会发现它们是相同的(对于MSSQL肯定是正确的,但如果不是所有数据库,我都会吃我的帽子)因为执行计划是相同的,所以会有两种形式之间没有性能差异。

很多人(包括我在内)试图摆脱第二种形式的原因是因为:

  • 联接描述了2个表之间的关系
  • where子句在结果集上定义过滤器

这两个在功能上非常不同,使用第二种形式使得阅读和理解查询变得更加困难。

答案 2 :(得分:0)

我建议使用第一种语法。它在更新后很好地编写代码。第二种语法真的很旧,不能更喜欢这个,因为从表中和过滤数据之后加入所有结果。也许我错了,但我认为如果你有索引和PK,你可以通过连接获得更多性能,因为SQL服务器可以为这个操作提供更好的支持(例如排序,过滤,子查询......等)。 Where子句用于过滤数据的最终结果。
JOINS 是非常强大的工具,因为如果需要,您只能加入过滤后的数据,而不能加入所有表格结果。对于RAM或缓存可能更好。

1st - 您可以添加刚过滤的数据,如下面显示的语法
SELECT A., B.
FROM table_a as A
INNER JOIN table_B as B ON B.id = A.id -- join table b
AND B.name = 'bob' AND B.active = 1 -- lets filter more and return only rows for clause


- 下一个语法显示了您也可以使用的子查询,它只加入过滤行并仅返回该表的特定列
SELECT a., b., c.flag
FROM table_a as a
INNER JOIN table_B as b ON b.id = a.id -- join table b
AND b.name = 'bob' AND b.active = 1 -- lets filter more and return only rows for clause
INNER JOIN (
SELECT id, flag
FROM table_C
WHERE active = 1
) as c ON c.id = a.id


它将来简单易读,易于维护。

看看这个链接,它的代码是不是很漂亮? http://www.dpriver.com/products/sqlpp/sqlexamples4.php

在WHERE子句中有x条件... ofc你不能在这里使用agregate和子查询...我建议更多关于连接的知识,你会很高兴程序员=]
http://www.w3schools.com/sql/sql_join.asp

希望帮助

相关问题