13 查询和"01"号的同学学习的课程完全相同的其他同学的信息;正确解答

SQL经典50题里13题正解

学习过程中遇到难题,找答案过程中看到很多错解只把计数一样的就拿出来了。
直到看到有人说用group_concat (@k1051785839),小白第一次学到这个函数。。。恍然大悟
正确解答需用到group_concat

// select student.* from(
  select sid, group_concat(keid order by keid)as a from sc group by sid) t1
 join  (select sid, group_concat(keid order by keid) as a from sc where sid=1 group by sid)t2 on t1.a=t2.a
 join student on student.sid=t1.sid AND student.sid NOT IN (1);
 -- 也可以用 where 代替join

解释

  1. select sid, group_concat(keid order by keid)as a from sc group by sid)
    得到新表 t1
    在这里插入图片描述
  2. select sid, group_concat(keid order by keid) as a from sc where sid=1 group by sid 得到1号同学的新表 t2
    在这里插入图片描述
  3. t1 join t2 on t1.a=t2.a – 找出和1号同学一样有1,2,3的同学
  4. join student on student.sid=t1.sid – 对应的学生信息表中相同id的
  5. AND student.sid NOT IN (1) – 去掉1号同学

函数的理解解析

– concat()函数 1、功能:将多个字符串连接成一个字符串。2、语法:concat(str1, str2,…)
– group_concat:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。1 1,2,3
可以见解 更为详细https://baijiahao.baidu.com/s?id=1595349117525189591&wfr=spider&for=pc

顺便复习各种join(一直记不住搞不懂。。。。。)
– JOIN: 如果表中有至少一个匹配,则返回行(互相匹配有数据:全匹配)
– FULL JOIN,两张表的所有记录选择出来,自动把对方不存在的列填充为NULL(只要有数据就列出行)
– LEFT JOIN 从左表列出所有行,然后通过这列从右表中匹配行返回值,右表无对应则null(左边有数据)
– right join 从右表那里返回所有的行,即使在左表中没有匹配的行(右边有数据)

如有错误,请帮忙指出谢谢。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值