MySQL入门练习1

写数据库的题多是一件美事

1.查找最大值

题目链接
# 方法一
SELECT max(gpa)
FROM user_profile 
WHERE university = '复旦大学';
# 方法二
SELECT gpa
FROM user_profile 
WHERE university = "复旦大学"
ORDER BY gpa DESC 
LIMIT 1;

2.计算男生人数以及平均GPA

题目链接
SELECT COUNT(gender) AS male_num,
round(AVG(gpa),1) AS avg_gpa
FROM user_profile
WHERE gender = "male";

3.分组计算练习

题目链接
SELECT gender,university,
COUNT(id) AS user_num,
AVG(active_days_within_30),
AVG(question_cnt)
FROM user_profile GROUP BY university,gender;

4.分组过滤练习

使用HAVING
HAVING子句用于对分组后的结果再进行过滤,
它的功能有点像WHERE子句,但它用于组而不是单个记录。
在HAVING子句中可以使用统计函数,但在WHERE子句中则不能。
HAVING通常与GROUP BY子句一起使用。

例36.查询学生表中人数大于等于3的班号和人数。

SELECT 班号, COUNT(*) 人数
FROM 学生表
GROUP BY 班号
HAVING COUNT(*) >= 3

例37.查询平均成绩大于等于80的学生的学号、选课门数和平均成绩。

SELECT 学号, COUNT(*) 选课门数,
AVG(成绩) 平均成绩 FROM 成绩表
GROUP BY 学号
HAVING AVG(成绩) >= 80
题目链接
SELECT university,
AVG(question_cnt) AS avg_question_cnt,
AVG(answer_cnt) AS avg_answer_cnt
FROM user_profile GROUP BY university
having avg_question_cnt<5 OR avg_answer_cnt<20;

5.分组排序练习

题目链接
SELECT university,
AVG(question_cnt) AS avg_question_cnt
FROM user_profile
GROUP BY university
ORDER BY avg_question_cnt;

6.多表关联查询

JOIN ON详解
1.三种形式JOIN的sql语句示例
/*LEFT JOIN
* 左关联,此时a表为主表,a、b关联后的临时表中a表所有数据均存在*/
SELECT * FROM a LEFT JOIN b ON a.id = b.id
 
/*RIGHT JOIN
* 右关联,此时b表为主表,a、b关联后的临时表中b表所有数据均存在*/
SELECT * FROM a RIGHT JOIN b ON a.id = b.id
 
/*INNER JOIN == JOIN
* 等值关联,返回两个表中关联字段相等的数据行*/
SELECT * FROM a INNER JOIN b ON a.id = b.id
2.ON的作用

ON用来生成关联临时表,生成的临时表会将主表的所有记录保存下来,等待WHERE语句的进一步筛选。

题目链接
##写法一:
SELECT device_id,question_id,result
FROM question_practice_detail
WHERE device_id IN (
    SELECT device_id FROM user_profile
    WHERE university="浙江大学"
)
ORDER BY question_id;

## 写法二
SELECT A.device_id,A.question_id,A.result
FROM question_practice_detail AS A
INNER JOIN user_profile AS B 
ON B.device_id=A.device_id AND B.university="浙江大学"
ORDER BY question_id;

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

题目链接
SELECT 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;

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

题目链接
SELECT university,difficult_level,
ROUND(COUNT(qpd.question_id) / COUNT(distinct qpd.device_id),4) AS avg_answer_cnt
FROM question_practice_detail AS qpd
LEFT JOIN user_profile AS up ON up.device_id=qpd.device_id
LEFT JOIN question_detail AS qd ON qd.question_id=qpd.question_id
GROUP BY university,difficult_level;

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

题目链接
SELECT university,difficult_level,
ROUND(COUNT(qpd.question_id) / COUNT(distinct qpd.device_id) , 4) AS avg_answer_cnt
FROM question_practice_detail AS qpd
INNER JOIN user_profile AS up ON up.device_id=qpd.device_id
INNER JOIN question_detail AS qd ON qd.question_id=qpd.question_id
WHERE university = "山东大学"
GROUP BY difficult_level;

10.计算用户的平均次日留存率

题目链接
SELECT COUNT(q2.device_id) / COUNT(q1.device_id) AS avg_ret
FROM (
    SELECT distinct device_id,date
    FROM question_practice_detail
) AS q1
LEFT JOIN(
    SELECT distinct device_id,date
    FROM question_practice_detail
) AS q2
ON q1.device_id=q2.device_id
AND q2.date=date_add(q1.date,interval 1 day)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_WAWA鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值