大数据开发面试必会的SQL 30题!!!(一)

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 笔记

开发工具:

  • mysql-8.0
  • DataGrip


(1)查询每个区域的用户数


数据源:stu_table.csv

id,name,class,sex
4,张文华,二区,男
3,李思雨,一区,女
1,王小凤,一区,女
7,李智瑞,三区,男
6,徐文杰,二区,男
8,徐雨秋,三区,男
5,张青云,二区,女
9,孙皓然,三区,男
10,李春山,三区,男
2,刘诗迪,一区,女

23.png

需求:我们想知道每个区域有多少用户

解题思路:首先需要对区域进行分组,使用的是group by,然后对每个组内的用户进行计数聚合运算,使用的是count,最后运行结果如下表所示。

select
       class,
       count(id) as stu_sum
from
     test.stu_table
group by
         class;

运行结果:

24.png


(2)查询每个区域的男女用户数


数据源:stu_table.csv

需求:我们想知道每个区域内男生、女生分别有多少个。

-- 2.查询每个区域的男女用户数
-- 写法一
select class,sex,count(sex) from test.stu_table group by class,sex;
-- 写法二
select
       class ,
       count(case when sex = '男' then class end ) as '男',
       count(case when sex = '女' then class end ) as '女'
from
     test.stu_table
group by class;
-- 写法三
select
       sex ,
       count(case when class = '一区' then sex end ) as '一区',
       count(case when class = '二区' then sex end ) as '二区',
       count(case when class = '三区' then sex end ) as '三区'
from
     test.stu_table
group by sex;

运行结果:

25.png


(3)查询姓张的用户数


数据源:stu_table.csv

需求:我们想知道这张表中姓张的用户有多少个?

select
       count(id) as stu_num
from
     test.stu_table
where name like '张%';

运行结果:

26.png


(4)筛选出id3~id5的用户


数据源:stu_table.csv

需求:我们想要获取id按照从小到大的顺序排列以后id3~id5的用户的信息。

-- 4.筛选出id3~id5的用户
select * from test.stu_table order by id limit 2,3;

运行结果:

37.png


(5)筛选出绩效不达标的员工


数据源:score_table.csv

id,namr,group,score
1,王小凤,一部,88
2,刘诗迪,一部,70
3,李思雨,一部,92
4,张文华,二部,55
5,张青云,二部,77
6,徐文杰,二部,77
7,李智瑞,三部,56
8,徐雨秋,三部,91
9,孙皓然,三部,93
10,李春山,三部,57

1.png

需求:我们想把绩效不达标(绩效得分小于60分)的员工的信息筛选出来。

select * from test.score_table where score < 60;

运行结果:

2.png


(6)筛选出姓张的且绩效不达标的员工


数据源:score_table.csv

需求:我们现在想根据这张表筛选出姓张的且绩效不达标的员工的信息。

-- 6.筛选出姓张的且绩效不达标的员工
select * from test.score_table where score < 60 and name like '张%';

运行结果:

3.png


(7)查询获得销售冠军超过两次的人

数据源:month_table.csv

id,name,month_num
E002,王小凤,1
E001,张文华,2
E003,孙皓然,3
E001,张文华,4
E002,王小凤,5
E001,张文华,6
E004,李智瑞,7
E002,王小凤,8
E003,孙皓然,9

4.png

需求:现在需要查询获得销售冠军的次数超过2次的人及其获得销售冠军的次数。

select
       id,
       name,
       count(month_num) as num
from
     test.month_table
group by
         id,
         name
having
       num > 2;

运行结果:

5.png


(8)查询某部门一年的月销售额最高涨幅


数据源:sale_table.csv

year_num,month_num,sales
2019,1,2854
2019,2,4772
2019,3,3542
2019,4,1336
2019,5,3544
2018,1,2293
2018,2,2559
2018,3,2597
2018,4,2363

9.png

需求:现在我们想查询2019年的月销售额最高涨幅是多少。

select
       year_num,
       max(sales) as max_sales,
       min(sales) as min_sales,
       (max(sales) - min(sales)) as cha,
       ((max(sales) - min(sales)) / min(sales)) as growth
from
     test.sale_table
group by
         year_num;

运行结果:

10.png


(9)查询每个季度绩效得分大于70分的员工


数据源:score_info_table.csv

id,name,subject,score
1,王小凤,第一季度,88
1,王小凤,第二季度,55
1,王小凤,第三季度,72
3,徐雨秋,第一季度,92
3,徐雨秋,第二季度,77
3,徐雨秋,第三季度,93
2,张文华,第一季度,70
2,张文华,第二季度,77
2,张文华,第三季度,91

