高频SQL 50题 | 聚合

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程”

文章目录
- P570. 至少有5名直接下属的经历
- P1934.确认率 🍂
- P620. 有趣的电影
- P1251. 平均售价
- P1075. 项目员工 I
- P1533. 各赛事的用户注册率 🍂
- P1211. 查询结果的质量和占比
- P1193. 每月交易 I
- P1174. 即时食物配送 II
- P550. 游戏玩法分析 IV 🐦🔥🐦🔥🐦🔥
P570. 至少有5名直接下属的经历


对应的SQL语句:

P1934.确认率 🍂


对应的SQL语句:
解法一:使用SUM / COUNT
解法二:使用VAG
以下是我一开始时写的SQL语句(存在很大的问题):
SELECT S.user_id,ROUND(COUNT(action='confirmed')/COUNT(C.user_id),2)AS confirmation_rate FROM Signups S LEFTJOIN Confirmations C ON S.user_id = C.user_id GROUPBY S.user_id - 问题1:
COUNT(action = 'confirmed')无法正确统计确认次数COUNT()函数的逻辑是统计括号内「非 NULL 的行数」,而非「统计条件为 TRUE 的行数」:- 当
action = 'confirmed'为TRUE(满足确认)→COUNT算 1; - 当
action = 'confirmed'为FALSE(如 timeout/unconfirmed)→COUNT仍算 1(FALSE 不是 NULL);
- 当
- 最终
COUNT(action = 'confirmed')会等于COUNT(C.user_id)(总操作次数),完全无法区分“确认”和“非确认”操作。
- 问题2:MySQL 中「数值 ÷ 0」会直接返回
NULL- 若用户在
Confirmations中无记录 →C.user_id为 NULL →COUNT(C.user_id) = 0,MySQL 中「数值 ÷ 0」会直接返回NULL
- 若用户在
P620. 有趣的电影

对应的SQL语句:
取模 %

P1251. 平均售价


对应的SQL语句:

P1075. 项目员工 I


对应的SQL语句:

P1533. 各赛事的用户注册率 🍂


错误语句:
SELECT R.contest_id, ROUND( COUNT(R.user_id) / (SELECT COUNT(*) FROM Users) * 100, 2 ) AS percentage FROM Users U LEFT JOIN Register R ON U.user_id = R.user_id GROUP BY contest_id ORDER BY percentage DESC, contest_id ASC 
错误原因:忽略了通过GROUP BY contest_id分组后,若有User没有任何分组,则其会留下一个NULL值,而这些NULL值就会形成一个分组,后续也会参与进计算里:COUNT(NULL) = 0解决方法:加上WHERE contest_id IS NOT NULL
对应的SQL语句:

P1211. 查询结果的质量和占比


对应的SQL语句:

P1193. 每月交易 I

对应的SQL语句:
提取日期函数 DATE_FORMAT

P1174. 即时食物配送 II


对应的SQL语句:

P550. 游戏玩法分析 IV 🐦🔥🐦🔥🐦🔥

对应的SQL语句:

如果我的内容对你有帮助,请 点赞 , 评论 , 收藏 。创作不易,大家的支持就是我坚持下去的动力!
