SQL 非技术快速入门篇

用户信息表:user_profile

设备id(device_id)

性别(gender)

年龄(age)

学校(university)

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

发帖数量字段(question_cnt)

回答数量字段(answer_cnt)

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

题库练习明细表:question_practice_detail

设备id(device_id)

问题id(question_id)

问题答案对错(result)

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

表:question_detail

问题id(question_id)

问题难易程度(difficult_level)

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

示例:user_submit

用户信息(profile)

博客地址(blog_url)

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

01 基础查询

基础查询

SQL1 查询多列

题目:查看用户的设备id、性别、年龄和学校的数据。

SELECT device_id, gender, age, university FROM user_profile

SQL2 查询所有列

题目:查看用户信息表中所有的数据。

SELECT id, device_id, gender, age, university, province FROM user_profile

SQL3 查询结果去重

题目:查看用户来自于哪些学校的去重数据。

SELECT DISTINCT university FROM user_profile

SQL4 查询结果限制返回行数

题目:查看前2个用户明细设备ID数据。

SELECT device_id FROM user_profile WHERE id BETWEEN 1 AND 2

SQL5 将查询后的列重新命名

题目:查看前2个用户明细设备ID数据,并将列名改为 'user_infos_example'。

SELECT device_id as user_infos_example FROM user_profile LIMIT 2

02 条件查询

基础排序

SQL36 查找后排序

题目:取出用户信息表中的用户年龄,并按照年龄升序排序。

SELECT device_id,age FROM user_profile ORDER BY age

SQL37 查找后多列排序

题目:取出用户信息表中的年龄和gpa数据,并先按照gpa升序排序,再按照年龄升序排序输出。

SELECT device_id,gpa,age FROM user_profile ORDER BY gpa,age

SQL38 查找后降序排列

题目:取出用户信息表中对应的数据,并先按照gpa、年龄降序排序输出。

SELECT device_id,gpa,age FROM user_profile ORDER BY gpa DESC, age DESC

基础操作符

SQL6 查找学校是北大的学生信息

题目:筛选出所有北京大学的学生用户,取出满足条件的数据,结果返回设备id和学校。

SELECT device_id , university FROM user_profile WHERE university = '北京大学'

SQL7 查找年龄大于24岁的用户信息

题目:取出24岁以上的用户设备ID、性别、年龄、学校的数据。

SELECT device_id, gender, age, university FROM user_profile WHERE age > 24

SQL8 查找某个年龄段的用户信息

题目:取出20岁及以上且23岁及以下的用户设备ID、性别、年龄的数据。

SELECT device_id, gender, age FROM user_profile WHERE age BETWEEN 20 AND 23

SQL9 查找除复旦大学的用户信息

题目:查看除复旦大学以外的所有用户明细,请取出相应数据。

SELECT device_id, gender, age, university
FROM user_profile WHERE NOT university = '复旦大学'

SQL10 用where过滤空值练习

题目:取出所有年龄值不为空的用户的设备ID,性别,年龄,学校的信息。

SELECT device_id, gender, age, university FROM user_profile WHERE age != 0

高级操作符

SQL11 高级操作符练习(1)

题目:取出男性且GPA在3.5以上(不包括3.5)的用户数据。

SELECT device_id, gender, age, university, gpa
FROM user_profile WHERE gender = 'male' AND gpa > 3.5

SQL12 高级操作符练习(2)

题目:取出学校为北大或GPA在3.7以上(不包括3.7)的用户数据。

SELECT device_id, gender, age, university, gpa
FROM user_profile WHERE university = '北京大学' OR gpa > 3.7

SQL13 Where in 和 Not in

题目:取出学校为北大、复旦和山大的同学的数据。

SELECT device_id, gender, age, university, gpa
FROM user_profile WHERE university IN ('北京大学', '复旦大学', '山东大学')

SQL14 操作符混合运用

题目:取出gpa在3.5以上(不包括3.5)的山东大学用户 或 gpa在3.8以上(不包括3.8)的复旦大学同学的相应数据。

SELECT device_id, gender, age, university, gpa
FROM user_profile
WHERE (university = '山东大学' AND gpa > 3.5) OR (university = '复旦大学' AND gpa > 3.8)

SQL15 查看学校名称中含北京的用户

题目:取出所有大学中带有北京的用户的信息。

SELECT device_id, age, university
FROM user_profile
WHERE university LIKE '%北京%'

03 高级查询

计算函数

SQL16 查找GPA最高值

题目:取出复旦大学学生gpa最高值的相应数据。

SELECT MAX(gpa) as gpa
FROM user_profile
WHERE university = '复旦大学'

SQL17 计算男生人数以及平均GPA

题目:取出男性用户有多少人以及他们的平均 gpa 的相应数据。

SELECT COUNT(gender) as male_num, AVG(gpa) as avg_gpa
FROM user_profile
WHERE gender = 'male'

分组查询

SQL18 分组计算练习题

题目:取出每个学校每种性别的用户数、30天内平均活跃天数 和 平均发帖数量。

SELECT gender, university, count(device_id), avg(active_days_within_30), avg(question_cnt)
FROM user_profile GROUP BY gender, university

SQL19 分组过滤练习题

题目:取出平均发贴数低于5的学校 或 平均回帖数小于20的学校。

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;

SQL20 分组排序练习题

题目:查看不同大学的用户平均发帖情况,并按照平均发帖情况进行升序排列 的数据。

SELECT university, AVG(question_cnt) AS avg_question_cnt
FROM user_profile
GROUP BY university
ORDER BY avg_question_cnt

04 多表查询

子查询

SQL21 浙江大学用户题目回答情况

