这几道SQL题能做对,你就稳了

题目解析 | 爱数据助教内容
来源 | 爱数据学院10月SQL月考题
01 第一题
写出下面语句的实际执行顺序

解题思路
SQL子句逻辑执行顺序:
From → Where → Group by → Having → Select → Distinct → Union → Order by
02 第二题
表名:student,用sql查询出“张”姓学生中平均成绩大于75分的学生信息;

解题思路

03 第三题
用一条SQL语句查询xuesheng表每门课大于80分的学生

如果不考虑少录入情况(比如张三只有2个课程,王五有3个课程)
如果考虑学生的课程数大于等于3的情况
解题思路

04 第四题
不同城市、不同性别,2019年支付金额最高的 TOP 10用户(使用user_info 用户信息表;user_order 用户订单表)

解题思路
Step1:在订单信息表中,每一个用户可以重复下单,所以在这里可以先得到每一个用户在2019年的总支付金额;

Step2:接着通过公共字段 user_id将用户订单表和用户信息表进行关联,获得包含城市、性别的宽表,然后再通过窗口函数row_number对不同城市,不同性别的用户进行排名标记;
SELECT a.user_name,
b.city,
b.sex,
a.pay_amount,
row_number() over(partition by b.city,b.sex order by a.pay_amount desc) rank
FROM(SELECT user_id
,sum(pay_amount) pay_amount
FROM user_order
WHERE year(dt)=2019
GROUP BY user_id)a
LEFT JOIN user_info b on a.user_id = b.user_id
Step3:最后通过嵌套一个子查询,使用where子句作为筛选条件,筛选出Top10的用户即可;
-- 4.每个城市、不同性别,2019年支付金额最高的TOP10用户 --
SELECT c.user_name,
c.city,
c.sex,
c.pay_amount,
c.rank
FROM(SELECT a.user_name,
b.city,
b.sex,
a.pay_amount,
row_number() over(partition by b.city,b.sex order by a.pay_amount desc) rank
FROM
(SELECT user_id
,sum(pay_amount) pay_amount
FROM user_order
WHERE year(dt)=2019
GROUP BY user_id)a
LEFT JOIN user_info b on a.user_id = b.user_id)c
WHERE c.rank<=10;
- END -
本文为爱数据学院SQL月考试题解析
版权归爱数据学院所有,转载请联系后台
