【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】

查询所用的表结构见https://blog.csdn.net/zjhbeautiful/article/details/108065336

SQL经典50题第9题正解
题目:查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息
正确解答需用到group_concat()函数,代码如下:

select
    *
from
    student
where
    sid in (
    select
        sid
    from
        sc
    group by
        sid
    having
        group_concat(cid ORDER BY cid) = (
        select 
			group_concat(cid ORDER BY cid)
        from
            sc
        where
            sid = '01')
        and sid != '01');

注: 解答此题时需要实现组内排序再拼接(group_concat方法自身可实现组内排序),不排序会导致结果出错。

比如:s_id=01同学的c_id依次是01、02、03,但是s_id=02的某位同学的c_id是01、03、02,s_id=02同学是符合条件的,但是不排序会导致检索不到,因为s_id=01同学的字符串是‘01,02,03’,而s_id=02同学的字符串是‘01,03,02’。

MySQL中 group_concat() 用法解析:

作用:将组中的字符串连接成为具有各种选项的单个字符串。

完整语法

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

示例

SELECT * FROM sc;

【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】_第1张图片
表结构与数据如上,现在的需求就是每个sid为一行,然后一行内显示该sid所有分数

接下来用group_concat !!!

select sid,group_concat(score)
from sc
GROUP BY sid;

【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】_第2张图片

可以看到结果根据id 分行,并且分数默认用逗号分割,每个id有重复数据
接下来去重

select sid,group_concat(DISTINCT score)
from sc
GROUP BY sid;

【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】_第3张图片
对内容进行排序

select sid,group_concat(DISTINCT score ORDER BY score DESC)
from sc
GROUP BY sid;

【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】_第4张图片
设置分隔符,把逗号换成分号

select sid,group_concat(DISTINCT score ORDER BY score DESC SEPARATOR ';')
from sc
GROUP BY sid;

【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】_第5张图片

你可能感兴趣的:(【SQL经典50题】9.查询和“ 01 “号的同学学习的课程完全相同的其他同学的信息【正解】)