以下查询都选择posts
表和users
表中的数据。
第一个查询使用连接,第二个查询没有...我的问题是你为什么要使用JOIN?
使用JOIN查询:
SELECT u.*, p.* FROM users AS u
JOIN posts AS p ON p.user_id=u.user_id
WHERE u.user_id=1
不用查询:
SELECT u.*, p.* FROM users AS u, posts AS p
WHERE p.user_id=u.user_id
AND u.user_id=1
答案 0 :(得分:3)
第二种形式称为隐式连接。首先,大多数rdbms都认为隐式连接已被弃用。就个人而言,我真诚地怀疑任何主要的RDBMS都会在不久的将来随时放弃对它们的支持,但为什么要冒这个风险呢?
其次,显式连接具有执行外连接的标准方法。隐式连接有各种不可读的 hacks 解决方案(例如,Oracle的(+)
语法),但据我所知,没有任何标准具有合理的可移植性预期。
第三,我承认这纯粹是一种品味问题,它们看起来更好。使用显式连接允许您在逻辑上将查询中的条件分离到将所有表连接在一起所需的“脚手架”以及where
子句的实际逻辑条件。使用隐式连接,所有内容都会被集中到where
子句中,只需要三到四个表就很难管理。
答案 1 :(得分:2)
使用连接的第二个查询 。这就是逗号在users AS u, posts AS p
中的含义。这是一个隐式连接(隐式,因为虽然你没有明确使用JOIN
关键字,但你得到它的效果)也被称为CROSS JOIN
,并且意味着“左表的每一行,加入右表中的每一行“。
使用JOIN ... ON
语法(在我看来)很多更明确和可读,这在很大程度上是由于将连接条件从WHERE
子句移动到直接附加到JOIN
,并且还打开了具有不同语义的其他连接类型(LEFT JOIN
,默认值和INNER JOIN
)的语法。
答案 2 :(得分:2)
这纯粹是一种风格的选择。这两个语句将由服务器完全相同地解释。
在,
子句中使用逗号(FROM
)时,这隐式使用CROSS JOIN
。
如果WHERE clause
中有很多条件,则可以更清楚地区分用于连接表格的条件(tableA.ID = tableB.tableA_id
)与要过滤的条件。您可以通过将连接条件放在显式JOIN
旁边来实现此目的。