指定SQL查询语句的执行结果解答与实现逻辑解释
语句整体作用
这条SQL用于统计所有女性用户关联的好友关系记录总数,基于用户表和好友关系表的左连接实现,无好友的女性用户也会被纳入统计范围。
原SQL代码如下:
SELECT users.name, COUNT(*) as count FROM users LEFT JOIN friends ON users.id = friends.user1 OR users.id = friends.user2 WHERE users.sex = 'f' GROUP BY users.id, users.name;
返回结果说明
- 结果固定返回2列:
users.name:筛选出的女性用户姓名count:对应用户匹配到的好友关系记录总条数,无匹配好友记录时值为0
- 每个女性用户仅返回1条聚合后的统计结果,不会出现同一用户重复返回的情况
- 结果不会包含任何性别非
f的用户数据
执行逻辑分步说明
- 筛选基准数据集:首先从
users表中通过WHERE条件过滤出sex = 'f'的所有女性用户记录,作为左连接的左表基准,保证后续所有关联、统计操作都仅围绕女性用户展开。 - 左表关联好友表:基于
LEFT JOIN逻辑关联friends好友关系表,匹配规则为users.id = friends.user1 OR users.id = friends.user2:只要好友记录中任意一个用户位存储的是当前女性用户的id,就判定为匹配成功,将该好友记录与用户记录拼接为一行。如果当前女性用户没有匹配到任何好友记录,仍然保留该用户的单行数据,好友表对应字段填充为NULL,不会丢弃无好友的用户。这里用
OR匹配两个用户字段,是适配好友表的常见设计:双向好友关系仅存储1条记录,两个好友id分别存在user1、user2字段,不管用户出现在哪个字段位,都属于该用户的好友关系。 - 分组聚合计算:按照
users.id、users.name两个字段对连接后的全量数据做分组,其中users.id是用户表主键,能唯一标识单个用户,加入users.name是为了兼容严格SQL模式下,SELECT子句中的非聚合字段必须出现在GROUP BY子句的语法要求。分组完成后,用COUNT(*)统计每个分组内的总行数,将统计结果命名为count输出。
补充说明
如果friends表中不存在重复的好友关系记录、也不存在用户自己加自己为好友的异常数据,这里返回的count值就是对应女性用户的实际好友数;如果表内有冗余重复记录,COUNT(*)会将所有匹配到的记录全部计入统计。
内容的提问来源于stack exchange,提问作者Kalaimaran Madhavan
相关产品推荐
相关产品推荐

