NowCoder刷题 SQL篇 非技术快速入门
- 01 基础查询
-
- 基础查询
-
- 简单处理查询结果
-
- 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 多表查询
-
- 子查询
-
- 连接查询
-
- SQL22 统计每个学校的答过题的用户的平均答题数
- SQL23 统计每个学校各难度的用户平均刷题数
- SQL24 统计每个用户的平均刷题数
- 组合查询
-
- 05 必会的常用函数
-
- 条件函数
-
- SQL26 计算25岁以上和以下的用户数量
- SQL27 查看不同年龄段的用户明细
- 日期函数
-
- SQL28 计算用户8月每天的练题数量
- SQL29 计算用户的平均次日留存率
- 文本函数
-
- SQL30 统计每种性别的人数
- SQL31 提取博客URL中的用户名
- SQL32 截取出年龄
- 窗口函数
-
- 06 综合练习
-
- 综合练习
-
- SQL34 统计复旦用户8月练题情况
- SQL35 浙大不同难度题目的正确率
- SQL36 查找后排序
- SQL37 查找后多列排序
- SQL38 查找后降序排列
- SQL39 21年8月份练题总数
- 完结
01 基础查询
基础查询
SQL1 查询所有列
SELECT * FROM user_profile
SQL2 查询多列
select device_id, gender, age, university from user_profile
简单处理查询结果
SQL3 查询结果去重
select distinct(university) from user_profile
SQL4 查询结果限制返回行数
select device_id from user_profile limit 2
SQL5 将查询后的列重新命名
SELECT device_id user_infos_example FROM user_profile LIMIT 2
02 条件查询
基础操作符
SQL6 查找学校是北大的学生信息
SELECT device_id, university FROM user_profile WHERE university = '北京大学'
SQL7 查找年龄大于24岁的用户信息
SELECT device_id, gender, age, university FROM user_profile WHERE age >= 24
SQL8 查找某个年龄段的用户信息
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 university <> '复旦大学'
SQL10 用where过滤空值练习
SELECT device_id, gender, age, university FROM user_profile
WHERE age IS NOT NULL
高级操作符
SQL11 高级操作符练习(1)
SELECT device_id, gender, age, university, gpa FROM user_profile
WHERE gender = 'male'
AND gpa > 3.5
SQL12 高级操作符练习(2)
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 操作符混合运用
SELECT device_id, gender, age, university, gpa
FROM user_profile
where (gpa > 3.5 and university = '山东大学') OR (gpa > 3.8 and university = '复旦大学')
SQL15 查看学校名称中含北京的用户
SELECT device_id, age, university FROM user_profile
WHERE university LIKE '%北京%'
03 高级查询
计算函数
SQL16 查找GPA最高值
SELECT gpa FROM user_profile
WHERE university = '复旦大学'
ORDER BY gpa DESC
LIMIT 1
SQL17 计算男生人数以及平均GPA
SELECT COUNT(gender) AS male_num,
ROUND(AVG(gpa),1) AS avg_gpa
FROM user_profile
WHERE gender = 'male'
分组查询
SQL18 分组计算练习题
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
SQL18 分组计算练习题
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
SQL20 分组排序练习题
SELECT university,
ROUND(AVG(question_cnt), 4) AS avg_question_cnt
FROM user_profile
GROUP BY university
ORDER BY avg_question_cnt
04 多表查询
子查询
SQL21 浙江大学用户题目回答情况
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
连接查询
SQL22 统计每个学校的答过题的用户的平均答题数
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
SQL23 统计每个学校各难度的用户平均刷题数
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
SQL24 统计每个用户的平均刷题数
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
组合查询
SQL25 查找山东大学或者性别为男生的信息
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岁以上和以下的用户数量
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
SQL27 查看不同年龄段的用户明细
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
日期函数
SQL28 计算用户8月每天的练题数量
SELECT DAY(date) AS day,
COUNT(question_id) AS question_cnt
FROM question_practice_detail
WHERE LEFT(date, 7) = '2021-08'
GROUP BY day
SQL29 计算用户的平均次日留存率
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)
文本函数
SQL30 统计每种性别的人数
SELECT SUBSTRING_INDEX(profile, ',', -1) AS gender,
COUNT(device_id) AS number
FROM user_submit
GROUP BY gender
SQL31 提取博客URL中的用户名
SELECT device_id,
SUBSTRING_INDEX(blog_url, '/', -1) AS user_name
FROM user_submit
SQL32 截取出年龄
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(profile, ',', -2), ',', 1) AS age,
COUNT(device_id) AS number
FROM user_submit
GROUP BY age
窗口函数
SQL33 找出每个学校GPA最低的同学
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
06 综合练习
综合练习
SQL34 统计复旦用户8月练题情况
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
SQL35 浙大不同难度题目的正确率
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
SQL36 查找后排序
SELECT device_id,
age
FROM user_profile
ORDER BY age
SQL37 查找后多列排序
SELECT device_id,
gpa,
age
FROM user_profile
ORDER BY gpa, age
SQL38 查找后降序排列
SELECT device_id,
gpa,
age
FROM user_profile
ORDER BY gpa DESC, age DESC
SQL39 21年8月份练题总数
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
完结