INNER JOIN ON 与 WHERE 子句的区别

17 浏览
0 Comments

INNER JOIN ON 与 WHERE 子句的区别

为简单起见,假设所有相关字段都为NOT NULL

你可以:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1, table2
WHERE
    table1.foreignkey = table2.primarykey
    AND (some other conditions)

或者:

SELECT
    table1.this, table2.that, table2.somethingelse
FROM
    table1 INNER JOIN table2
    ON table1.foreignkey = table2.primarykey
WHERE
    (some other conditions)

这两者在MySQL中的工作方式相同吗?

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

一些人指出,INNER JOIN 有助于人类的可读性,这是最优先考虑的事情,我同意。
让我尝试解释为什么连接语法更易读。

一个基本的 SELECT 查询是这样的:

SELECT stuff
FROM tables
WHERE conditions

SELECT 子句告诉我们我们得到了什么;FROM 子句告诉我们从哪里得到它,WHERE 子句告诉我们得到哪些内容。

JOIN 是关于表格的语句,它们如何被绑定在一起(概念上,实际上变成一张表格)。

任何控制表格的查询元素——我们从哪里得到的——在语义上都属于 FROM 子句(当然,这也是放置 JOIN 元素的地方)。把连接元素放入 WHERE 子句中混淆了 那些来自哪里的,这就是为什么使用 JOIN 语法。

0
0 Comments

INNER JOIN 是应该使用的 ANSI 语法。

一般来说,它被认为更易读,特别是当你连接多个表时。

当需要时,它也可以很容易地被 OUTER JOIN 替换。

WHERE 语法更注重关系模型。

两个表 JOIN 的结果是表的笛卡尔积,应用筛选器选择仅匹配连接列的行。

使用 WHERE 语法更容易理解。

至于你的例子,在 MySQL (和 SQL 一般)中,这两个查询是同义词。

此外,注意 MySQL 还有一个 STRAIGHT_JOIN 子句。

使用此子句,您可以控制 JOIN 的顺序:哪个表在外层循环中扫描,哪个表在内层循环中。

在 MySQL 中,您无法使用 WHERE 语法来控制这一点。

0