INNER JOIN ON 与 WHERE 子句的区别
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日
一些人指出,INNER JOIN
有助于人类的可读性,这是最优先考虑的事情,我同意。
让我尝试解释为什么连接语法更易读。
一个基本的 SELECT
查询是这样的:
SELECT stuff FROM tables WHERE conditions
SELECT
子句告诉我们我们得到了什么;FROM
子句告诉我们从哪里得到它,WHERE
子句告诉我们得到哪些内容。
JOIN
是关于表格的语句,它们如何被绑定在一起(概念上,实际上变成一张表格)。
任何控制表格的查询元素——我们从哪里得到的——在语义上都属于 FROM
子句(当然,这也是放置 JOIN
元素的地方)。把连接元素放入 WHERE
子句中混淆了 那些 和 来自哪里的,这就是为什么使用 JOIN
语法。
INNER JOIN
是应该使用的 ANSI 语法。
一般来说,它被认为更易读,特别是当你连接多个表时。
当需要时,它也可以很容易地被 OUTER JOIN
替换。
WHERE
语法更注重关系模型。
两个表 JOIN
的结果是表的笛卡尔积,应用筛选器选择仅匹配连接列的行。
使用 WHERE
语法更容易理解。
至于你的例子,在 MySQL (和 SQL 一般)中,这两个查询是同义词。
此外,注意 MySQL 还有一个 STRAIGHT_JOIN
子句。
使用此子句,您可以控制 JOIN
的顺序:哪个表在外层循环中扫描,哪个表在内层循环中。
在 MySQL 中,您无法使用 WHERE
语法来控制这一点。