4道面试题,测测你的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行值。
文章转自公众号:openGauss