楼主: 雨泽天成

SQL面试必会50题

[复制链接]

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-12-21 17:02:54 | 显示全部楼层
16题:检索"01"课程分数小于60,按分数降序排列的学生信息

SELECT *
FROM sc
JOIN student st
ON sc.sid = st.sid
WHERE cid = 01 AND score < 60
ORDER BY score DESC

好吧 我看错了 下面的答案不是16题的 这个不小心就容易误导人啊
回复

使用道具 举报

1

主题

3

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2022-12-21 17:03:07 | 显示全部楼层
都错了,你这个只是让选课数量相同,没有证明选课相同
回复

使用道具 举报

1

主题

12

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2022-12-21 17:03:50 | 显示全部楼层
select s_id from score where s_id != 01
group by s_id
having GROUP_CONCAT(c_id) = (select GROUP_CONCAT(c_id) from score where s_id = 01 group by s_id)
回复

使用道具 举报

2

主题

6

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2022-12-21 17:04:47 | 显示全部楼层
第十五题:
select student.s_id,student.s_name,avg(s_score) from student inner join score on student.s_id = score.s_id
where student.s_id in (
select s_id from score where s_score < 60
group by s_id
having count(c_id)>=2)
group by
student.s_id
回复

使用道具 举报

3

主题

9

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2022-12-21 17:05:27 | 显示全部楼层
补充12题:
select s_id from score
where s_id != '01'
and s_id not in (
select s_id from score where c_id not in ( select c_id from score where s_id = '01'
))
group by s_id
having count(*) = (select count(*) from score where s_id = '01')
回复

使用道具 举报

5

主题

8

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2022-12-21 17:05:35 | 显示全部楼层
19题,由于mysql 8.0才有开窗函数
以下答案基于mysql 5.7
-----------------------------------------------------------------------
select s_id,a.c_id,c_name,s_score,rank from (
select s_id,c_id,s_score,
case
        when c_id = @cid then
                if(@prevRank = s_score,@curRank,@curRank := @curRank + 1)
        else
                @curRank := 1
end as rank,
@cid := c_id,
@prevRank := s_score
from score, (select @cid:=null,@prevRank:=null,@curRank:=0) p
order by c_id,s_score desc) a left join course on a.c_id=course.c_id
-----------------------------------------------------------------------
回复

使用道具 举报

3

主题

10

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-21 17:05:41 | 显示全部楼层
第十题的INNER JOIN改成 LEFT JOIN可以解决这个问题,因为成绩表里没有这个人,INNER JOIN匹配的时候把王菊删除了
回复

使用道具 举报

4

主题

8

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-21 17:06:40 | 显示全部楼层
昨天、今天集中时间,参照答主的B站视频,完成了50题练习。很感谢。
回复

使用道具 举报

3

主题

6

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2022-12-21 17:07:39 | 显示全部楼层
41题
select b.* from
                score as b inner join
                (select s_id from Score group by s_id having sum(s_score)/count(s_score) = max(s_score)) as a on b.s_id = a.s_id
回复

使用道具 举报

4

主题

8

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2022-12-21 17:07:58 | 显示全部楼层
第7题可以改良:SELECT score.sid,student.sname from score
LEFT JOIN score as a on score.sid=a.sid
LEFT JOIN student on score.sid=student.sid
WHERE score.cid<>a.cid and score.cid='01' and a.cid='02'
GROUP BY score.sid;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表