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分的学生信息;
解题思路
SELECT * from studentwhere name in (select name from studentwhere name like "张%" group by name having avg(score) > 75);
03
第三题
用一条SQL语句查询xuesheng表每门课大于80分的学生
如果不考虑少录入情况(比如张三只有2个课程,王五有3个课程)
如果考虑学生的课程数大于等于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 用户订单表)
解题思路
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月考试题解析
版权归爱数据学院所有,转载请联系后台