SQL日常练习2-进阶篇-牛客网

Posted EbowTang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL日常练习2-进阶篇-牛客网相关的知识,希望对你有一定的参考价值。

本文章目的:

在于对SQL系统化学习后,进行:
1,日常练习,巩固基础;
2,加深对SQL知识;
3,总结SQL相关知识体系;
4,或者某有朝一日能快速捡起相关SQL知识。

5,同时结尾附带有KES数据库上的验证结果(查看和KES有撒异同)
长期更新和总结。。。。。。无截止时间

以下均是牛客网练习题-mysql数据库测试结果:

SQL18 分组计算练习题

题目:现在运营想要对每个学校不同性别的用户活跃情况和发帖数量进行分析,请分别计算出每个学校每种性别的用户数、30天内平均活跃天数和平均发帖数量。

用户信息表:user_profile

30天内活跃天数字段(active_days_within_30)

发帖数量字段(question_cnt)

回答数量字段(answer_cnt)

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214male复旦大学4.015525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321male26复旦大学3.69652

第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4在过去的30天里面活跃了7天,发帖数量为2,回答数量为12

。。。

最后一行表示:id为7的用户的常用信息为使用的设备id为4321,性别为男,年龄26岁,复旦大学,gpa为3.6在过去的30天里面活跃了9天,发帖数量为6,回答数量为52

你的查询返回结果需要对性别和学校分组,示例如下,结果保留1位小数,1位小数之后的四舍五入:

genderuniversityuser_numavg_active_dayavg_question_cnt
male北京大学17.02.0
male复旦大学212.05.5
female北京大学112.03.0
female浙江大学15.01.0
male山东大学217.511.0

解释:

第一行表示:北京大学的男性用户个数为1,平均活跃天数为7天,平均发帖量为2

。。。

最后一行表示:山东大学的男性用户个数为2,平均活跃天数为17.5天,平均发帖量为11

示例1

输入:

