在MySQL查询中,为什么要使用join而不是where?

17 浏览
0 Comments

在MySQL查询中,为什么要使用join而不是where?

似乎要合并两个或多个表,我们可以使用join或where。其中一个优势是什么?

admin 更改状态以发布 2023年5月21日
0
0 Comments

使用where语法(也称为隐式连接)存在以下问题:

首先,很容易因为联接条件不紧贴表名而出现意外的交叉联接。如果你有6个表被连接在一起,在where子句中遗漏一个很容易。你会发现这经常被使用distinct关键字修复。这是对数据库的巨大性能打击。使用显式连接语法无法出现意外的交叉联接,因为它将失败语法检查。

右连接和左连接在一些数据库中使用旧语法是有问题的(在SQL Server中无法保证得到正确的结果)。

如果您打算使用交叉连接,则在旧语法中不清楚。使用当前的ANSII标准可以清楚地表达。

使用隐式语法使维护者更难确定哪些字段属于连接,甚至哪些表以什么顺序连接在一起。这意味着修改查询可能需要更长的时间。我认识的几乎没有人,一旦他们花费时间来熟悉显式连接语法,会再回到旧的方式。

我还注意到,一些使用这些隐式连接的人实际上不了解连接的工作原理,因此在他们的查询中得到错误的结果。

老实说,您会使用18年前用更好的方法替换的任何其他代码吗?

0
0 Comments

任何涉及多个表的查询都需要一些形式的关联来将来自“A”表和“B”表的结果链接起来。传统(ANSI-89)这样做的方法是:

  1. 在FROM子句中以逗号分隔的列表中列出涉及的表
  2. 在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语法更冗长,但这正是使它明确的原因。越明确,理解和维护就越容易。

0