11.png

解题思路:我们要查询的是每个季度绩效得分都大于70分的员工,只要能够保证每个季度每位员工的最小绩效得分是大于70分的,就可以说明这位员工的每个季度绩效得分都大于70分。

需求:现在我们想要通过这张表查询每个季度绩效得分都大于70分的员工。

select
       id,
       name,
       min(score) as min_score
from
     test.score_info_table
group by
         id,
         name
having min_score > 70;

运行结果:

12.png


(10)删除重复值


数据源:stu_info_table.csv

id,name,t_1,t_2
1,王小凤,产品技术部,B端产品
2,刘诗迪,产品技术部,C端产品
3,李思雨,产品技术部,B端产品
5,张青云,销售运营部,数据分析
4,张文华,销售运营部,销售管理
6,徐文杰,销售运营部,销售管理
7,李智瑞,产品技术部,B端产品
8,徐雨秋,销售运营部,销售管理
9,孙皓然,产品技术部,B端产品

13.png需求:现在我们想获取该公司一级部门及二级部门的信息,即哪些一级部门下包含哪些二级部门

select 
       t_1,
       t_2 
from 
     test.stu_info_table 
group by 
         t_1, 
         t_2 
order by t_1;

运行结果:

14.png


(11)行列互换


数据源:row_col_table.csv

year_num,month_num,sales
2019,1,100
2019,2,200
2019,3,300
2019,4,400
2020,1,200
2020,2,400
2020,3,600
2020,4,800

15.png需求:我们需要把如上表所示的纵向存储数据的方式改成如下表所示的横向存储数据的方式。

解题思路:首先按照year_num分组,利用case when xxx then sales end条件控制语句,当month_num = 1时返回sales,以此类推,得到列值。

-- 11.行列互换
select * from test.row_col_table;
select year_num,
       sum(case when month_num = 1 then sales end ) as m1,
       sum(case when month_num = 2 then sales end ) as m2,
       sum(case when month_num = 3 then sales end ) as m3,
       sum(case when month_num = 4 then sales end ) as m4
from test.row_col_table group by year_num;

运行结果:

16.png


(12)多列比较


数据源:col_table.csv

col_1,col_2,col_3
5,10,7
1,10,6
9,3,5
5,2,9
10,4,3
5,2,9
5,8,6
8,8,6

17.png

需求:我们需要根据这三列数据生成一列结果列,结果列的生成规则为:如果col_1列大于col_2列,则结果为col_1列的数据;如果col_2列大于col_3列,则结果为col_3列的数据,否则结果为col_2列的数据。


解题思路:多列比较其实就是一个多重判断的过程,借助case when即可实现,先判断col_1 列和col_2列的关系,然后判断col_2列和col_3列的关系。这里需要注意的是,判断的执行顺序是先执行第一行case when,然后执行第二行case when,最后运行结果如下表所示。

select col_1,
       col_2,
       col_3,
       (case
           when col_1 > col_2 then col_1
           when col_2 > col_3 then col_3 end  ) as result_col
from
     test.col_table;

运行结果:

18.png


(13)对成绩进行分组


数据源:subject_table.csv

id,score
1,56
2,91
3,67
4,54
5,56
6,69
7,61
8,83
9,99

19.png

需求:我们想知道60分以下(不包含60分)、60~80分(不包含80分)、80~100分三个成绩段内分别有多少个学生


解题思路:写法一通过case when写法,分别求出各个分数段的个数作为列;写法二利用的是case when,完成成绩分段以后再对分段结果进行group by,接着在组内计数获得每个成绩段内的学生数


-- 写法一
select * from test.subject_table;
select
       count(case when score >= 80 then score end ) as '80~100分',
       count(case when score >= 60 and score < 80 then score end ) as '60~80分',
       count(case when score < 60 then score end ) as '60分以下'
from test.subject_table;
-- 写法二
select
       (case
    when score >= 80 then '80~100分'
    when score >= 60 and score < 80 then '60~80分'
    when score < 60 then '60分以下' end ) as score_bin ,
       count(case when score >= 80 then score
             when score >= 60 and score < 80 then score
             when score < 60 then score end) as count
from test.subject_table group by score_bin;

运行结果:

1.png


(14)周累计数据获取


数据源:order_table.csv

order_id,order_date
1,2019/1/8
2,2019/1/9
3,2019/1/10
4,2019/1/11
5,2020/1/8
6,2020/1/9
7,2020/1/10
8,2020/1/11
9,2020/1/12

2.png

需求:现在每天需要获取本周累计的订单数,本周累计是指本周一到获取数据当天,比如,今天是周三,那么本周累计就是周一到周三,该怎么实现呢?

