NowCoder刷题 SQL篇

NowCoder刷题 SQL篇 非技术快速入门

  • 01 基础查询
    • 基础查询
      • SQL1 查询所有列
      • SQL2 查询多列
    • 简单处理查询结果
      • SQL3 查询结果去重
      • SQL4 查询结果限制返回行数
      • SQL5 将查询后的列重新命名
  • 02 条件查询
    • 基础操作符
      • SQL6 查找学校是北大的学生信息
      • SQL7 查找年龄大于24岁的用户信息
      • SQL8 查找某个年龄段的用户信息
      • SQL9 查找除复旦大学的用户信息
      • SQL10 用where过滤空值练习
    • 高级操作符
      • SQL11 高级操作符练习(1)
      • SQL12 高级操作符练习(2)
      • SQL13 Where in 和Not in
      • SQL14 操作符混合运用
      • SQL15 查看学校名称中含北京的用户
  • 03 高级查询
    • 计算函数
      • SQL16 查找GPA最高值
      • SQL17 计算男生人数以及平均GPA
    • 分组查询
      • SQL18 分组计算练习题
      • SQL18 分组计算练习题
      • SQL20 分组排序练习题
  • 04 多表查询
    • 子查询
      • SQL21 浙江大学用户题目回答情况
    • 连接查询
      • SQL22 统计每个学校的答过题的用户的平均答题数
      • SQL23 统计每个学校各难度的用户平均刷题数
      • SQL24 统计每个用户的平均刷题数
    • 组合查询
      • SQL25 查找山东大学或者性别为男生的信息
  • 05 必会的常用函数
    • 条件函数
      • SQL26 计算25岁以上和以下的用户数量
      • SQL27 查看不同年龄段的用户明细
    • 日期函数
      • SQL28 计算用户8月每天的练题数量
      • SQL29 计算用户的平均次日留存率
    • 文本函数
      • SQL30 统计每种性别的人数
      • SQL31 提取博客URL中的用户名
      • SQL32 截取出年龄
    • 窗口函数
      • SQL33 找出每个学校GPA最低的同学
  • 06 综合练习
    • 综合练习
      • SQL34 统计复旦用户8月练题情况
      • SQL35 浙大不同难度题目的正确率
      • SQL36 查找后排序
      • SQL37 查找后多列排序
      • SQL38 查找后降序排列
      • SQL39 21年8月份练题总数
  • 完结

01 基础查询

基础查询

SQL1 查询所有列

NowCoder刷题 SQL篇_第1张图片

  • 参考代码:
SELECT * FROM user_profile

NowCoder刷题 SQL篇_第2张图片

SQL2 查询多列

NowCoder刷题 SQL篇_第3张图片

  • 参考代码
select device_id, gender, age, university from user_profile

NowCoder刷题 SQL篇_第4张图片

简单处理查询结果

SQL3 查询结果去重

NowCoder刷题 SQL篇_第5张图片

  • 参考代码
select distinct(university) from user_profile

NowCoder刷题 SQL篇_第6张图片

SQL4 查询结果限制返回行数

NowCoder刷题 SQL篇_第7张图片

  • 参考代码
select device_id from user_profile limit 2

NowCoder刷题 SQL篇_第8张图片

SQL5 将查询后的列重新命名

NowCoder刷题 SQL篇_第9张图片

  • 参考代码
SELECT device_id user_infos_example FROM user_profile LIMIT 2

NowCoder刷题 SQL篇_第10张图片

02 条件查询

基础操作符

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

NowCoder刷题 SQL篇_第11张图片

  • 参考代码
SELECT device_id, university FROM user_profile WHERE university = '北京大学'

NowCoder刷题 SQL篇_第12张图片

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

NowCoder刷题 SQL篇_第13张图片

  • 参考代码
SELECT device_id, gender, age, university FROM user_profile WHERE age >= 24

NowCoder刷题 SQL篇_第14张图片

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

NowCoder刷题 SQL篇_第15张图片

  • 参考代码
SELECT device_id, gender, age FROM user_profile
WHERE age BETWEEN 20 AND 23

NowCoder刷题 SQL篇_第16张图片

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

NowCoder刷题 SQL篇_第17张图片

  • 参考代码
SELECT device_id, gender, age, university FROM user_profile
WHERE university <> '复旦大学'

NowCoder刷题 SQL篇_第18张图片

SQL10 用where过滤空值练习

NowCoder刷题 SQL篇_第19张图片

  • 参考代码
SELECT device_id, gender, age, university FROM user_profile
WHERE age IS NOT NULL

NowCoder刷题 SQL篇_第20张图片

高级操作符

SQL11 高级操作符练习(1)

NowCoder刷题 SQL篇_第21张图片

  • 参考代码
SELECT device_id, gender, age, university, gpa FROM user_profile
WHERE gender = 'male'
AND gpa > 3.5

NowCoder刷题 SQL篇_第22张图片

SQL12 高级操作符练习(2)

NowCoder刷题 SQL篇_第23张图片

  • 参考代码
