我总是通过join获取某些内容的结果,然后仅使用这些结果加入。
SELECT * FROM tbl AS t1
JOIN tbl2 AS t2 ON t1.id = t2.foreignId
JOIN tbl3 AS t3 ON t2.id = t3.foreignId
WHERE t1.date > SOMEDATE
根据我的理解,它将运行where语句并仅获取属于日期范围的结果。然后它将遍历所有t2并且仅尝试匹配连接到t1的id(这可能使结果更小)。然后利用这个较小的潜在结果,它将对T3做同样的事情并输出最终结果。
但它似乎不是这样有效吗?表格相乘而不是变小。显然我上面描述的更像是子查询? (注意我说LIKE。我不知道subquerys是如何工作的)
JOIN如何工作以及JOIN和子查询之间的区别是什么?
我同时使用MySql和SQLite。我不知道那是否相关。
答案 0 :(得分:1)
如果子查询中使用的表返回两次值,则JOIN也会返回匹配的行两次,而IN或EXISTS条件只返回一次。
JOIN往往具有更好的性能,但在某些情况下可能并非如此,特别是对于每个数据库(包括版本)。
参考:
答案 1 :(得分:0)
子查询示例
SELECT *
FROM (
SELECT * FROM tbl1 WHERE date > SOMEDATE
)
AS t1
JOIN tbl2 AS t2 ON t1.id = t2.foreignId
JOIN tbl3 AS t3 ON t2.id = t3.foreignId
db引擎的执行方式取决于它的优化程序。尝试在查询前放置EXPLAIN以查看数据库引擎正在执行的操作。考虑了许多变量,包括索引,表格大小等。