在练习我的SQL时,我注意到有关GROUP BYs的一些奇怪的事情。我正在研究一个实践问题,我们需要在社交网络中获得拥有最多朋友的用户。相当简单。
我们可以有一个嵌套的子查询来计算每个用户的朋友数量。 (这将通过GROUP BY完成)。然后将其与我们的原始用户表进行匹配。以下查询就是这样做的。
select name, grade
from (select id1 as id, count(*) as c
from friend
group by id1)
JOIN Highschooler using (id)
ORDER BY c DESC
LIMIT 10;
我不明白的是:为什么以下查询返回相同的内容?
select Highschooler.name, COUNT(*) as FriendCount
from friend
JOIN Highschooler ON (friend.ID1 = Highschooler.ID)
group by Highschooler.id
ORDER BY FriendCount DESC
LIMIT 10;
Highschooler.name有多个值,SQL只从组中选择一个?其次,上述哪两个查询是首选的?
答案 0 :(得分:0)
两个查询都将返回与您首先分组然后加入id的第一个查询相同的结果。在第二个,你首先加入,然后分组。这没什么区别。
然而,子查询是解决形式问题的逻辑上正确的方法,“从A获取事实,以B中的事实为条件”。有些查询引擎更喜欢连接,有些更喜欢子查询。根据历史记录,连接比子查询更好。
在JOIN中,RDBMS可以创建一个更适合您的查询的执行计划,并且可以预测应该加载哪些数据以进行处理并节省时间,这与子查询不同,后者将运行所有查询并将所有数据加载到做处理。
答案 1 :(得分:0)
有很多方法可以在sql中派生结果。我更喜欢join,因为这更干净,更直接,但是,会有实例需要子查询/嵌套。这是一个案例的基础。只要您获得正确的输出并且您已经逻辑地编写了查询,就应该没问题。
您还可以检查查询的执行计划,以确认哪个更优化。