SELECT device_id, gender, age, university, gpa FROM user_profile
WHERE university = '北京大学'
OR gpa > 3.7

NowCoder刷题 SQL篇_第24张图片

SQL13 Where in 和Not in

NowCoder刷题 SQL篇_第25张图片

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

NowCoder刷题 SQL篇_第26张图片

SQL14 操作符混合运用

NowCoder刷题 SQL篇_第27张图片

  • 参考代码
SELECT  device_id, gender, age, university, gpa
FROM user_profile
where (gpa > 3.5 and university = '山东大学') OR (gpa > 3.8 and university = '复旦大学')

NowCoder刷题 SQL篇_第28张图片

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

NowCoder刷题 SQL篇_第29张图片

  • 参考代码
SELECT device_id, age, 	university FROM user_profile
WHERE university LIKE '%北京%'

NowCoder刷题 SQL篇_第30张图片

03 高级查询

计算函数

SQL16 查找GPA最高值

NowCoder刷题 SQL篇_第31张图片

  • 参考代码
SELECT gpa FROM user_profile
WHERE university = '复旦大学'
ORDER BY gpa DESC
LIMIT 1

NowCoder刷题 SQL篇_第32张图片

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

NowCoder刷题 SQL篇_第33张图片

  • 参考代码
SELECT COUNT(gender) AS male_num,
ROUND(AVG(gpa),1) AS avg_gpa
FROM user_profile
WHERE gender = 'male'

NowCoder刷题 SQL篇_第34张图片

分组查询

SQL18 分组计算练习题

NowCoder刷题 SQL篇_第35张图片

  • 参考代码
SELECT gender,
university,
COUNT(device_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

NowCoder刷题 SQL篇_第36张图片

SQL18 分组计算练习题

NowCoder刷题 SQL篇_第37张图片

  • 参考代码
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

NowCoder刷题 SQL篇_第38张图片

SQL20 分组排序练习题

NowCoder刷题 SQL篇_第39张图片

  • 参考代码
SELECT university,
ROUND(AVG(question_cnt), 4) AS avg_question_cnt
FROM user_profile
GROUP BY university
ORDER BY avg_question_cnt

NowCoder刷题 SQL篇_第40张图片

04 多表查询

子查询

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

NowCoder刷题 SQL篇_第41张图片

  • 参考代码
SELECT A.device_id,
A.question_id,
A.result
FROM question_practice_detail A
LEFT JOIN user_profile B
ON A.device_id = B.device_id
WHERE B.university = '浙江大学'
ORDER BY A.question_id

NowCoder刷题 SQL篇_第42张图片

连接查询

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

NowCoder刷题 SQL篇_第43张图片

  • 参考代码
SELECT A.university,
COUNT(B.question_id)/COUNT(DISTINCT(A.device_id)) AS avg_answer_cnt
FROM user_profile AS A 
JOIN question_practice_detail AS B
ON A.device_id = B.device_id
GROUP BY A.university

NowCoder刷题 SQL篇_第44张图片

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

NowCoder刷题 SQL篇_第45张图片

  • 参考代码
SELECT A.university,
C.difficult_level,
COUNT(B.question_id)/COUNT(DISTINCT(A.device_id)) AS avg_answer_cnt
FROM user_profile AS A
JOIN question_practice_detail AS B
ON A.device_id = B.device_id
JOIN question_detail AS C
ON B.question_id = C.question_id
GROUP BY A.university, C.difficult_level

NowCoder刷题 SQL篇_第46张图片

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

NowCoder刷题 SQL篇_第47张图片

  • 参考代码
SELECT T1.university,
T3.difficult_level,
ROUND(COUNT(T2.question_id)/COUNT(DISTINCT(T1.device_id)), 4) AS avg_answer_cnt 
FROM user_profile AS T1
JOIN question_practice_detail T2
ON T1.device_id = T2.device_id
JOIN question_detail T3
ON T2.question_id = T3.question_id
WHERE T1.university = '山东大学'
GROUP BY T1.university, T3.difficult_level

NowCoder刷题 SQL篇_第48张图片

组合查询

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

NowCoder刷题 SQL篇_第49张图片

  • 参考代码
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'

NowCoder刷题 SQL篇_第50张图片

05 必会的常用函数

条件函数

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

NowCoder刷题 SQL篇_第51张图片

  • 参考代码
SELECT CASE WHEN age < 25 OR age IS NULL THEN '25岁以下'
WHEN age >= 25 THEN '25岁及以上'
END age_cut,COUNT(*)number
FROM user_profile
GROUP BY age_cut

NowCoder刷题 SQL篇_第52张图片

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

NowCoder刷题 SQL篇_第53张图片

  • 参考代码
SELECT device_id,
gender,
CASE WHEN age < 20 THEN '20岁以下'
WHEN age BETWEEN 20 AND 24 THEN '20-24岁'
WHEN age >= 25 THEN '25岁及以上'
ELSE '其他'
END age_cut
FROM user_profile

NowCoder刷题 SQL篇_第54张图片

日期函数

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

NowCoder刷题 SQL篇_第55张图片

  • 参考代码
SELECT DAY(date) AS day,
COUNT(question_id) AS question_cnt
FROM question_practice_detail
WHERE LEFT(date, 7) = '2021-08'
GROUP BY day

NowCoder刷题 SQL篇_第56张图片

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

NowCoder刷题 SQL篇_第57张图片

  • 参考代码
SELECT COUNT(T2.date)/COUNT(T1.date) FROM
(SELECT DISTINCT device_id, date FROM question_practice_detail) T1
LEFT JOIN
(SELECT DISTINCT device_id, date FROM question_practice_detail) T2
ON T1.device_id = T2.device_id
AND T2.date = date_add(T1.date, interval 1 day)

NowCoder刷题 SQL篇_第58张图片

文本函数

SQL30 统计每种性别的人数

NowCoder刷题 SQL篇_第59张图片

  • 参考代码
SELECT SUBSTRING_INDEX(profile, ',', -1) AS gender,
COUNT(device_id) AS number
FROM user_submit
GROUP BY gender

NowCoder刷题 SQL篇_第60张图片

SQL31 提取博客URL中的用户名

NowCoder刷题 SQL篇_第61张图片

  • 参考代码
SELECT device_id,
SUBSTRING_INDEX(blog_url, '/', -1) AS user_name
FROM user_submit

NowCoder刷题 SQL篇_第62张图片

SQL32 截取出年龄

NowCoder刷题 SQL篇_第63张图片

  • 参考代码
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(profile, ',', -2), ',', 1) AS age,
COUNT(device_id) AS number
FROM user_submit
GROUP BY age

