牛客SQL练习详解 06:综合练习
- SQL34 统计复旦用户8月练题情况
- SQL35 浙大不同难度题目的正确率
- SQL39 21年8月份练题总数
叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
SQL34 统计复旦用户8月练题情况
题目:
现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况,
请取出相应明细数据,对于在8月份没有练习过的用户,答题数结果返回0.
select
u.device_id,
university,
count(q.result) as question_cnt,
sum(if(q.result='right',1,0)) as right_question_cnt
# count使用错误
# count(if(q.result='right',1,0)) as right_question_cnt
#count正确写法:
# count(CASE WHEN q.result = 'right' THEN 1 END) as right_question_cnt
from user_profile u
left join question_practice_detail q
on u.device_id = q.device_id
and month(date)=8
where university='复旦大学'
group by u.device_id
出错分析:
1. sum(if(q.result='right',1,0)) as right_question_cn
if(q.result = 'right', 1, 0):对于每一行,如果 q.result 等于 'right',则返回 1,否则返回 0。
SUM(...):对所有这些 1 和 0 的值进行求和,从而计算出结果为 'right' 的行数。
2. count(if(q.result='right',1,0)) as right_question_cnt
COUNT() 函数只计算非 NULL 的值。
而在 IF 的情况下,当条件不满足时,它返回 0,所以会被视为有效值。
COUNT() 将计算这些有效值的数量,但不会计算条件为 FALSE 的情况,因此会返回意外的结果。
SQL35 浙大不同难度题目的正确率
题目:
现在运营想要了解浙江大学的用户在不同难度题目下答题的正确率情况,
请取出相应数据,并按照准确率升序输出。
法1: right join+left join
select
qd.difficult_level,
SUM(if(q.result='right',1,0))/NULLIF(count(q.result),0) as correct_rate
from
(select
qpd.device_id,
qpd.question_id,
qpd.result
from user_profile
# 出错点:此处应该为右连接,否则会产生空值
# left join question_practice_detail qpd
right join question_practice_detail qpd
on u.device_id = qpd.device_id
where university = '浙江大学') q
left join
question_detail qd on q.question_id = qd.question_id
group by qd.difficult_level
order by correct_rate ASC
法2: 右连接+左链接
select
qd.difficult_level,
count(if(qpd.result='right',1,null))/count(qpd.result) as correct_rate
from user_profile u
right join question_practice_detail qpd using(device_id)
left join question_detail qd using(question_id)
where university = '浙江大学'
group by qd.difficult_level
order by correct_rate ASC
法3: 内连接 inner join inner可以省略,返回两个表都有的记录
select difficult_level,
count(if(result='right',1,null)) / count(result) as correct_rate
from user_profile up
join question_practice_detail using(device_id)
join question_detail using(question_id)
where university='浙江大学'
group by difficult_level
order by correct_rate
法4:使用avg函数计算均值 + where...and连接三表
SELECT difficult_level,
AVG(IF(result='right',1,0)) AS correct_rate
FROM user_profile u,
question_practice_detail qpd,
question_detail qd
WHERE
u.device_id = qpd.device_id
AND qpd.question_id = qd.question_id
AND university='浙江大学'
GROUP BY difficult_level
ORDER BY correct_rate;
SQL39 21年8月份练题总数
题目:
现在运营想要了解2021年8月份所有练习过题目的总用户数和练习过题目的总次数,
请取出相应结果
select
count(distinct device_id) as did_cnt,
count(question_id) as question_cnt
from question_practice_detail
where date_format(date,'%Y%m')='202108' # Y大写:年份4位
# where date_format(date,'%y%m') = '2108' # 小写y:年份后2位
# where date_format(date, '%Y-%m')='2021-08'
# where date like '2021-08%'
# where year(date)=2021 and month(date)=08
# where date between '2021-08-01' and '2021-08-31'
# where substring(date,1,7) = '2021-08'
# where substring_index(date,"-",2) = '2021-08'
# where mid(date,1,7) = '2021-08'
# where left(date,7) = '2021-08'
Ending!
更多课程知识学习记录随后再来吧!
就酱,嘎啦!
注:
人生在勤,不索何获。