半连接和子查询有什么区别?我目前正在 DataCamp 上学习这方面的课程,我很难区分这两者。
提前致谢。
每当您想要基于一些常见的条件属性组合两个或多个实体记录时,都需要连接或半连接。
不同的是,只要您想在同一个表或其他表上进行查找或引用,就需要子查询
简而言之,当您的要求是将其他参考列添加到现有表属性时,如果您想查找来自同一个表或其他表的记录但保留与 o/p 相同的现有列,则进行连接。子查询
此外,在半连接的情况下,它可以充当/用作子查询,因为大多数时候我们实际上并没有连接正确的表,而是通过子查询进行检查以限制现有半连接中的记录,但只是它不是子查询本身
我真的不认为子查询和半连接是类似的。子查询没有什么比在另一个查询中使用的查询更有趣的了:
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 列的用法。 最后注。上面的最后两个查询每个都使用一个子查询来完成半连接的概念。