IN 与 JOIN 子查询的选择及隐式连接
有些时候进行子查询可以使用 IN 和 JOIN,但如果数据量比较多,不建议使用 IN。如果数据不多,可以使用 IN。
SELECT [id]
,[name]
,[type]
FROM [Demo].[dbo].[Category]
GOCode language: CSS (css)
使用 IN 的子查询方式
-- 查找 type=2 的分类下面有哪些文章
-- 如果 Category 查找出来数据不大,可以使用这个方式
-- 否则数据量多,则建议使用后面 JOIN 的方式
SELECT * FROM dbo.News
WHERE cid IN
(
-- 返回 type=2 的分类 id
SELECT id FROM [dbo].[Category]
WHERE [type] = 2
)
使用 JOIN 的方式
-- 另外一种方式
SELECT * FROM dbo.News n
JOIN dbo.Category c
ON n.cid = c.id
WHERE c.[type] = 2
隐式连接(逗号分隔)
-- 笛卡尔积
SELECT * FROM dbo.News n, dbo.Category cCode language: CSS (css)
-- 加上关联条件后结果和 JOIN 一样
SELECT * FROM dbo.News n, dbo.Category c
WHERE n.cid = c.id
建议:当子查询返回数据量较大时,
IN会导致性能下降,因为 SQL Server 会对外部表的每一行执行一次子查询匹配。此时使用JOIN可以利用索引进行集合级别的关联,效率更高。数据量小时两者差异不明显,但养成使用JOIN的习惯更有利于后续性能维护。
Previous: FOR XML PATH
Next: 字段信息