有没有更好的方法在MySQL中编写NOT IN(子查询)内容?

有没有更好的方法在MySQL中编写NOT IN(子查询)内容?,mysql,Mysql,有没有更好的方法来写这种东西 SELECT * from table_a WHERE id NOT IN (SELECT id FROM table_b) 它显示了视图比子查询快,但它不像您可以从表a中选择*而id不在视图b中,所以我很好奇是否有更好的方法,或者这正是我们必须面对的 SELECT a.* from table_a a LEFT JOIN table_b b ON (a.id = b.id) WHERE b.id IS NULL 您还可以使用notexists(

有没有更好的方法来写这种东西

SELECT * from table_a WHERE id NOT IN (SELECT id FROM table_b)
它显示了视图比子查询快,但它不像您可以从表a中选择*而id不在视图b中,所以我很好奇是否有更好的方法,或者这正是我们必须面对的

SELECT a.* from table_a a
LEFT JOIN table_b b ON (a.id = b.id)
WHERE b.id IS NULL        
您还可以使用
notexists
(我相信它在mysql中的性能可能会稍差一些):

您还可以使用
notexists
(我相信它在mysql中的性能可能会稍差一些):

派生表:

SELECT  *
FROM    (
        SELECT  id
        FROM    table_b
        ) b
JOIN    table_a a
ON      a.id = b.id
与谓词中的
无关:

SELECT  *
FROM    table_a
WHERE   id NOT IN
        (
        SELECT  id
        FROM    table_b
        )
谓词中的
子查询从未具体化

如果在
table_b.id
上有索引,这种方法实际上是最有效的

这里还有两个:

SELECT  *
FROM    table_a a
WHERE   NOT EXISTS
        (
        SELECT  NULL 
        FROM    table_b b
        WHERE   b.id = a.id
        )

如果
table_b.id
无法编制索引(例如,它是一个派生表达式),并且
table_a.id
是唯一的,则此查询也可能是有效的:

SELECT  a.*
FROM    (
        SELECT  id, 1 AS s
        FROM    table_a
        UNION
        SELECT  id, -1 AS s
        FROM    table_b
        ) q
JOIN    table_a a
ON      a.id = q.id
GROUP BY
        a.id
HAVING  MAX(s) = 1
您可能想阅读本文:

衍生表格:

SELECT  *
FROM    (
        SELECT  id
        FROM    table_b
        ) b
JOIN    table_a a
ON      a.id = b.id
谓词中的
无关:

SELECT  *
FROM    table_a
WHERE   id NOT IN
        (
        SELECT  id
        FROM    table_b
        )
谓词中的
子查询从未具体化

如果在
table_b.id
上有索引,这种方法实际上是最有效的

这里还有两个:

SELECT  *
FROM    table_a a
WHERE   NOT EXISTS
        (
        SELECT  NULL 
        FROM    table_b b
        WHERE   b.id = a.id
        )

如果
table_b.id
无法编制索引(例如,它是一个派生表达式),并且
table_a.id
是唯一的,则此查询也可能是有效的:

SELECT  a.*
FROM    (
        SELECT  id, 1 AS s
        FROM    table_a
        UNION
        SELECT  id, -1 AS s
        FROM    table_b
        ) q
JOIN    table_a a
ON      a.id = q.id
GROUP BY
        a.id
HAVING  MAX(s) = 1
您可能想阅读本文:


如果视图返回id,您可以从表a中选择*,其中id不在视图中\u b;如果视图返回id,则您可以从表a中选择*,其中id不在视图中\u b;如果视图返回id,则效率高于
连接
?另一个sql课程。好帖子。:)比
连接更高效
?另一个sql课程。好帖子。:)