【问题标题】:Semi-join vs Subqueries半联接与子查询
【发布时间】:2019-10-11 20:58:34
【问题描述】:

半联接和子查询有什么区别?我目前正在 DataCamp 上学习这方面的课程,但我很难区分这两者。

提前致谢。

【问题讨论】:

  • 半连接是在另一个表中添加子句以限制结果的任何连接 - 半连接可以使用子查询(例如在使用存在语句时)以促进半连接.但它们实际上并不是同一类型的东西——更像是一种互补的东西。
  • 你问了很多事情。如果您不知道它们是什么,为什么要问它们之间的区别?--找出每个是什么并将它们应用于您的目标。如果你认为你知道它们是什么,为什么你不知道“区别”——这甚至意味着什么?——给出定义&你告诉我们它们的相似点和不同点是什么&请问这是否合理。无论哪种方式,都可以具体问一个关于你是如何被困在某个特定点上的问题。

标签: sql database join subquery semi-join


【解决方案1】:

只要您想根据一些常见的条件属性组合两个或多个实体记录,就需要连接或半连接。

与此不同,只要您想在同一张表或其他表上进行查找或引用,就需要子查询

简而言之,当您的要求是将其他参考列添加到现有表属性时,如果您想查找来自同一个表或其他表的记录但保留与 o/ 相同的现有列,则进行连接 else p 去子查询

此外,在半连接的情况下,它可以充当/用作子查询,因为大多数时候我们实际上并没有连接正确的表,而是我们通过子查询进行检查以限制现有半连接中的记录,但只是它不是一个子查询本身

【讨论】:

    【解决方案2】:

    我真的不认为子查询和半连接是类似的东西。子查询没有什么比在另一个查询中使用的查询更有趣的了:

    select * -- this is often called the "outer" query
    from (
       select columnA -- this is the subquery inside the parentheses
       from mytable
       where columnB = 'Y'
    )
    

    半连接是基于连接的概念。当然,连接表将组合两个表并根据连接条件返回组合的行。从那里,您可以根据进一步的 where 条件(当然还有您想做的任何其他事情)从任一表中选择您想要的列。半连接的概念是当您希望仅从第一个表中返回行,但您需要第二个表来决定要返回哪些行。示例:您想返回班级中的人:

    select p.FirstName, p.LastName, p.DOB
    from people p
    inner join classes c on c.pID = p.pID
    where c.ClassName = 'SQL 101'
    group by p.pID
    

    这就完成了半连接的概念。我们只返回第一个表(人员)中的列。使用 group by 对于半连接的概念是必要的,因为真正的连接可以从第一个表返回重复的行(取决于连接条件)。上面的例子通常不被称为半连接,也不是最典型的实现方式。以下查询是完成半联接的更常见方法:

    select FirstName, LastName, DOB
    from people 
    where pID in (select pID
                  from class
                  where ClassName = 'SQL 101'
                 )
    

    这里没有正式的加入。但是我们使用第二个表来确定要返回第一个表中的哪些行。这很像说如果我们确实将第二个表连接到第一个表,第一个表中的哪些行会匹配? 就性能而言,exists 通常是首选:

    select FirstName, LastName, DOB
    from people p
    where exists (select pID
                  from class c
                  where c.pID = p.pID
                     and c.ClassName = 'SQL 101'
                 )
    

    在我看来,这是理解半连接最直接的方式。仍然没有正式的连接,但是您可以看到连接的想法,它通过直接匹配第一个表的 pID 列与第二个表的 pID 列的用法来暗示。 最后说明。上面的最后 2 个查询每个都使用一个子查询来完成半连接的概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2012-12-12
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多