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

完结