为简单起见,假设所有相关字段都为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中工作方式相同吗?


当前回答

其他人指出INNER JOIN有助于人类的可读性,这是首要任务,我同意。 让我试着解释一下为什么联接语法可读性更强。

一个基本的SELECT查询如下:

SELECT stuff
FROM tables
WHERE conditions

SELECT子句告诉我们要返回什么;FROM子句告诉我们从哪里获取,where子句告诉我们从哪里获取。

JOIN是一个关于表以及它们如何绑定在一起的语句(从概念上讲,实际上是绑定到一个表中)。

控制表的任何查询元素——我们从中获取数据的地方——在语义上都属于from子句(当然,JOIN元素也在那里)。将连接元素放入WHERE子句中会合并which和WHERE -from,这就是为什么首选JOIN语法的原因。

其他回答

ANSI连接语法肯定更可移植。

我正在进行Microsoft SQL Server的升级,我还会提到,2005年SQL Server及以后的版本不支持外部连接的=*和*=语法(没有兼容模式)。

它们有不同的人类可读的含义。

但是,根据查询优化器的不同,它们对于机器可能具有相同的含义。

您应该始终使代码易于阅读。

也就是说,如果这是一个内置关系,则使用显式连接。如果匹配的是弱相关数据,则使用where子句。

一旦需要向查询中添加更多的表,隐式连接(第一个查询就是隐式连接)将变得更加混乱、难以阅读和维护。想象一下,在四五个不同的表上执行相同的查询和类型的连接……这是一场噩梦。

使用显式连接(第二个示例)可读性更强,也更容易维护。

我知道你说的是MySQL,但不管怎样: 在Oracle 9中,显式连接和隐式连接将生成不同的执行计划。AFAIK在Oracle 10+中已经解决了:不再有这样的区别了。

其他人指出INNER JOIN有助于人类的可读性,这是首要任务,我同意。 让我试着解释一下为什么联接语法可读性更强。

一个基本的SELECT查询如下:

SELECT stuff
FROM tables
WHERE conditions

SELECT子句告诉我们要返回什么;FROM子句告诉我们从哪里获取,where子句告诉我们从哪里获取。

JOIN是一个关于表以及它们如何绑定在一起的语句(从概念上讲,实际上是绑定到一个表中)。

控制表的任何查询元素——我们从中获取数据的地方——在语义上都属于from子句(当然,JOIN元素也在那里)。将连接元素放入WHERE子句中会合并which和WHERE -from,这就是为什么首选JOIN语法的原因。