为简单起见,假设所有相关字段都为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中工作方式相同吗?
SQL:2003标准更改了一些优先级规则,因此JOIN语句优先于“逗号”连接。这实际上可以改变查询的结果,这取决于它是如何设置的。当MySQL 5.0.12切换到遵循标准时,这对一些人造成了一些问题。
因此,在您的示例中,查询的工作原理是一样的。但是如果你添加第三个表:
选择……从table1, table2 JOIN table3 ON…在那里……
在MySQL 5.0.12之前,table1和table2先被连接,然后是table3。现在(5.0.12之后),table2和table3先被连接,然后是table1。它并不总是会改变结果,但它可以,而且你可能甚至没有意识到。
我不再使用“逗号”语法,选择你的第二个例子。无论如何,它都更具有可读性,JOIN条件是与JOIN一起的,而不是分离到单独的查询部分中。
SQL:2003标准更改了一些优先级规则,因此JOIN语句优先于“逗号”连接。这实际上可以改变查询的结果,这取决于它是如何设置的。当MySQL 5.0.12切换到遵循标准时,这对一些人造成了一些问题。
因此,在您的示例中,查询的工作原理是一样的。但是如果你添加第三个表:
选择……从table1, table2 JOIN table3 ON…在那里……
在MySQL 5.0.12之前,table1和table2先被连接,然后是table3。现在(5.0.12之后),table2和table3先被连接,然后是table1。它并不总是会改变结果,但它可以,而且你可能甚至没有意识到。
我不再使用“逗号”语法,选择你的第二个例子。无论如何,它都更具有可读性,JOIN条件是与JOIN一起的,而不是分离到单独的查询部分中。
INNER JOIN是你应该使用的ANSI语法。
它通常被认为更具可读性,特别是当您连接许多表时。
当需要时,还可以轻松地用OUTER JOIN替换它。
WHERE语法更面向关系模型。
两个表连接的结果是应用筛选器的表的笛卡尔积,筛选器只选择连接列匹配的行。
使用WHERE语法更容易看到这一点。
至于你的例子,在MySQL中(通常在SQL中),这两个查询是同义词。
另外,请注意MySQL也有一个STRAIGHT_JOIN子句。
使用这个子句,可以控制JOIN顺序:在外部循环中扫描哪个表,在内部循环中扫描哪个表。
在MySQL中不能使用WHERE语法来控制这一点。