drop table if exists user_profile;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` float,
`question_cnt` float,
`answer_cnt` float
);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);

复制输出:

male|北京大学|1|7.0|2.0
male|复旦大学|2|12.0|5.5
female|北京大学|1|12.0|3.0
female|浙江大学|1|5.0|1.0
male|山东大学|2|17.5|11.0
问题分解:
限定条件:无;
每个学校每种性别:按学校和性别分组:group by gender, university
用户数:count(device_id)或者count(id)
30天内平均活跃天数:avg(active_days_within_30)
平均发帖数量:avg(question_cnt)
结果保留1位小数,1位小数之后的四舍五入:ROUND(ans,1)

select gender, university, 
    count(id) as user_num, 
    round(avg(active_days_within_30),1) as avg_active_day, 
    round(avg(question_cnt),1) as avg_question_cnt
from user_profile

SQL19 分组过滤练习题

题目:现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,请取出平均发贴数低于5的学校或平均回帖数小于20的学校。

示例:user_profile

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214male复旦大学4.015525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321female26复旦大学3.69652

第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4在过去的30天里面活跃了7天,发帖数量为2,回答数量为12
。。。
最后一行表示:id为7的用户的常用信息为使用的设备id为4321,性别为男,年龄26岁,复旦大学,gpa为3.6在过去的30天里面活跃了9天,发帖数量为6,回答数量为52

根据示例,你的查询应返回以下结果,请你保留3位小数(系统后台也会自动校正),3位之后四舍五入:

universityavg_question_cntavg_answer_cnt
北京大学2.500021.000
浙江大学1.0002.000

解释: 平均发贴数低于5的学校或平均回帖数小于20的学校有2个

属于北京大学的用户的平均发帖量为2.500,平均回答数量为21.000

属于浙江大学的用户的平均发帖量为1.000,平均回答数量为2.000

/*
题目:现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,
请取出平均发贴数低于5的学校或平均回帖数小于20的学校。

问题分解:
限定条件:请取出平均发贴数低于5的学校或平均回帖数小于20的学校,having avg_question_cnt < 5 or avg_answer_cnt < 20
平均发帖数量:avg(question_cnt)
平均回帖数量:avg(answer_cnt)
平均发贴数低于5的学校或平均回帖数小于20的学校:avg(question_cnt) < 5 or avg(answer_cnt) < 20
请你保留3位小数(系统后台也会自动校正),3位之后四舍五入:ROUND(ANS,3)
查看每个学校:根据每个学校分组获取结果,group by university
结果保留1位小数,1位小数之后的四舍五入:ROUND(ans,1)
*/
select university,
    ROUND(avg(question_cnt),3) as avg_question_cnt,
    ROUND(avg(answer_cnt),3) as avg_answer_cnt
from user_profile
group by university
having avg_question_cnt < 5 or avg_answer_cnt < 20

SQL20 分组排序练习题

题目:现在运营想要查看不同大学的用户平均发帖情况,并期望结果按照平均发帖情况进行升序排列,请你取出相应数据。

示例:user_profile

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214male复旦大学4.015525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321female26复旦大学3.69652

第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4在过去的30天里面活跃了7天,发帖数量为2,回答数量为12
。。。
最后一行表示:id为7的用户的常用信息为使用的设备id为4321,性别为男,年龄26岁,复旦大学,gpa为3.6在过去的30天里面活跃了9天,发帖数量为6,回答数量为52

根据示例,你的查询应返回以下结果:

universityavg_question_cnt
浙江大学1.0000
北京大学2.5000
复旦大学5.5000
山东大学11.0000
/*
题目:现在运营想要查看不同大学的用户平均发帖情况,
并期望结果按照平均发帖情况进行升序排列,请你取出相应数据。

问题分解:
不同大学:根据大学分组group by university
用户平均发帖情况:平均发帖数量:avg(question_cnt) 
并期望结果按照平均发帖情况进行升序排列:order by avg(question_cnt) 
*/
select university,avg(question_cnt) as avg_question_cnt
from user_profile
group by university
order by avg_question_cnt

SQL21 浙江大学用户题目回答情况(连接查询)

题目:现在运营想要查看所有来自浙江大学的用户题目回答明细情况,请你取出相应数据

示例 :question_practice_detail

iddevice_idquestion_idresult
12138111wrong
23214112wrong
33214113wrong
46543114right
52315115right
62315116right
72315117wrong

第一行表示:id为1的用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误

....

最后一行表示:id为7的用户的常用信息为使用的设备id为2135,在question_id为117的题目上,回答错误

示例:user_profile

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214male复旦大学4.015525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321female26复旦大学3.69652

第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4在过去的30天里面活跃了7天,发帖数量为2,回答数量为12
。。。
最后一行表示:id为7的用户的常用信息为使用的设备id为4321,性别为男,年龄26岁,复旦大学,gpa为3.6在过去的30天里面活跃了9天,发帖数量为6,回答数量为52

根据示例,你的查询应返回以下结果,查询结果根据question_id升序排序:

解释:

根据题目的数据只有1个浙江大学的用户,那么把浙江大学这个用户所有答题数据查询出来就行

示例1

输入:

drop table if exists `user_profile`;
drop table if  exists `question_practice_detail`;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int ,
`question_cnt` int ,
`answer_cnt` int 
);
CREATE TABLE `question_practice_detail` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`question_id`int NOT NULL,
`result` varchar(32) NOT NULL
);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);
INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong');
INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong');
INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong');
INSERT INTO question_practice_detail VALUES(4,6543,111,'right');
INSERT INTO question_practice_detail VALUES(5,2315,115,'right');
INSERT INTO question_practice_detail VALUES(6,2315,116,'right');
INSERT INTO question_practice_detail VALUES(7,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(8,5432,118,'wrong');
INSERT INTO question_practice_detail VALUES(9,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(10,2131,114,'right');
INSERT INTO question_practice_detail VALUES(11,5432,113,'wrong');

复制输出:

2315|115|right
2315|116|right
2315|117|wrong
/*
--题目:现在运营想要查看所有来自浙江大学的用户题目回答明细情况,请你取出相应数据
--# 连接查询
--限定条件:where question_practice_detail.device_id = user_profile.device_id and user_profile.university = '浙江大学';

*/
--连接查询
select question_practice_detail.device_id, question_id,result
from question_practice_detail,user_profile
where question_practice_detail.device_id = user_profile.device_id and user_profile.university = '浙江大学';
--内连接
SELECT question_practice_detail.device_id,question_id,result
FROM question_practice_detail
INNER JOIN user_profile
ON question_practice_detail.device_id = user_profile.device_id and user_profile.university='浙江大学';
--子查询
select device_id,question_id,result 
from question_practice_detail 
where device_id=(
     select device_id 
     from user_profile
     where university='浙江大学'
);

SQL22 统计每个学校的答过题的用户的平均答题数

运营想要了解每个学校答过题的用户平均答题数量情况,请你取出数据。

用户信息表 user_profile,其中device_id指终端编号(认为每个用户有唯一的一个终端),gender指性别,age指年龄,university指用户所在的学校,gpa是该用户平均学分绩点,active_days_within_30是30天内的活跃天数。

device_idgenderageuniversitygpaactive_days_within_30
2138male21北京大学3.47
3214maleNULL复旦大学415
6543female20北京大学3.212
2315female23浙江大学3.65
5432male25山东大学3.820
2131male28山东大学3.315
4321male28复旦大学3.69

第一行表示:用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4,在过去的30天里面活跃了7天

最后一行表示:用户的常用信息为使用的设备id为4321,性别为男,年龄28岁,复旦大学,gpa为3.6,在过去的30天里面活跃了9天

答题情况明细表 question_practice_detail,其中question_id是题目编号,result是答题结果。

device_idquestion_idresult
2138111wrong
3214112wrong
3214113wrong
6543111right
2315115right
2315116right
2315117wrong
5432118wrong
5432112wrong
2131114right
5432113wrong

第一行表示用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误

....

最后一行表示用户的常用信息为使用的设备id为5432,在question_id为113的题目上,回答错误

请你写SQL查找每个学校用户的平均答题数目(说明:某学校用户平均答题数量计算方式为该学校用户答题总次数除以答过题的不同用户个数)根据示例,你的查询应返回以下结果(结果保留4位小数),注意:结果按照university升序排序!!!

universityavg_answer_cnt
北京大学1.0000
复旦大学2.0000
山东大学2.0000
浙江大学3.0000

解释:

第一行:北京大学总共有2个用户,2138和6543,2个用户在question_practice_detail里面答了2题,平均答题数目为2/2=1.0000

....

最后一行:浙江大学总共有1个用户,2315,这个用户在question_practice_detail里面答了3题,平均答题数目为3/1=3.0000

示例1

输入:

drop table if exists `user_profile`;
drop table if  exists `question_practice_detail`;
CREATE TABLE `user_profile` (
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int
);
CREATE TABLE `question_practice_detail` (
`device_id` int NOT NULL,
`question_id`int NOT NULL,
`result` varchar(32) NOT NULL
);

INSERT INTO user_profile VALUES(2138,'male',21,'北京大学',3.4,7);
INSERT INTO user_profile VALUES(3214,'male',null,'复旦大学',4.0,15);
INSERT INTO user_profile VALUES(6543,'female',20,'北京大学',3.2,12);
INSERT INTO user_profile VALUES(2315,'female',23,'浙江大学',3.6,5);
INSERT INTO user_profile VALUES(5432,'male',25,'山东大学',3.8,20);
INSERT INTO user_profile VALUES(2131,'male',28,'山东大学',3.3,15);
INSERT INTO user_profile VALUES(4321,'male',28,'复旦大学',3.6,9);
INSERT INTO question_practice_detail VALUES(2138,111,'wrong');
INSERT INTO question_practice_detail VALUES(3214,112,'wrong');
INSERT INTO question_practice_detail VALUES(3214,113,'wrong');
INSERT INTO question_practice_detail VALUES(6543,111,'right');
INSERT INTO question_practice_detail VALUES(2315,115,'right');
INSERT INTO question_practice_detail VALUES(2315,116,'right');
INSERT INTO question_practice_detail VALUES(2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(5432,118,'wrong');
INSERT INTO question_practice_detail VALUES(5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(2131,114,'right');
INSERT INTO question_practice_detail VALUES(5432,113,'wrong');

复制输出:

北京大学|1.0000
复旦大学|2.0000
山东大学|2.0000
浙江大学|3.0000
--某学校用户平均答题数量计算方式为该学校用户答题总次数除以答过题的不同用户个数
--avg_answer_cnt=count(question_id)/count(distinct question_practice_detail.device_id)
--结果按照university升序排序:order by university
--核心就是平均答题数的定义,难受
select user_profile.university, 
    count(question_id)/count(distinct question_practice_detail.device_id) as avg_answer_cnt
from question_practice_detail inner join user_profile
on user_profile.device_id = question_practice_detail.device_id
group by university
order by university

多表连接问题

23和24问题的实验表如下,题目局见23和24处

用户信息表:user_profile

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214maleNULL复旦大学415525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321male28复旦大学3.69652

第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4,在过去的30天里面活跃了7天,发帖数量为2,回答数量为12

最后一行表示:id为7的用户的常用信息为使用的设备id为432,性别为男,年龄28岁,复旦大学,gpa为3.6,在过去的30天里面活跃了9天,发帖数量为6,回答数量为52

题库练习明细表:question_practice_detail

iddevice_idquestion_idresult
12138111wrong
23214112wrong
33214113wrong
4

6534

111right
52315115right
62315116right
72315117wrong
85432117wrong
95432112wrong
102131113right
115432113wrong
122315115right
132315116right
142315117wrong
155432117wrong
165432112wrong
172131113right
185432113wrong
192315117wrong
205432117wrong
215432112wrong
222131113right
235432113wrong


第一行表示:id为1的用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误

......

最后一行表示:id为23的用户的常用信息为使用的设备id为5432,在question_id为113的题目上,回答错误

表:question_detail

idquestion_iddifficult_level
1111hard
2112medium
3113easy
4115easy
5116medium
6117easy

第一行表示: 题目id为111的难度为hard

....

第一行表示: 题目id为117的难度为easy

SQL23 统计每个学校各难度的用户平均刷题数

请你写一个SQL查询,计算不同学校、不同难度的用户平均答题量,根据示例,你的查询应返回以下结果(结果在小数点位数保留4位,4位之后四舍五入):

universitydifficult_levelavg_answer_cnt
北京大学hard1.0000
复旦大学easy1.0000
复旦大学medium1.0000
山东大学easy4.5000
山东大学medium3.0000
浙江大学easy5.0000
浙江大学medium2.0000

解释:

第一行:北京大学有设备id为2138,6543这2个用户,这2个用户在question_practice_detail表下都只有一条答题记录,且答题题目是111,从question_detail可以知道这个题目是hard,故 北京大学的用户答题为hard的题目平均答题为2/2=1.0000

第二行,第三行:复旦大学有设备id为3214,4321这2个用户,但是在question_practice_detail表只有1个用户(device_id=3214有答题,device_id=4321没有答题,不计入后续计算)有2条答题记录,且答题题目是112,113各1个,从question_detail可以知道题目难度分别是medium和easy,故 复旦大学的用户答题为easy, medium的题目平均答题量都为1(easy=1或medium=1) /1 (device_id=3214)=1.0000

第四行,第五行:山东大学有设备id为5432和2131这2个用户,这2个用户总共在question_practice_detail表下有12条答题记录,且答题题目是112,113,117,且数目分别为3,6,3,从question_detail可以知道题目难度分别为medium,easy,easy,所以,easy共有9个,故easy的题目平均答题量= 9(easy=9)/2 (device_id=3214 or device_id=5432) =4.5000,medium共有3个,medium的答题只有device_id=5432的用户,故medium的题目平均答题量= 3(medium=9)/1 ( device_id=5432) =3.0000

.....

SQL24 统计每个用户的平均刷题数

题目:运营想要查看参加了答题的山东大学的用户在不同难度下的平均答题题目数,请取出相应数据

请你写一个SQL查询,计算山东、不同难度的用户平均答题量,根据示例,你的查询应返回以下结果(结果在小数点位数保留4位,4位之后四舍五入):

universitydifficult_levelavg_answer_cnt
山东大学easy4.5000
山东大学medium3.0000


山东大学有设备id为5432和2131这2个用户,这2个用户总共在question_practice_detail表下有12条答题记录,且答题题目是112,113,117,且数目分别为3,6,3,从question_detail可以知道题目难度分别为medium,easy,easy,所以,easy共有9个,故easy的题目平均答题量= 9(easy=9)/2 (device_id=3214 or device_id=5432) =4.5000,medium共有3个,medium的答题只有device_id=5432的用户,故medium的题目平均答题量= 3(medium=9)/1 ( device_id=5432) =3.0000

23和24题答案:

--题目:运营想要计算一些参加了答题的不同学校、不同难度的用户平均答题量,请你写SQL取出相应数据
-----左连接
select UNIVERSITY,DIFFICULT_LEVEL,ROUND(COUNT(QPD.QUESTION_ID) / COUNT(distinct QPD.DEVICE_ID), 4) as AVG_ANSWER_CNT
from QUESTION_PRACTICE_DETAIL QPD left join USER_PROFILE UP on UP.DEVICE_ID=QPD.DEVICE_ID
left join question_detail qd ON qd.question_id=qpd.question_id
group by UNIVERSITY, DIFFICULT_LEVEL;
----另一种写法,内连接
select UNIVERSITY , DIFFICULT_LEVEL , ROUND(COUNT(QPD.QUESTION_ID)/COUNT(distinct QPD.DEVICE_ID),4) AVG_ANSWER_CNT  ----根据分组计算的结果结算用户平均答题量
from USER_PROFILE UP 
inner join QUESTION_PRACTICE_DETAIL QPD on UP.DEVICE_ID = QPD.DEVICE_ID
inner join QUESTION_DETAIL QD on QPD.QUESTION_ID = QD.QUESTION_ID --三个表中查询数据
group by UNIVERSITY , DIFFICULT_LEVEL;   --计算不同学校、不同难度
-----等值连接
select UNIVERSITY , DIFFICULT_LEVEL , round(COUNT(QPD.QUESTION_ID)/COUNT(distinct QPD.DEVICE_ID),4) AVG_ANSWER_CNT  ----根据分组计算的结果结算用户平均答题量
from USER_PROFILE UP , QUESTION_PRACTICE_DETAIL QPD , QUESTION_DETAIL QD  --三个表中查询数据
where UP.DEVICE_ID = QPD.DEVICE_ID and QPD.QUESTION_ID = QD.QUESTION_ID  --建立内连接
group by UNIVERSITY , DIFFICULT_LEVEL;   --计算不同学校、不同难度
--测试
SELECT *
from USER_PROFILE UP , QUESTION_PRACTICE_DETAIL QPD, QUESTION_DETAIL QD
WHERE up.device_id = qpd.device_id AND qpd.question_id = qd.question_id;

----题目:运营想要查看参加了答题的山东大学的用户在不同难度下的平均答题题目数,请取出相应数据
select  UNIVERSITY , DIFFICULT_LEVEL , COUNT(QPD.QUESTION_ID)/COUNT(distinct QPD.DEVICE_ID) AVG_ANSWER_CNT
from USER_PROFILE UP , QUESTION_PRACTICE_DETAIL QPD , QUESTION_DETAIL QD
where UP.DEVICE_ID = QPD.DEVICE_ID and QPD.QUESTION_ID = QD.QUESTION_ID
group by UNIVERSITY,DIFFICULT_LEVEL
having UNIVERSITY='山东大学';

SQL25 查找山东大学或者性别为男生的信息

题目:现在运营想要分别查看学校为山东大学或者性别为男性的用户的device_id、gender、age和gpa数据,请取出相应结果,结果不去重。

示例:user_profile

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214male复旦大学415525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321male26复旦大学3.69652

根据示例,你的查询应返回以下结果(注意输出的顺序,先输出学校为山东大学再输出性别为男生的信息):

device_idgenderagegpa
5432male253.8
2131male283.3
2138male213.4
3214maleNone4
5432male253.8
2131male283.3
4321male283.6
select device_id , gender , age , gpa from user_profile where university = '山东大学' 
UNION ALL 
select device_id , gender , age , gpa from user_profile where gender = 'male'

SQL26 计算25岁以上和以下的用户数量

题目:现在运营想要将用户划分为25岁以下和25岁及以上两个年龄段,分别查看这两个年龄段用户数量

本题注意:age为null 也记为 25岁以下

示例:user_profile

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214male复旦大学415525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321male26复旦大学3.69652

根据示例,你的查询应返回以下结果:

age_cutnumber
25岁以下4
25岁及以上3
--打印20岁以上和20以下的表
select (case when age>=20 then '20岁及以上' else '20岁以下' end) as age_cut, 
count(student_id) as number
from student_table
group by age_cut
--另一种写法
SELECT IF(age>=20,'20岁及以上','20岁以下') AS age_cut, 
COUNT(student_id) AS number 
FROM student_table 
GROUP BY age_cut 
---另一种写法
select '20岁以下' as age_cut,count(student_id) as number
from student_table
where age<20 or age is null
union all
select '20岁及以上' as age_cut,count(student_id) as number
from student_table
where age>=20;

SQL27 查看不同年龄段的用户明细

题目:现在运营想要将用户划分为20岁以下,20-24岁,25岁及以上三个年龄段,分别查看不同年龄段用户的明细情况,请取出相应数据。(注:若年龄为空请返回其他。)

示例:user_profile

iddevice_idgenderageuniversitygpaactive_days_within_30question_cntanswer_cnt
12138male21北京大学3.47212
23214male复旦大学415525
36543female20北京大学3.212330
42315female23浙江大学3.6512
55432male25山东大学3.8201570
62131male28山东大学3.315713
74321male26复旦大学3.69652

根据示例,你的查询应返回以下结果:

device_idgenderage_cut
2138male20-24岁
3214male其他
6543female20-24岁
2315female20-24岁
5432male25岁及以上
2131male25岁及以上
4321male25岁及以上
select device_id,gender,
(case 
 when age<20 then '20岁以下' 
 when age<=24 and age >= 20 then '20-24岁'
 when age>=25 then '25岁及以上'
 else '其他' 
 end) as age_cut
from user_profile;
--为撒下面这个不对?
select device_id,gender,'其他' as age_cut
from user_profile
where age = ''
union all
select device_id,gender,'20岁以下' as age_cut
from user_profile
where age<20 or age is null
union all
select device_id,gender,'20-24岁' as age_cut
from user_profile
where age>=20 and age <=24
union all
select device_id,gender,'25岁及以上' as age_cut
from user_profile
where age>=25;

SQL28 计算用户8月每天的练题数量(日期函数的简单应用)

题目:现在运营想要计算出2021年8月每天用户练习题目的数量,请取出相应数据。

示例:question_practice_detail

iddevice_idquestion_idresultdate
12138111wrong2021-05-03
23214112wrong2021-05-09
33214113wrong2021-06-15
46543111right2021-08-13
52315115right2021-08-13
62315116right2021-08-14
72315117wrong2021-08-15
……

根据示例,你的查询应返回以下结果:

dayquestion_cnt
135
142
153
161
181
限定条件:2021年8月,写法有很多种,比如用year/month函数的year(date)=2021 and month(date)=8,比如用date_format函数的date_format(date, "%Y-%m")="202108"
每天:按天分组group by date
题目数量:count(question_id)

select day(date) as day, count(question_id) as question_cnt
from question_practice_detail
where year(date) = 2021 and month(date) = 8
group by date

SQL30 统计每种性别的人数

题目:现在运营举办了一场比赛,收到了一些参赛申请,表数据记录形式如下所示,现在运营想要统计每个性别的用户分别有多少参赛者,请取出相应结果

示例:user_submit

device_idprofileblog_url
2138180cm,75kg,27,malehttp:/url/bigboy777
3214165cm,45kg,26,femalehttp:/url/kittycc
6543178cm,65kg,25,malehttp:/url/tiger
4321171cm,55kg,23,femalehttp:/url/uhksd
2131168cm,45kg,22,femalehttp:/urlsydney

根据示例,你的查询应返回以下结果:

gendernumber
male2
female3
SELECT (   
    case
    when  profile like '%,male%' then 'male'   --%替代 0 个或多个字符,为撒非要加个,???'%male%'却无法通过
    else 
        'female'   
    end) as gender,COUNT(*) number
FROM user_submit 
GROUP BY gender;

SQL31 提取博客URL中的用户名

题目:对于申请参与比赛的用户,blog_url字段中url字符后的字符串为用户个人博客的用户名,现在运营想要把用户的个人博客用户字段提取出单独记录为一个新的字段,请取出所需数据。

示例:user_submit

device_idprofileblog_url
2138180cm,75kg,27,malehttp:/ur/bisdgboy777
3214165cm,45kg,26,femalehttp:/url/dkittycc
6543178cm,65kg,25,malehttp:/ur/tigaer
4321171 cm,55kg,23,femalehttp:/url/uhksd
2131168cm,45kg,22,femalehttp:/url/sydney

根据示例,你的查询应返回以下结果:

device_iduser_name
2138bisdgboy777
3214dkittycc
6543tigaer
4321uhsksd
2131sydney
select device_id,SUBSTRING_INDEX(blog_url,'/',-1) as user_name
from user_submit

附录:KingbaseES数据库测试验证结果:

使用例子有一点区别,相同的语句进行测试验证输出结果符合预期,和上面的例子一一对应

第18-20题的KES结果

drop table if exists user_profile;
CREATE TABLE user_profile (
id int NOT NULL,
device_id int NOT NULL,
gender varchar(14) NOT NULL,
age int ,
university varchar(32) NOT NULL,
gpa float,
active_days_within_30 float,
question_cnt float,
answer_cnt float
);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);
INSERT INTO user_profile VALUES(8,3314,'male',null,'复旦大学',3.0,85,5,25);


select * from user_profile;
/*
题目:现在运营想要对每个学校不同性别的用户活跃情况和发帖数量进行分析,
请分别计算出每个学校每种性别的用户数、30天内平均活跃天数和平均发帖数量。
用户信息表:user_profile
30天内活跃天数字段(active_days_within_30)
发帖数量字段(question_cnt)
回答数量字段(answer_cnt)

问题分解:
限定条件:无;
每个学校每种性别:按学校和性别分组:group by gender, university
用户数:count(device_id)或者count(id)
30天内平均活跃天数:avg(active_days_within_30)
平均发帖数量:avg(question_cnt)
结果保留1位小数,1位小数之后的四舍五入:ROUND(ans,1)
*/
select gender, university, 
    count(id) as user_num, 
    round(avg(active_days_within_30),1) as avg_active_day, 
    round(avg(question_cnt),1) as avg_question_cnt
from user_profile
group by gender,university

/*
题目:现在运营想查看每个学校用户的平均发贴和回帖情况,寻找低活跃度学校进行重点运营,
请取出平均发贴数低于5的学校或平均回帖数小于20的学校。

问题分解:
限定条件:请取出平均发贴数低于5的学校或平均回帖数小于20的学校,having avg_question_cnt < 5 or avg_answer_cnt < 20
平均发帖数量:avg(question_cnt)
平均回帖数量:avg(answer_cnt)
平均发贴数低于5的学校或平均回帖数小于20的学校:avg(question_cnt) < 5 or avg(answer_cnt) < 20
请你保留3位小数(系统后台也会自动校正),3位之后四舍五入:ROUND(ANS,3)
查看每个学校:根据每个学校分组获取结果,group by university
结果保留1位小数,1位小数之后的四舍五入:ROUND(ans,1)
*/
select university,
    ROUND(avg(question_cnt),3) as avg_question_cnt,
    ROUND(avg(answer_cnt),3) as avg_answer_cnt
from user_profile
group by university
having avg_question_cnt < 5 or avg_answer_cnt < 20

/*
题目:现在运营想要查看不同大学的用户平均发帖情况,
并期望结果按照平均发帖情况进行升序排列,请你取出相应数据。

问题分解:
不同大学:根据大学分组group by university
用户平均发帖情况:平均发帖数量:avg(question_cnt) 
并期望结果按照平均发帖情况进行升序排列:order by avg(question_cnt) 
*/
select university,avg(question_cnt) as avg_question_cnt
from user_profile
group by university
order by avg_question_cnt

第21题的KES结果:

drop table if exists user_profile;
drop table if  exists question_practice_detail;

CREATE TABLE user_profile (
id int NOT NULL,
device_id int NOT NULL,
gender varchar(14) NOT NULL,
age int ,
university varchar(32) NOT NULL,
gpa float,
active_days_within_30 int ,
question_cnt int ,
answer_cnt int 
);

CREATE TABLE question_practice_detail (
id int NOT NULL,
device_id int NOT NULL,
question_id int NOT NULL,
result varchar(32) NOT NULL
);

INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);

INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong');
INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong');
INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong');
INSERT INTO question_practice_detail VALUES(4,6543,111,'right');
INSERT INTO question_practice_detail VALUES(5,2315,115,'right');
INSERT INTO question_practice_detail VALUES(6,2315,116,'right');
INSERT INTO question_practice_detail VALUES(7,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(8,5432,118,'wrong');
INSERT INTO question_practice_detail VALUES(9,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(10,2131,114,'right');
INSERT INTO question_practice_detail VALUES(11,5432,113,'wrong');

--查看表数据
select * from user_profile;
select * from question_practice_detail;

/*
--题目:现在运营想要查看所有来自浙江大学的用户题目回答明细情况,请你取出相应数据
--# 连接查询
--限定条件:where question_practice_detail.device_id = user_profile.device_id and user_profile.university = '浙江大学';

*/
--连接查询
select question_practice_detail.device_id, question_id,result
from question_practice_detail,user_profile
where question_practice_detail.device_id = user_profile.device_id and user_profile.university = '浙江大学';
--内连接
SELECT question_practice_detail.device_id,question_id,result
FROM question_practice_detail
INNER JOIN user_profile
ON question_practice_detail.device_id = user_profile.device_id and user_profile.university='浙江大学';
--子查询
select device_id,question_id,result 
from question_practice_detail 
where device_id=(
     select device_id 
     from user_profile
     where university='浙江大学'
);

第22题的KES结果:

drop table if exists user_profile; --oracle没有这个语法
drop table if  exists question_practice_detail;

CREATE TABLE user_profile (
id int NOT NULL,
device_id int NOT NULL,
gender varchar(14) NOT NULL,
age int ,
university varchar(32) NOT NULL,
gpa float,
active_days_within_30 int ,
question_cnt int ,
answer_cnt int 
);

CREATE TABLE question_practice_detail (
id int NOT NULL,
device_id int NOT NULL,
question_id int NOT NULL,
result varchar(32) NOT NULL
);

INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);

INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong');
INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong');
INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong');
INSERT INTO question_practice_detail VALUES(4,6543,111,'right');
INSERT INTO question_practice_detail VALUES(5,2315,115,'right');
INSERT INTO question_practice_detail VALUES(6,2315,116,'right');
INSERT INTO question_practice_detail VALUES(7,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(8,5432,118,'wrong');
INSERT INTO question_practice_detail VALUES(9,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(10,2131,114,'right');
INSERT INTO question_practice_detail VALUES(11,5432,113,'wrong');

--查看表数据
select * from user_profile;
select * from question_practice_detail;


--某学校用户平均答题数量计算方式为该学校用户答题总次数除以答过题的不同用户个数
--avg_answer_cnt=count(question_id)/count(distinct question_practice_detail.device_id)
--结果按照university升序排序:order by university

select user_profile.university, 
    count(question_id)/count(distinct question_practice_detail.device_id) as avg_answer_cnt
from question_practice_detail inner join user_profile
on user_profile.device_id = question_practice_detail.device_id
group by university
order by university

第23和24题的KES答案

--题目:运营想要计算一些参加了答题的不同学校、不同难度的用户平均答题量,请你写SQL取出相应数据
-----左连接
select UNIVERSITY,DIFFICULT_LEVEL,ROUND(COUNT(QPD.QUESTION_ID) / COUNT(distinct QPD.DEVICE_ID), 4) as AVG_ANSWER_CNT
from QUESTION_PRACTICE_DETAIL QPD left join USER_PROFILE UP on UP.DEVICE_ID=QPD.DEVICE_ID
left join question_detail qd ON qd.question_id=qpd.question_id
group by UNIVERSITY, DIFFICULT_LEVEL;
----另一种写法,内连接
select UNIVERSITY , DIFFICULT_LEVEL , ROUND(COUNT(QPD.QUESTION_ID)/COUNT(distinct QPD.DEVICE_ID),4) AVG_ANSWER_CNT  ----根据分组计算的结果结算用户平均答题量
from USER_PROFILE UP 
inner join QUESTION_PRACTICE_DETAIL QPD on UP.DEVICE_ID = QPD.DEVICE_ID
inner join QUESTION_DETAIL QD on QPD.QUESTION_ID = QD.QUESTION_ID --三个表中查询数据
group by UNIVERSITY , DIFFICULT_LEVEL;   --计算不同学校、不同难度
-----等值连接
select UNIVERSITY , DIFFICULT_LEVEL , round(COUNT(QPD.QUESTION_ID)/COUNT(distinct QPD.DEVICE_ID),4) AVG_ANSWER_CNT  ----根据分组计算的结果结算用户平均答题量
from USER_PROFILE UP , QUESTION_PRACTICE_DETAIL QPD , QUESTION_DETAIL QD  --三个表中查询数据
where UP.DEVICE_ID = QPD.DEVICE_ID and QPD.QUESTION_ID = QD.QUESTION_ID  --建立内连接
group by UNIVERSITY , DIFFICULT_LEVEL;   --计算不同学校、不同难度
--测试
SELECT *
from USER_PROFILE UP , QUESTION_PRACTICE_DETAIL QPD, QUESTION_DETAIL QD
WHERE up.device_id = qpd.device_id AND qpd.question_id = qd.question_id;

----题目:运营想要查看参加了答题的山东大学的用户在不同难度下的平均答题题目数,请取出相应数据
select  UNIVERSITY , DIFFICULT_LEVEL , COUNT(QPD.QUESTION_ID)/COUNT(distinct QPD.DEVICE_ID) AVG_ANSWER_CNT
from USER_PROFILE UP , QUESTION_PRACTICE_DETAIL QPD , QUESTION_DETAIL QD
where UP.DEVICE_ID = QPD.DEVICE_ID and QPD.QUESTION_ID = QD.QUESTION_ID
group by UNIVERSITY,DIFFICULT_LEVEL
having UNIVERSITY='山东大学';

--------------创建实验表
drop table  user_profile;
DROP TABLE  question_practice_detail;
drop table  question_detail;
CREATE TABLE user_profile (
id int NOT NULL,
device_id int NOT NULL,
gender varchar(14) NOT NULL,
age int ,
university varchar(32) NOT NULL,
gpa float,
active_days_within_30 int ,
question_cnt int ,
answer_cnt int 
);
CREATE TABLE question_practice_detail (
id int NOT NULL,
device_id INT NOT NULL,
question_id int NOT NULL,
result varchar(32) NOT NULL
);
CREATE TABLE question_detail (
ID INT NOT NULL,
question_id int NOT NULL,
difficult_level varchar(32) NOT NULL
);

SELECT * FROM question_practice_detail; --题库练习明细表
SELECT * FROM question_detail;  --
SELECT * FROM user_profile;     --用户信息表

INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);
INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong');
INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong');
INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong');
INSERT INTO question_practice_detail VALUES(4,6543,111,'right');
INSERT INTO question_practice_detail VALUES(5,2315,115,'right');
INSERT INTO question_practice_detail VALUES(6,2315,116,'right');
INSERT INTO question_practice_detail VALUES(7,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(8,5432,117,'wrong');
INSERT INTO question_practice_detail VALUES(9,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(10,2131,113,'right');
INSERT INTO question_practice_detail VALUES(11,5432,113,'wrong');
INSERT INTO question_practice_detail VALUES(12,2315,115,'right');
INSERT INTO question_practice_detail VALUES(13,2315,116,'right');
INSERT INTO question_practice_detail VALUES(14,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(15,5432,117,'wrong');
INSERT INTO question_practice_detail VALUES(16,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(17,2131,113,'right');
INSERT INTO question_practice_detail VALUES(18,5432,113,'wrong');
INSERT INTO question_practice_detail VALUES(19,2315,117,'wrong');
INSERT INTO question_practice_detail VALUES(20,5432,117,'wrong');
INSERT INTO question_practice_detail VALUES(21,5432,112,'wrong');
INSERT INTO question_practice_detail VALUES(22,2131,113,'right');
INSERT INTO question_practice_detail VALUES(23,5432,113,'wrong');
INSERT INTO question_detail VALUES(1,111,'hard');
INSERT INTO question_detail VALUES(2,112,'medium');
INSERT INTO question_detail VALUES(3,113,'easy');
INSERT INTO question_detail VALUES(4,115,'easy');
INSERT INTO question_detail VALUES(5,116,'medium');
INSERT INTO question_detail VALUES(6,117,'easy');

第25题结果

select device_id , gender , age , gpa from user_profile where university = '山东大学' 
UNION ALL 
select device_id , gender , age , gpa from user_profile where gender = 'male'

第26题结果


-----------------------创建实验表--------------------------------
--公共语句

--打印20岁以上和20以下的表
select (case when age>=20 then '20岁及以上' else '20岁以下' end) as age_cut, 
count(student_id) as number
from student_table
group by age_cut
--另一种写法
SELECT IF(age>=20,'20岁及以上','20岁以下') AS age_cut, 
COUNT(student_id) AS number 
FROM student_table 
GROUP BY age_cut 
---另一种写法
select '20岁以下' as age_cut,count(student_id) as number
from student_table
where age<20 or age is null
union all
select '20岁及以上' as age_cut,count(student_id) as number
from student_table
where age>=20;

drop

以上是关于SQL日常练习2-进阶篇-牛客网的主要内容,如果未能解决你的问题,请参考以下文章

SQL日常练习1-基础篇-牛客网

SQL日常练习-牛客网

数据库练习题(牛客网sql入门篇部分)

牛客网专题SQL206 获取每个部门中当前员工薪水最高的相关信息

SQL练习题-牛客网

牛客网sql练习