力扣183.从不订购的客户
本文最后更新于 137 天前。

第一种方法使用NOT IN

SELECT name Customers
FROM Customers
WHERE id NOT IN (
    SELECT DISTINCT customerId
    FROM Orders
)

第二种方法使用NOT EXISTS

SELECT name Customers
FROM Customers
WHERE NOT EXISTS(
    SELECT 1
    FROM Orders
    WHERE customerId = Customers.id
)

在SQL查询中,SELECT 1 是一种常见的写法,用于返回一个常数值而不是从表中选择实际的数据列。这通常在子查询中使用,特别是当查询的目的不是获取具体的列值,而是仅为了确定某些条件是否满足,比如是否至少有一行数据满足某个条件。

当你看到 SELECT 1,这里的 1 可以理解为一个占位符或者是一个标志,它并不一定代表数字1的实际意义。在 EXISTS 或者 NOT EXISTS 子查询中,SELECT 1 的主要目的是为了提高查询效率,因为数据库只需要确定是否存在符合条件的行,而不需要去读取和返回实际的列值。

SELECT 1 子查询的作用是检查是否存在任何行,其中 Orders 表中的 customerid 与外部查询中的 Customers 表中的 id 匹配。如果存在这样的行,EXISTS 将返回 TRUE,否则返回 FALSE。由于我们只关心是否存在匹配,而不关心具体的值,所以使用 SELECT 1 而不是选择实际的列。

使用 SELECT 1 而不是 SELECT *SELECT column_name 的另一个原因是,它避免了不必要的数据读取和传输,这可以带来性能上的提升。在大多数数据库系统中,SELECT 1 会比选择实际的列更快,因为不需要访问字典表或其他元数据来解析列的信息。

在原始查询中:

SELECT name FROM Customers
WHERE id NOT IN (SELECT DISTINCT customerid FROM Orders)

DISTINCT 关键字用于去除子查询结果中的重复值。然而,在 NOT ININ 子查询中,DISTINCT 实际上并不是必需的,因为数据库管理系统在进行比较之前通常会自动去除重复值。也就是说,即使你省略了 DISTINCT,查询也仍然可以正确运行:

SELECT name FROM Customers
WHERE id NOT IN (SELECT customerid FROM Orders)

但是,尽管这样写在语法上是正确的,且大多数情况下能得到预期的结果,还是有几点需要注意:

  1. 性能影响:如果子查询返回大量重复的 customerid,那么数据库可能需要花费更多的时间来处理这些重复值,这可能会降低查询的执行速度。
  2. NULL 值的问题:当子查询中包含 NULL 值时,情况会变得复杂。NULL 值在 INNOT IN 中的处理方式不同于其他值。如果你的子查询可能返回 NULL 值,那么 NOT IN 可能不会按预期工作,因为 NULL 与任何值都不相等,包括它自己。在这种情况下,使用 LEFT JOINNOT EXISTS 会更安全、更可靠。
  3. 数据量大的情况:在大数据集上使用 NOT IN 可能会导致性能问题,因为它可能需要创建一个临时表来存储子查询的结果,然后对每个主查询的行进行搜索。对于非常大的数据集,这可能非常慢。在这种情况下,NOT EXISTSLEFT JOIN 通常会提供更好的性能。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