GROUP BY如何处理不明确的列?

时间:2016-03-07 04:13:30

标签: sql

在练习我的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只从组中选择一个?其次,上述哪两个查询是首选的?

2 个答案:

答案 0 :(得分:0)

两个查询都将返回与您首先分组然后加入id的第一个查询相同的结果。在第二个,你首先加入,然后分组。这没什么区别。

然而,子查询是解决形式问题的逻辑上正确的方法,“从A获取事实,以B中的事实为条件”。有些查询引擎更喜欢连接,有些更喜欢子查询。根据历史记录,连接比子查询更好。

在JOIN中,RDBMS可以创建一个更适合您的查询的执行计划,并且可以预测应该加载哪些数据以进行处理并节省时间,这与子查询不同,后者将运行所有查询并将所有数据加载到做处理。

答案 1 :(得分:0)

有很多方法可以在sql中派生结果。我更喜欢join,因为这更干净,更直接,但是,会有实例需要子查询/嵌套。这是一个案例的基础。只要您获得正确的输出并且您已经逻辑地编写了查询,就应该没问题。

您还可以检查查询的执行计划,以确认哪个更优化。