SQL如何选择表中不存在的记录?

Posted

技术标签:

【中文标题】SQL如何选择表中不存在的记录?【英文标题】:How To Select Records that Don't Exist In a Table in SQL? 【发布时间】:2017-02-05 21:25:44 【问题描述】:

我有 2 个包含以下列的 SQL 表:

用户”: 用户 ID名字姓氏

订单”: orderiduseridorderdateshippingdate

有人告诉我,我可以使用连接来实现我正在寻找的东西,但我不知道连接是如何工作的。

想法是从没有下单的“用户”中选择所有用户;用户 ID 定义的“订单”表中没有一行的用户。

这就是我目前所拥有的:

select users.userid, users.firstname, users.lastname, orders.*
from users
join orders on orders.userid = users.userid

但这只会返回 DID 下订单的用户。我将如何扩展以获取尚未下订单的用户?据我了解,加入是为了获取更多信息,而不是缺少信息。

一些信息: 我在 Windows 10 上使用最新版本的 HeidiSQL。

【问题讨论】:

left join orders on orders.userid = users.userid where orders.userid is null SQL - find records from one table which don't exist in another的可能重复 Paul,您的解决方案与 Mithilesh 的解决方案一样有效。唯一的区别是连接只给出了一堆空列。有人愿意为此使用联接有什么原因吗? 您选择了orders.*,即使您只想要没有订单的条目。 没错,但无论如何,即使orders.* 可能不存在,SQL 不会只是填补那里的空白,然后像您刚刚向我展示的查询那样将所有内容都归零吗? 【参考方案1】:

您不需要加入即可执行此操作,请执行:

select * from users where userid not in (select userid from orders)

您也可以使用 LEFT JOIN:

SELECT * FROM users
LEFT JOIN orders ON users.userid= orders.userid
WHERE orders.users IS NULL

【讨论】:

但假设我需要使用连接,那会是什么样子?它是什么类型的连接? 谢谢!我将接受作为结束问题的最佳答案。你和保罗非常有帮助! 您也可以在子查询中使用 DISTINCT,例如 (select DISTINCT userid from orders) 。所以每个用户 ID 在结果中只有一次。

以上是关于SQL如何选择表中不存在的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个表中选择另一张表中不存在的所有记录?

如何从一个表中选择另一张表中不存在的所有记录?

如何不选择其他表中不存在的行

从一个表中选择 Laravel 5.1 中另一个表中不存在的所有记录

SQL:如何定义表中不存在的额外列? [关闭]

SQLite查询选择另一个表中不存在的所有记录