欢迎光临散文网 会员登陆 & 注册

4道面试题,测测你的SQL能力是否达标!

2022-04-20 10:54 作者:爱数据分析社区  | 我要投稿

来  源:小小的SQL学习笔记/作  者:小小


熟练SQL技能

是招聘数据分析的硬性要求


SQL面试如何考?

必考题型有哪些?
今天通过4道SQL面试题

测测你的SQL能力是否达标!


01

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

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


解题思路:

SQL子句逻辑执行顺序:From → Where  → Group by → Having → Select → Distinct → Union → Order by


02

如下为某公司8月份的员工薪资表。请根据各小题的需求,用代码实现。



问1:输出第一个名字(First_name)包含‘o’的所有雇员信息,并按薪资降序排列;


参考代码:


问2:输出总支出工资大于1500000 的部门和对应的支出,按降序排序。


参考代码:


03

题干:现数据库中有如下两张表,一张为员工信息表,一张为员工奖金表。请根据各小题的输出结果,用一句SQL语句进行查询。



问1:输出First_name中包含o的所有雇员信息,并按薪资降序排列。


输出结果如下:


解析:

本小题主要考察的是like的模糊查询,以及order by排序的用法,考核的是大家对基础知识的掌握。


参考答案:

select *
from Employee
where First_name like '%o%'
order by Salary desc;


问2:输出每月的总支出工资大于1500000的部门和对应的支出,按降序排序。


输出结果如下:


解析:

本小题主要考察的是having与where的区别及使用,having和where都是条件筛选,但是where的执行顺序是在from之后,group by之前的,而having是在这三者之后,并且是在聚合函数之后,所以本题可以直接使用having来进行条件的筛选,当然也可以使用子查询,再使用where进行条件的筛选


参考答案:

select Department as dept_name,
     sum(salary) as tatol_salary
from Employee
group by Department
having sum(salary)>1500000
order by tatol_salary desc;


04

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



解题思路


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


SELECT  user_id
       ,sum(pay_amount) pay_amount
FROM user_trade
WHERE year(dt)=2019
GROUP 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) 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;



面试SQL会有哪些题型?

第一种:构建表结构

面试官会给你一个业务场景,你认为需要建几张表,每张表的结构字段是什么,表跟表之间的关联关系是什么?

这种问题他主要考察你对于业务的理解,构建表结构的一个能力。最基本的局部建表,包括外建、主建等等。


第二种:多表联查

给你几张表,让你进行复杂查询的实现。

这个主要针对多表多列字段进行嵌套,子查询等。


第三种:窗口函数

主要有三种,聚合开窗函数、排序开窗函数、同列错位开窗函数。


  • 聚合开窗函数:

函数名如果是聚合函数,则成为聚合开窗函数

语法:聚合函数(列) over(partition by 列 order by 列)

常见的聚合函数有:sum()、count()、average()、max()、min()


  • 排序开窗函数:

row_number(行号)

rank(排名)

dense_rank(密集排名)

ntile(分组排名)


(ps:排序面试题会遇到很多,并且工作中也经常写。)


  • 同列错位开窗函数,就是移动位置这样的题目。

lag(col,n):用于统计窗口内往上第n行值。

lead(col,n):用于统计窗口内往下第n行值。


福利时间到!

  • 关注公众号【小小的SQL学习笔记】,后台回复【50】即可领取《MySQL经典50题》~

《MySQL经典50题》部分内容


- END -


4道面试题,测测你的SQL能力是否达标!的评论 (共 条)

分享到微博请遵守国家法律