为了加速某些查询,我将一个大表拆分为两个表(一个具有固定的行格式,另一个具有动态行格式),每个表共享相同的主键和相同的总行数但包含不同的列。
某些查询需要来自两个表的信息。要在一个查询中获取所需数据,我可以选择执行以下操作:
SELECT A.col2, B.col3 FROM A INNER JOIN B ON A.col1=B.col1 WHERE A.col1=?
SELECT A.col2, B.col3 FROM A INNER JOIN B USING (col1) WHERE A.col1=?
SELECT A.col2, B.col3 FROM A, B WHERE A.col1=? AND B.col1=?
从EXPLAIN SELECT语句中,我看不出任何差异。我想知道是否真的如此。
答案 0 :(得分:0)
前两个查询中使用的语法首先出现在ANSI SQL-92标准(text link)中:
<join specification> ::=
<join condition>
| <named columns join>
<join condition> ::= ON <search condition>
<named columns join> ::= USING <left paren> <join column list> <right paren>
基本上,USING (col1)
与ON a.col1 = b.col1
相同。
您的第三个查询,如果更新为...
SELECT A.col2, B.col3
FROM A, B
WHERE A.col1 = B.col1 AND A.col1=? AND B.col1=?
...是'old-school'JOIN的示例,因为该语法在ANSI SQL-92之前使用。
说了这么多,所有三个查询都应该被解析为等价的。