有没有更好的方法在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课程。好帖子。:)