为简单起见,假设所有相关字段都是NOT NULL.
你可以做:
SELECT
table1.this, table2.that, table2.somethingelse
FROM
table1, table2
WHERE
table1.foreignkey = table2.primarykey
AND (some other conditions)
Run Code Online (Sandbox Code Playgroud)
要不然:
SELECT
table1.this, table2.that, table2.somethingelse
FROM
table1 INNER JOIN table2
ON table1.foreignkey = table2.primarykey
WHERE
(some other conditions)
Run Code Online (Sandbox Code Playgroud)
这两个是以同样的方式工作MySQL吗?
比较这两个查询.将过滤器放在连接条件或are子句中是否更快.我一直认为它在连接标准上更快,因为它在最快的时刻减少了结果集,但我不确定.
我将构建一些测试来查看,但我也希望得到关于哪个更清晰易读的意见.
查询1
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
INNER JOIN TableB b
ON x.TableBID = b.ID
WHERE a.ID = 1 /* <-- Filter here? */
Run Code Online (Sandbox Code Playgroud)
查询2
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
AND a.ID = 1 /* <-- Or filter here? */
INNER JOIN TableB b
ON x.TableBID = b.ID
Run Code Online (Sandbox Code Playgroud)
编辑
我运行了一些测试,结果显示它实际上非常接近,但该WHERE条款实际上稍快一点!=)
我绝对同意在WHERE条款上应用过滤器更有意义,我只是对性能影响感到好奇.
已确认的时间标准: 143016 ms
已安排时间加入标准: 143256 ms
测试
SET …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行左连接,以便从左表中获取所有行,即使这些行的连接条件不成立。
示例:下面的 Aid = Bid 但表 B 只有 3 个 id
我正在使用的查询仅给出连接条件为真的行。即使连接条件不成立,有没有办法从左表中获取所有行?
我的查询:
SELECT Table1.Aid,
Table2.Bid,
Table2.Issueid
FROM Table1
LEFT JOIN Table2 ON Table1.Aid = Table2.Bid;
WHERE Table2.Issueid IN (
'a',
'b'
)
Run Code Online (Sandbox Code Playgroud)