解题思路:我们要获取本周累计的订单数,只需要把本周的订单明细筛选出来,然后对订单ID进行计数即可。

-- 14.周累计数据获取
select * from test.order_table;
-- 现在每天需要获取本周累计的订单数,本周累计是指本周一到获取数据当天,比如,今天是周三,那么本周累计就是周一到周三,该怎么实现呢?
update order_table set order_date = '2021/04/24' where order_id = 6;
update order_table set order_date = '2021/04/28' where order_id = 7;
update order_table set order_date = '2021/04/29' where order_id = 8;
update order_table set order_date = '2021/04/30' where order_id = 9;
select date_format(order_date,'%Y-%m-%d') from test.order_table;
select weekofyear(date_format(order_date,'%Y-%m-%d')) from test.order_table;
select weekofyear(current_date) as '本周';
select year(order_date) as '年' from test.order_table;
select week(order_date) as '周' from test.order_table;
select
       year(order_date) as '年',
       week(order_date) as '周',
       count(order_id)
from
     test.order_table
where
      year(order_date) = year(current_date)
  and week(order_date) = weekofyear(current_date)
group by
         year(order_date),
         week(order_date);

运行结果:

3.png


(15)周环比数据获取


数据源:order_table.csv

需求:获取当日的订单数和当日的环比订单数(即昨日的数据)

select
       count(case when date(order_date) = date (current_date) then order_id end ) as order_count,
       count(case when date_sub(date (current_date),interval 1 day ) = order_date then order_id end) as last_order_count
from
     test.order_table;

运行结果:

4.png


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
4天前
|
SQL 数据库
SQL面试50题------(初始化工作、建立表格)
这篇文章提供了SQL面试中可能会遇到的50道题目的建表和初始化数据的SQL脚本,包括学生、教师、课程和成绩表的创建及数据插入示例。
SQL面试50题------(初始化工作、建立表格)
|
4天前
|
SQL
sql面试50题------(1-10)
这篇文章提供了SQL面试中的前10个问题及其解决方案,包括查询特定条件下的学生信息、教师信息和课程成绩等。
sql面试50题------(1-10)
|
4天前
|
SQL
sql面试50题------(11-20)
这篇文章提供了SQL面试中的50道题目,其中详细解释了11至20题,包括查询与学号为“01”的学生所学课程相同的学生信息、不及格课程的学生信息、各科成绩统计以及学生的总成绩排名等问题的SQL查询语句。
|
4天前
|
SQL
sql面试50题------(21-30)
这篇文章是SQL面试题的21至30题,涵盖了查询不同老师所教课程的平均分、按分数段统计各科成绩人数、查询学生平均成绩及其名次等问题的SQL查询语句。
sql面试50题------(21-30)
|
26天前
|
JSON 数据格式 SQL
SQL开发问题之直接使用join方法在处理字符串类型属性时可能会遇到性能问题如何解决
SQL开发问题之直接使用join方法在处理字符串类型属性时可能会遇到性能问题如何解决
|
26天前
|
SQL
SQL开发问题之使用distmapjoin的问题如何解决
SQL开发问题之使用distmapjoin的问题如何解决
|
26天前
|
SQL
SQL开发问题之当从数据源读取多个字段时优化 COUNT(DISTINCT ...) 的查询的问题如何解决
SQL开发问题之当从数据源读取多个字段时优化 COUNT(DISTINCT ...) 的查询的问题如何解决
|
26天前
|
分布式计算 MaxCompute SQL
SQL开发问题之如何判断mapjoin是否生效
SQL开发问题之如何判断mapjoin是否生效
|
24天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
【7月更文挑战第26天】在 Web 开发中, SQL 注入与 XSS 攻击常令人担忧, 但掌握正确防御策略可化解风险. 对抗 SQL 注入的核心是避免直接拼接用户输入至 SQL 语句. 使用 Python 的参数化查询 (如 sqlite3 库) 和 ORM 框架 (如 Django, SQLAlchemy) 可有效防范. 防范 XSS 攻击需严格过滤及转义用户输入. 利用 Django 模板引擎自动转义功能, 或手动转义及设置内容安全策略 (CSP) 来增强防护. 掌握这些技巧, 让你在 Python Web 开发中更加安心. 安全是个持续学习的过程, 不断提升才能有效保护应用.
35 1
|
25天前
|
分布式计算 MaxCompute 计算机视觉
ODPS问题之odps.sql.mapper.split.size属性有什么作用,以及如何根据场景调整它
ODPS问题之odps.sql.mapper.split.size属性有什么作用,以及如何根据场景调整它

热门文章

最新文章