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)
id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
1 | 2138 | male | 21 | 北京大学 | 3.4 | 7 | 2 | 12 |
2 | 3214 | male | 复旦大学 | 4.0 | 15 | 5 | 25 | |
3 | 6543 | female | 20 | 北京大学 | 3.2 | 12 | 3 | 30 |
4 | 2315 | female | 23 | 浙江大学 | 3.6 | 5 | 1 | 2 |
5 | 5432 | male | 25 | 山东大学 | 3.8 | 20 | 15 | 70 |
6 | 2131 | male | 28 | 山东大学 | 3.3 | 15 | 7 | 13 |
7 | 4321 | male | 26 | 复旦大学 | 3.6 | 9 | 6 | 52 |
第一行表示: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位小数之后的四舍五入:
gender | university | user_num | avg_active_day | avg_question_cnt |
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 |
解释:
第一行表示:北京大学的男性用户个数为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
id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
1 | 2138 | male | 21 | 北京大学 | 3.4 | 7 | 2 | 12 |
2 | 3214 | male | 复旦大学 | 4.0 | 15 | 5 | 25 | |
3 | 6543 | female | 20 | 北京大学 | 3.2 | 12 | 3 | 30 |
4 | 2315 | female | 23 | 浙江大学 | 3.6 | 5 | 1 | 2 |
5 | 5432 | male | 25 | 山东大学 | 3.8 | 20 | 15 | 70 |
6 | 2131 | male | 28 | 山东大学 | 3.3 | 15 | 7 | 13 |
7 | 4321 | female | 26 | 复旦大学 | 3.6 | 9 | 6 | 52 |
第一行表示: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位之后四舍五入:
university | avg_question_cnt | avg_answer_cnt |
北京大学 | 2.5000 | 21.000 |
浙江大学 | 1.000 | 2.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
id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
1 | 2138 | male | 21 | 北京大学 | 3.4 | 7 | 2 | 12 |
2 | 3214 | male | 复旦大学 | 4.0 | 15 | 5 | 25 | |
3 | 6543 | female | 20 | 北京大学 | 3.2 | 12 | 3 | 30 |
4 | 2315 | female | 23 | 浙江大学 | 3.6 | 5 | 1 | 2 |
5 | 5432 | male | 25 | 山东大学 | 3.8 | 20 | 15 | 70 |
6 | 2131 | male | 28 | 山东大学 | 3.3 | 15 | 7 | 13 |
7 | 4321 | female | 26 | 复旦大学 | 3.6 | 9 | 6 | 52 |
第一行表示:id为1的用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4在过去的30天里面活跃了7天,发帖数量为2,回答数量为12
。。。
最后一行表示:id为7的用户的常用信息为使用的设备id为4321,性别为男,年龄26岁,复旦大学,gpa为3.6在过去的30天里面活跃了9天,发帖数量为6,回答数量为52
根据示例,你的查询应返回以下结果:
university | avg_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
id | device_id | question_id | result |
1 | 2138 | 111 | wrong |
2 | 3214 | 112 | wrong |
3 | 3214 | 113 | wrong |
4 | 6543 | 114 | right |
5 | 2315 | 115 | right |
6 | 2315 | 116 | right |
7 | 2315 | 117 | wrong |
第一行表示:id为1的用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误
....
最后一行表示:id为7的用户的常用信息为使用的设备id为2135,在question_id为117的题目上,回答错误
示例:user_profile
id | device_id | gender | age | university | gpa | active_days_within_30 | question_cnt | answer_cnt |
1 | 2138 | male | 21 | 北京大学 | 3.4 | 7 | 2 | 12 |
2 | 3214 | male | 复旦大学 | 4.0 | 15 | 5 | 25 | |
3 | 6543 | female | 20 | 北京大学 | 3.2 | 12 | 3 | 30 |
4 | 2315 | female | 23 | 浙江大学 | 3.6 | 5 | 1 | 2 |
5 | 5432 | male | 25 | 山东大学 | 3.8 | 20 | 15 | 70 |
6 | 2131 | male | 28 | 山东大学 | 3.3 | 15 | 7 | 13 |
7 | 4321 | female | 26 | 复旦大学 | 3.6 | 9 | 6 | 52 |
第一行表示: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_id | gender | age | university | gpa | active_days_within_30 |
2138 | male | 21 | 北京大学 | 3.4 | 7 |
3214 | male | NULL | 复旦大学 | 4 | 15 |
6543 | female | 20 | 北京大学 | 3.2 | 12 |
2315 | female | 23 | 浙江大学 | 3.6 | 5 |
5432 | male | 25 | 山东大学 | 3.8 | 20 |
2131 | male | 28 | 山东大学 | 3.3 | 15 |
4321 | male | 28 | 复旦大学 | 3.6 | 9 |
第一行表示:用户的常用信息为使用的设备id为2138,性别为男,年龄21岁,北京大学,gpa为3.4,在过去的30天里面活跃了7天
最后一行表示:用户的常用信息为使用的设备id为4321,性别为男,年龄28岁,复旦大学,gpa为3.6,在过去的30天里面活跃了9天
答题情况明细表 question_practice_detail,其中question_id是题目编号,result是答题结果。
device_id | question_id | result |
2138 | 111 | wrong |
3214 | 112 | wrong |
3214 | 113 | wrong |
6543 | 111 | right |
2315 | 115 | right |
2315 | 116 | right |
2315 | 117 | wrong |
5432 | 118 | wrong |
5432 | 112 | wrong |
2131 | 114 | right |
5432 | 113 | wrong |
第一行表示用户的常用信息为使用的设备id为2138,在question_id为111的题目上,回答错误
....
最后一行表示用户的常用信息为使用的设备id为5432,在question_id为113的题目上,回答错误
请你写SQL查找每个学校用户的平均答题数目(说明:某学校用户平均答题数量计算方式为该学校用户答题总次数除以答过题的不同用户个数)根据示例,你的查询应返回以下结果(结果保留4位小数),注意:结果按照university升序排序!!!
university | avg_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
附录: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
以上是关于SQL日常练习2-进阶篇-牛客网的主要内容,如果未能解决你的问题,请参考以下文章