题目:取出所有来自浙江大学的用户题目回答明细情况的相应数据。

SELECT p.device_id, q.question_id, q.result
FROM user_profile p, question_practice_detail q
WHERE p.university = '浙江大学' AND p.device_id = q.device_id
ORDER BY q.question_id

链接查询

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

题目:取出每个学校答过题的用户平均答题数量情况的数据。

SELECT u.university, count(u.university) / count(DISTINCT q.device_id) AS avg_answer_cnt
FROM user_profile u, question_practice_detail q
WHERE u.device_id=q.device_id
GROUP BY u.university

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

题目:取出参加答题的不同学校、不同难度的用户平均答题量的相应数据。

SELECT university, difficult_level, COUNT(q.question_id) / COUNT(DISTINCT q.device_id) avg_answer_cnt
FROM question_practice_detail q, user_profile u, question_detail d
WHERE q.device_id=u.device_id AND q.question_id=d.question_id
GROUP BY university, difficult_level

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

题目:查看参加答题的山东大学的用户在不同难度下的平均答题题目数的相应数据。

SELECT university, difficult_level, COUNT(q.question_id) / COUNT(DISTINCT q.device_id) as avg_answer_cnt
FROM user_profile as u
INNER JOIN question_practice_detail as q
ON u.device_id = q.device_id
INNER JOIN question_detail as d
ON q.question_id = d.question_id
WHERE university = '山东大学'
GROUP BY difficult_level

组合查询

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

题目:取出山东大学或者性别为男性的用户的device_id、gender、age和gpa的不去重数据。

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'

05 必会的常用函数

条件函数

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

题目:分别查看25岁以下和25岁及以上两个年龄段的用户数量。(age为null 也记为 25岁以下)

SELECT if(age >= 25, '25岁及以上', '25岁以下') as age_cut, COUNT(device_id) as number
FROM user_profile
GROUP BY age_cut

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

题目:分别查看20岁以下,20-24岁,25岁及以上三个年龄段,用户的明细情况。(注:若年龄为空请返回其他。)

SELECT device_id, gender, CASE WHEN age < 20 THEN '20岁以下'
WHEN age >= 20 AND age <= 24 THEN '20-24岁'
WHEN age >= 25 THEN '25岁及以上'
WHEN age is null THEN '其他'
END as age_cut
FROM user_profile

日期函数

SQL28 计算用户8月每天的练题数量

题目:取出2021年8月每天用户练习题目的数量的相应数据。

SELECT day(date) as day, COUNT(question_id) as question_cnt
FROM question_practice_detail
WHERE date LIKE '2021-08-%'
GROUP BY date;

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

题目:取出用户在某天刷题后第二天还会再来刷题的平均概率的相应数据。

SELECT COUNT(DISTINCT q2.device_id, q2.date) / COUNT(DISTINCT q1.device_id, q1.date) as avg_ret
FROM question_practice_detail q1
LEFT JOIN question_practice_detail q2
ON q1.device_id = q2.device_id and DATEDIFF(q1.date, q2.date) = 1

文本函数

SQL30 统计每种性别的人数

题目:取出每个性别的用户分别有多少参赛者的相应结果。

SELECT substring_index(profile, ',', -1) as gender, COUNT(*) AS number
FROM user_submit
GROUP BY gender

SQL32 截取出年龄

题目:取出每个年龄的用户分别有多少参赛者的相应结果。

SELECT age, COUNT(*) number
FROM (SELECT SUBSTR(PROFILE, 12, 2) age
FROM user_submit) ages
GROUP BY age

SQL31 提取博客URL中的用户名

题目:申请参与比赛的用户的 blog_url 字段中url字符后的字符串为用户个人博客的用户名,取出用户的个人博客用户字段单独记录为一个新的字段。

SELECT device_id , substring_index(blog_url, '/', -1) as user_name
FROM user_submit

窗口函数

SQL33 找出每个学校GPA最低的同学

题目:取出每个学校的最低gpa。

SELECT device_id, university, gpa
FROM (
    SELECT *, ROW_NUMBER() over (PARTITION BY university ORDER BY gpa) AS rn
    FROM user_profile
) AS temp
WHERE temp.rn = 1

06 综合练习

综合练习

SQL34 统计复旦用户8月练题情况

题目: 取出复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况,没有练习过的用户,答题数结果返回0。

SELECT
t1.device_id,
t1.university,
SUM(CASE WHEN t2.result IS NOT null THEN 1 ELSE 0 END),
SUM(CASE WHEN t2.result = 'right' THEN 1 ELSE 0 END)
FROM user_profile t1
LEFT JOIN question_practice_detail t2 
ON t1.device_id = t2.device_id AND MONTH(t2.date) = '08'
WHERE t1.university = '复旦大学'
GROUP BY t1.device_id

SQL35 浙大不同难度题目的正确率

题目:取出浙江大学的用户在不同难度题目下答题的正确率情况,并按照准确率升序输出。

SELECT d.difficult_level, 
(SUM(CASE WHEN q.result='right' THEN 1 ELSE 0 END) / COUNT(q.result)) correct_rated
FROM user_profile u, question_practice_detail q, question_detail d
WHERE u.university = '浙江大学' AND u.device_id = q.device_id AND q.question_id = d.question_id
GROUP BY d.difficult_level
ORDER BY correct_rated ASC

SQL39 21年8月份练题总数

题目: 取出2021年8月份所有练习过题目的总用户数和练习过题目的总次数的相应结果。

SELECT COUNT(DISTINCT device_id), COUNT(question_id)
FROM question_practice_detail
WHERE date LIKE '2021-08%'
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

withoutfear

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

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

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

打赏作者

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

抵扣说明:

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

余额充值