头歌实验MySQL数据库 - 复杂查询(一)

目录

第1关:交换工资

第2关:换座位

第3关:分数排名

第4关:体育馆的人流量

第5关:统计总成绩


第1关:交换工资

任务描述
本关任务:给定一张 tb_Salary 表,如下所示,有 m = 男性 和 f = 女性的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然)。

id    name    sex    salary
1    Elon    f    7000
2    Donny    f    8000
3    Carey    m    6000
4    Karin    f    9000
5    Larisa    m    5500
6    Sora    m    500
要求只使用一句更新update语句,且不允许含有任何select语句完成任务。


#请在此添加实现代码
########## Begin ##########
UPDATE tb_Salary
SET sex = CASE sex
    WHEN 'f' THEN 'm'
    WHEN 'm' THEN 'f'
    ELSE sex
END;

########## End ##########

第2关:换座位

任务描述
本关任务:改变相邻俩学生的座位。

小美是一所中学的信息科技老师,她有一张 tb_Seat座位表,平时用来储存学生名字和与他们相对应的座位 id。

tb_Seat表结构数据如下:

id    name
1    Elon
2    Donny
3    Carey
4    Karin
5    Larisa
现在小美想改变相邻俩学生的座位(若学生人数为奇数,则无需改变最后一位同学的座位),现在需要你编写SQL输出小美想要的的结果。

#请在此添加实现代码
########## Begin ##########
SELECT 
    CASE 
        WHEN id % 2 = 1 AND id < (SELECT MAX(id) FROM tb_Seat) THEN id + 1
        WHEN id % 2 = 0 THEN id - 1
        ELSE id
    END AS id,
    name
FROM tb_Seat
ORDER BY id;

########## End ##########

第3关:分数排名

如果两个分数相同,则两个分数排名(Rank)相同。

情况一:平分后的下一个名次是下一个连续的整数值。换句话说,名次之间不应该有“间隔”。例:1、1、2、3、4、4。

情况二:排名是非连续的。例:1、1、1、4、4、6。


#请在此添加实现代码

########## Begin ##########

SELECT  a.Score, 
    COUNT(DISTINCT b.Score) + 1 AS Rank
FROM score a
LEFT JOIN score b ON b.Score > a.Score
GROUP BY a.id,a.Score
ORDER BY a.Score DESC;

SELECT  a.Score, 
    COUNT(b.Score) + 1 AS Rank
FROM score a
LEFT JOIN score b ON b.Score > a.Score
GROUP BY  a.id,a.Score
ORDER BY a.Score DESC;

########## End ##########

第4关:体育馆的人流量

请编写一个查询语句,找出人流量处于高峰的记录 id、日期 date 和人流量 visitors_flow,其中高峰定义为前后连续三天人流量均不少于 100。

#请在此添加实现代码

########## Begin ##########

SELECT DISTINCT t1.*
FROM gymnasium t1,gymnasium t2,gymnasium t3
WHERE t1.visitors_flow >= 100 AND t2.visitors_flow >= 100 AND t3.visitors_flow >= 100
AND
(
  (t1.id=t2.id-1 AND t2.id=t3.id-1)
  OR
  (t1.id=t2.id+1 AND t1.id=t3.id-1)
  OR
  (t1.id=t2.id+1 AND t2.id=t3.id+1)
)
ORDER BY id;


########## End ##########

第5关:统计总成绩

本关任务:计算每个班的语文总成绩和数学总成绩,其中低于 60 分的成绩不记入总成绩。

#请在此添加实现代码
########## Begin ##########

SELECT c.classname, 
SUM(CASE WHEN s.chinese >= 60 THEN s.chinese ELSE 0 END) AS chinese,
SUM(CASE WHEN s.maths >= 60 THEN s.maths ELSE 0 END) AS maths
FROM tb_class c
JOIN tb_score s ON c.stuname = s.name
GROUP BY c.classname;

########## End ##########

你可能感兴趣的:(mysql头歌实训,sql,数据库)