似乎要合并两个或多个表,我们可以使用join或where。一个相对于另一个的优点是什么?
似乎要合并两个或多个表,我们可以使用join或where。一个相对于另一个的优点是什么?
Answers:
任何涉及多个表的查询都需要某种形式的关联,以将结果从表“ A”链接到表“ B”。传统的(ANSI-89)方法是:
在WHERE子句中编写表之间的关联
SELECT *
FROM TABLE_A a,
TABLE_B b
WHERE a.id = b.id
这是使用ANSI-92 JOIN语法重写的查询:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
在受支持的地方(Oracle 9i +,PostgreSQL 7.2 +,MySQL 3.23 +,SQL Server 2000+),使用任何一种语法都不会对其他语法产生性能上的好处。优化器将它们视为相同的查询。但是更复杂的查询可以从使用ANSI-92语法中受益:
在ANSI-89上使用ANSI-92 JOIN语法的原因有很多:
ANSI-92 JOIN语法是模式,而不是反模式:
缺乏熟悉性和/或舒适性,我认为继续使用ANSI-89 WHERE子句代替ANSI-92 JOIN语法没有任何好处。有人可能会抱怨ANSI-92语法更冗长,但这正是它的明确之处。越明确,就越容易理解和维护。
这些是使用where语法(否则称为隐式联接)的问题:
首先,由于表名称旁边的联接条件并不正确,因此很容易发生意外的交叉联接。如果将6个表连接在一起,则很容易在where子句中遗漏一个表。通过使用distinct关键字,您会经常看到此修复程序。这对于数据库而言是巨大的性能损失。使用显式联接语法不会导致意外的交叉联接,因为它将无法通过语法检查。
右联接和左联接在某些数据库中的旧语法中存在问题(在SQl服务器中,不能保证您会获得正确的结果)。此外,我知道它们在SQL Server中已弃用。
如果您打算使用交叉联接,那么从旧语法来看并不清楚。使用当前的ANSII标准很明显。
对于维护人员而言,使用隐式语法很难确切地看到哪些字段是连接的一部分,甚至是哪些表以什么顺序连接在一起。这意味着修改查询可能需要更多时间。我认识的人很少,一旦他们花时间对显式联接语法感到满意,便回到了旧方法。
我还注意到,一些使用这些隐式联接的人实际上并不了解联接的工作原理,因此在查询中得到错误的结果。
老实说,您会使用18年前被更好的方法取代的任何其他类型的代码吗?
显式联接传达意图,留下where子句进行过滤。它更清洁并且是标准配置,您可以执行仅在何处难以执行的操作,例如左外部或右外部。