【问题标题】:what does this query mean这个查询是什么意思
【发布时间】:2011-05-26 19:05:19
【问题描述】:

这个查询是什么意思

  select fname, lname  
  from Owner 
  where not exists 
      (select fname, lname 
            from Trainer)

我的理解是:它从表所有者返回 fname 和 lname,而这些名称在表训练器中不存在? 我说的对吗?

【问题讨论】:

    标签: mysql not-exists


    【解决方案1】:

    查找存在于Owner 表中但不存在于Trainer 表中的人员的姓名。

    【讨论】:

    • 这可能是一个意图,但一个健忘的查询作者没有将子选择与顶级选择联系起来。如果Trainer 为空,则查询返回来自Owner 的所有行,否则不返回任何行。
    • @9000:非常不错的收获。我不敢相信我错过了。
    • 但是当我运行查询时,虽然两个表不同,但没有显示结果
    • @Wizzy:正如@9000 所指出的,所写的查询只会在Trainer 表中没有行的情况下返回结果。 select count(*) from Trainer 返回什么?如果它返回一个 > 0 的数字,那么您问题中的查询不会返回任何结果。
    【解决方案2】:

    owner 表中获取trainer 表中不存在的每个人的列表是一种非常蹩脚的方法。

    所以,如果Owner 表包含

    ----------------
    fname   | lname
    ----------------
    clark   | kent
    lois    | lane
    peter   | parker
    

    并且 Trainer 表包含

    ----------------
    fname   | lname
    ----------------
    peter   | parker
    hal     | jordan
    

    你应该得到一个结果集:

    ----------------
    fname   | lname
    ----------------
    clark   | kent
    lois    | lane
    

    更新

    实际上,如果 Trainer 表中有任何记录,您的查询将不会返回任何内容。您可能应该使用:

    select fname, lname
    from Owners
    where not exists (
        select fname, lname 
        from trainers 
        where fname=Owners.fname 
              and lname=Owners.lname
        )
    

    【讨论】:

    • 它很蹩脚,因为它效率低下。最好用一个join来做。
    • 但是当我运行查询时,虽然两个表不同,但没有显示结果
    • 是吗?我不确定 MySQL,但 MSSQL 和 Oracle 处理得很好,通常使其比连接更有效
    • @Wizzy,请参阅最佳答案中的评论 - 它解释了为什么特定查询被破坏(这并不意味着 EXISTS 通常不能按预期工作)。
    • @Byron 当然,但这个问题太简单了,我避免混淆 OP。
    【解决方案3】:

    查询有两个部分:“选择”和“位置”。 先看where部分:

      where not exists 
          (select fname, lname from Trainer)
    

    如果 Trainer 表中没有任何内容,则此 where 子句的计算结果为“真”,如果有任何内容,则计算结果为“假”。现在看看“选择”部分:

      select fname, lname from Owners
    

    这会从“所有者”表中选择所有行。

    将这些放在一起:如果(且仅当)Trainer 表中没有任何内容,则查询从 Owner 表中选择所有行 - 如果有,则绝对没有。

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 1970-01-01
      • 2023-02-14
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多