NowCoder刷题 SQL篇_第64张图片

窗口函数

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

NowCoder刷题 SQL篇_第65张图片

  • 参考代码
SELECT device_id,
university,
gpa
FROM (
    SELECT device_id,
    university,
    gpa,
    ROW_NUMBER() OVER(PARTITION BY university ORDER BY gpa) AS RK
    FROM user_profile
)T
WHERE T.RK = 1

NowCoder刷题 SQL篇_第66张图片

06 综合练习

综合练习

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

NowCoder刷题 SQL篇_第67张图片

  • 参考代码
SELECT T1.device_id,
T1.university,
SUM(IF(T2.result is NOT NULL, 1, 0)) AS question_cnt,
SUM(IF(T2.result = 'right', 1, 0)) AS right_question_cnt
FROM user_profile AS T1
LEFT JOIN question_practice_detail AS T2
ON T1.device_id=T2.device_id
WHERE T1.university='复旦大学' AND (MONTH(T2.date)=8 OR T2.date is NULL)
GROUP BY T1.device_id

NowCoder刷题 SQL篇_第68张图片

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

NowCoder刷题 SQL篇_第69张图片

  • 参考代码
SELECT 
T3.difficult_level,
ROUND(SUM(IF(T2.result = 'right', 1, 0))/COUNT(T2.result), 4) AS correct_rate
FROM user_profile AS T1
LEFT JOIN question_practice_detail AS T2
ON T1.device_id = T2.device_id
LEFT JOIN question_detail T3
ON T2.question_id = T3.question_id
WHERE T1.university = '浙江大学'
AND T3.difficult_level IS NOT NULL
GROUP BY T3.difficult_level
ORDER BY correct_rate

NowCoder刷题 SQL篇_第70张图片

SQL36 查找后排序

NowCoder刷题 SQL篇_第71张图片

  • 参考代码
SELECT device_id,
age
FROM user_profile
ORDER BY age

NowCoder刷题 SQL篇_第72张图片

SQL37 查找后多列排序

NowCoder刷题 SQL篇_第73张图片

  • 参考代码
SELECT device_id,
gpa,
age
FROM user_profile
ORDER BY gpa, age

NowCoder刷题 SQL篇_第74张图片

SQL38 查找后降序排列

NowCoder刷题 SQL篇_第75张图片

  • 参考代码
SELECT device_id,
gpa,
age
FROM user_profile
ORDER BY gpa DESC, age DESC

NowCoder刷题 SQL篇_第76张图片

SQL39 21年8月份练题总数

NowCoder刷题 SQL篇_第77张图片

  • 参考代码
SELECT COUNT(DISTINCT(device_id)) AS did_cnt,
COUNT(question_id) AS question_cnt
FROM question_practice_detail
WHERE LEFT(date, 7) = '2021-08'
ORDER BY did_cnt
  • 参考代码优化,面对大数据时提升效率
SELECT COUNT(did_cnt),
SUM(question_cnt)
FROM (
    SELECT COUNT(device_id) AS did_cnt,
    COUNT(question_id) AS question_cnt
    FROM question_practice_detail
    WHERE date >= '2021-08-01' and date <= '2021-08-31'
    GROUP BY device_id
)T

NowCoder刷题 SQL篇_第78张图片

完结

你可能感兴趣的:(SQL,sql,数据库)