sql查询top10_这几道SQL题能做对,你就稳了

fddaea5758914dfd06ef01fcc41cec76.gif

题目解析 | 爱数据助教内容来源 | 爱数据学院10月SQL月考题

01

第一题

写出下面语句的实际执行顺序

① SELECT [DISTINCT] 
② FROM
③ WHERE
④ GROUP BY
⑤ HAVING
⑥ UNION
⑦ ORDER BY

解题思路

SQL子句逻辑执行顺序:

From → Where  → Group by → Having → Select → Distinct → Union → Order by

02

第二题

表名:student,用sql查询出“张”姓学生中平均成绩大于75分的学生信息;

       f313391032ddd52984c84e847cdd6118.png

解题思路

SELECT * from studentwhere name in (select name from studentwhere name like "张%" group by name having avg(score) > 75);

03

第三题

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

       c922501d06c0cc01409db37d6ad9077b.png     

  1. 如果不考虑少录入情况(比如张三只有2个课程,王五有3个课程)

  2. 如果考虑学生的课程数大于等于3的情况

解题思路

--(1)如果不考虑少录入情况(比如张三只有2个课程,王五有3个课程)SELECT nameFROM xueshengGROUP BY nameHAVING MIN(score) > 80--(2)如果考虑学生的课程数大于等于3的情况SELECT nameFROM xueshengGROUP BY nameHAVING MIN(score) > 80AND COUNT(kecheng) >= 3

04

第四题

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

      56be50f022b2c17d3f058f9402b3d93c.png           f43683aaf0f46936df037eb61fcde81b.png

解题思路

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

SELECT  user_id
       ,sum(pay_amount) pay_amountFROM user_tradeWHERE year(dt)=2019GROUP BY user_id

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) rankFROM(SELECT  user_id
             ,sum(pay_amount) pay_amountFROM user_order   WHERE year(dt)=2019GROUP BY user_id)aLEFT 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.rankFROM(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) rankFROM
      (SELECT  user_id
               ,sum(pay_amount) pay_amountFROM user_order   WHERE year(dt)=2019GROUP BY user_id)aLEFT JOIN user_info b on a.user_id = b.user_id)cWHERE c.rank<=10;

往期面试题

7月月考:

超经典SQL题 | 做完这4道面试题你就过关了

8月月考:

手撕SQL | 必知必会5道SQL面试题

9月月考:

4道常见的SQL试题,你能答对多少?

END -

本文为爱数据学院SQL月考试题解析

版权归爱数据学院所有,转载请联系后台

f07b029d4cae3834160b832c2d40d9b2.png

0d13fb4fb1308e6747052d728620433a.gif

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值