牛客题霸sql入门篇之多表查询

牛客题霸sql入门篇之多表查询

1 子查询

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

1.1.1 题目内容

a 内容1

牛客题霸sql入门篇之多表查询_第1张图片

b 内容2

牛客题霸sql入门篇之多表查询_第2张图片

1.1.2 示例代码

SELECT device_id,question_id,result
FROM question_practice_detail
WHERE device_id=(SELECT device_id FROM user_profile WHERE university='浙江大学' );

1.1.3 运行结果

牛客题霸sql入门篇之多表查询_第3张图片

1.1.4 考察知识点

如果一个表需要通过另外一个表筛选出来的结果
就可以考虑子查询了

2 链接查询

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

2.1.1 题目内容

a 内容1

牛客题霸sql入门篇之多表查询_第4张图片

b 内容2

牛客题霸sql入门篇之多表查询_第5张图片

c 内容3

牛客题霸sql入门篇之多表查询_第6张图片

2.1.2 示例代码

SELECT u.university university,count(u.device_id)/count(distinct u.device_id) avg_answer_cnt
FROM user_profile u
INNER JOIN question_practice_detail q
ON u.device_id=q.device_id
GROUP BY u.university
ORDER BY u.university

2.1.3 运行结果

牛客题霸sql入门篇之多表查询_第7张图片

2.1.4 考察知识点

看到每个、各这种类似的词语,代表需要使用group by分组关键字
分组中的平均数量可以有优先考虑count(字段)/count(distinct 字段),再去考虑avg函数
另外这个字段如果多张表都存在且是多表联查,一定要指明一个表,像表别名.字段才是正解

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

2.2.1 题目内容

a 内容1

牛客题霸sql入门篇之多表查询_第8张图片

b 内容2

牛客题霸sql入门篇之多表查询_第9张图片

c 内容3

牛客题霸sql入门篇之多表查询_第10张图片

d 内容4

牛客题霸sql入门篇之多表查询_第11张图片

2.2.2 示例代码

SELECT u.university university,q2.difficult_level difficult_level,count(u.device_id)/count(distinct u.device_id) avg_answer_cnt
FROM user_profile u
INNER JOIN  question_practice_detail q1
ON u.device_id=q1.device_id
INNER JOIN question_detail q2
ON q1.question_id=q2.question_id
GROUP BY u.university,q2.difficult_level

2.2.3 运行结果

牛客题霸sql入门篇之多表查询_第12张图片

2.2.4 考察知识点

多表联查后得到的新表和普通表具有一样的功能,都能使用分组 分组筛选、过滤、排序功能
但是需要注意是的是使用时最好才有表别名.字段名这种写法,这样可以提高代码的可读性

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

2.3.1 题目内容

a 内容1

牛客题霸sql入门篇之多表查询_第13张图片

b 内容2

牛客题霸sql入门篇之多表查询_第14张图片

c 内容3

牛客题霸sql入门篇之多表查询_第15张图片

d 内容4

牛客题霸sql入门篇之多表查询_第16张图片

2.3.2 示例代码

SELECT u.university university,q2.difficult_level difficult_level,
count(u.device_id)/count(distinct u.device_id) avg_answer_cnt
FROM user_profile u
INNER JOIN question_practice_detail q1
ON u.device_id=q1.device_id
INNER JOIN question_detail q2
ON q1.question_id=q2.question_id
GROUP BY u.university,q2.difficult_level
HAVING u.university='山东大学'

2.3.3 运行结果

牛客题霸sql入门篇之多表查询_第17张图片

2.3.4 考察知识点

① 如果有分组和特定条件,先筛选后分组和先分组后筛选都可以,哪种熟悉就用哪种
若筛选完之后发现有个键是取不到的,如山东大学,那就直接对唯一的值
进行一次排序就行,聚合键是一定可以拿到的
② 如果()里面的值不写别名,默认的字段名就是查询时原表的字段名
③想用括号里面的表 需要再后面写上表别名,通过别名.字段名去调用
以下是本题的另外一种写法
SELECT u.university university,q2.difficult_level difficult_level,
count(u.device_id)/count(distinct u.device_id) avg_answer_cnt
FROM (SELECT * FROM user_profile WHERE university='山东大学') u
INNER JOIN question_practice_detail q1
ON u.device_id=q1.device_id
INNER JOIN question_detail q2
ON q1.question_id=q2.question_id
GROUP BY u.university,q2.difficult_level

3 组合查询

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

3.1.1 题目内容

牛客题霸sql入门篇之多表查询_第18张图片

3.1.2 示例代码

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'

3.1.3 运行结果

牛客题霸sql入门篇之多表查询_第19张图片

3.1.4 考察知识点

union all 表示两种查询结果的并集且不去除重复行
如果是单union 就代表是去除重复行
union要求两者的字段个数、字段类型完全一致才可以进行拼接

你可能感兴趣的:(牛客题库之sql入门篇,MySQL学习,牛客题霸,sql入门,mysql,多表查询,子查询)