看起来像是组合两个或多个表,我们可以使用 join 或 where 。其中一种相对于另一种有什么优势?
涉及多个表的任何查询都需要某种形式的关联来将表“A”的结果链接到表“B”。执行此操作的传统 (ANSI-89) 方法是:
- 列出 FROM 子句中逗号分隔列表中涉及的表
-
在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 语法:
- 能够控制 JOIN 顺序 - 扫描表的顺序
- 能够在加入之前在表上应用过滤条件
从维护角度来看:
使用 ANSI-92 JOIN 语法而不是 ANSI-89 的原因有很多:
- 更具可读性,因为 JOIN 标准与 WHERE 子句是分开的
- 不太可能错过 JOIN 标准
- 对除 INNER 之外的 JOIN 类型的一致语法支持,使查询易于在其他数据库上使用
- WHERE 子句仅用作连接表的笛卡尔积的过滤
从设计角度来看:
ANSI-92 JOIN 语法是模式,而不是反模式:
- 查询的目的更加明显;应用程序使用的列很清楚
- 它遵循尽可能使用严格类型的模块化规则。明确的几乎普遍更好。
结论
由于缺乏熟悉性和/或舒适性,我认为继续使用 ANSI-89 WHERE 子句而不是 ANSI-92 JOIN 语法没有任何好处。有些人可能会抱怨 ANSI-92 语法更加冗长,但这正是它变得明确的原因。越明确,越容易理解和维护。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)