in 和 Join

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:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注