小白学习SQL小记1
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
解释
- select sid, group_concat(keid order by keid)as a from sc group by sid)
得到新表 t1
- select sid, group_concat(keid order by keid) as a from sc where sid=1 group by sid 得到1号同学的新表 t2
- t1 join t2 on t1.a=t2.a – 找出和1号同学一样有1,2,3的同学
- join student on student.sid=t1.sid – 对应的学生信息表中相同id的
- 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 从右表那里返回所有的行,即使在左表中没有匹配的行(右边有数据)
如有错误,请帮忙指出谢谢。