开发工具:
- mysql-8.0
- DataGrip
(1)查询每个区域的用户数
数据源:stu_table.csv
id,name,class,sex 4,张文华,二区,男 3,李思雨,一区,女 1,王小凤,一区,女 7,李智瑞,三区,男 6,徐文杰,二区,男 8,徐雨秋,三区,男 5,张青云,二区,女 9,孙皓然,三区,男 10,李春山,三区,男 2,刘诗迪,一区,女
需求:我们想知道每个区域有多少用户
解题思路:首先需要对区域进行分组,使用的是group by,然后对每个组内的用户进行计数聚合运算,使用的是count,最后运行结果如下表所示。
select class, count(id) as stu_sum from test.stu_table group by class;
运行结果:
(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;
运行结果:
(3)查询姓张的用户数
数据源:stu_table.csv
需求:我们想知道这张表中姓张的用户有多少个?
select count(id) as stu_num from test.stu_table where name like '张%';
运行结果:
(4)筛选出id3~id5的用户
数据源:stu_table.csv
需求:我们想要获取id按照从小到大的顺序排列以后id3~id5的用户的信息。
-- 4.筛选出id3~id5的用户 select * from test.stu_table order by id limit 2,3;
运行结果:
(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
需求:我们想把绩效不达标(绩效得分小于60分)的员工的信息筛选出来。
select * from test.score_table where score < 60;
运行结果:
(6)筛选出姓张的且绩效不达标的员工
数据源:score_table.csv
需求:我们现在想根据这张表筛选出姓张的且绩效不达标的员工的信息。
-- 6.筛选出姓张的且绩效不达标的员工 select * from test.score_table where score < 60 and name like '张%';
运行结果:
(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
需求:现在需要查询获得销售冠军的次数超过2次的人及其获得销售冠军的次数。
select id, name, count(month_num) as num from test.month_table group by id, name having num > 2;
运行结果:
(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
需求:现在我们想查询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;
运行结果:
(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
解题思路:我们要查询的是每个季度绩效得分都大于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;
运行结果:
(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端产品
需求:现在我们想获取该公司一级部门及二级部门的信息,即哪些一级部门下包含哪些二级部门
select t_1, t_2 from test.stu_info_table group by t_1, t_2 order by t_1;
运行结果:
(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
需求:我们需要把如上表所示的纵向存储数据的方式改成如下表所示的横向存储数据的方式。
解题思路:首先按照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;
运行结果:
(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
需求:我们需要根据这三列数据生成一列结果列,结果列的生成规则为:如果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;
运行结果:
(13)对成绩进行分组
数据源:subject_table.csv
id,score 1,56 2,91 3,67 4,54 5,56 6,69 7,61 8,83 9,99
需求:我们想知道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;
运行结果:
(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
需求:现在每天需要获取本周累计的订单数,本周累计是指本周一到获取数据当天,比如,今天是周三,那么本周累计就是周一到周三,该怎么实现呢?
解题思路:我们要获取本周累计的订单数,只需要把本周的订单明细筛选出来,然后对订单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);
运行结果:
(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;
运行结果: