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

nettips
发布于 2022-5-12 17:14
浏览
0收藏

 

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月份的员工薪资表。请根据各小题的需求,用代码实现。

4道面试题,测测你的SQL能力是否达标!-鸿蒙开发者社区

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

 

参考代码:

4道面试题,测测你的SQL能力是否达标!-鸿蒙开发者社区

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

 

参考代码:

4道面试题,测测你的SQL能力是否达标!-鸿蒙开发者社区

03


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

4道面试题,测测你的SQL能力是否达标!-鸿蒙开发者社区

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

 

输出结果如下:

4道面试题,测测你的SQL能力是否达标!-鸿蒙开发者社区

解析:

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

 

参考答案:

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

 

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

 

输出结果如下:

4道面试题,测测你的SQL能力是否达标!-鸿蒙开发者社区

解析:

本小题主要考察的是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 用户订单表)。

4道面试题,测测你的SQL能力是否达标!-鸿蒙开发者社区4道面试题,测测你的SQL能力是否达标!-鸿蒙开发者社区

解题思路

 

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行值。

 

文章转自公众号:openGauss

分类
标签
已于2022-5-12 17:14:59修改
收藏
回复
举报
回复
    相关推荐