半联接和子查询之间有什么区别?我目前正在DataCamp上学习此课程,而我很难区分两者。
先谢谢了。
答案 0 :(得分:0)
每当您要基于某些常见的条件属性组合两个或多个实体记录时,都需要联接或半联接。
与p不同,只要要在同一表或其他表上进行查找或引用,就必须使用子查询
简而言之,当您的要求是将其他参考列添加到现有表的属性中,然后在希望对同一表或其他表中的记录进行查找但要保留与o /相同的现有列的情况下进行联接p去子查询
此外,在半连接的情况下,它可以用作/用作子查询,因为大多数情况下,我们实际上并未真正连接正确的表,而是通过子查询进行检查以限制现有的半连接中的记录,但事实并非如此子查询本身
答案 1 :(得分:-1)
我真的不认为子查询和半联接是类似的东西。子查询比在另一个查询中使用的查询更有趣:
select * -- this is often called the "outer" query
from (
select columnA -- this is the subquery inside the parentheses
from mytable
where columnB = 'Y'
)
半联接是基于联接的概念。当然,联接表将组合这两个表并根据联接条件返回合并的行。从那里,您可以根据进一步的条件在任何一个表中选择想要的列(当然还有其他您想做的事情)。半联接的概念是当您只想从第一张表中返回行 时,但是您需要第二张表来确定要返回哪些行。示例:您要返回班级中的人员:
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'
)
这里没有正式加入。但是我们使用第二个表来确定要返回第一个表中的哪些行。这很像说如果我们没有将第二个表连接到第一个表,那么第一个表中的哪些行将匹配? 为了提高性能,通常首选存在:
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个查询均使用子查询来完成半联接的概念。