『百日百题 · SQL篇』备战面试,坚持刷题(五)—— 多表查询

本专栏『百日百题』长期更新,一起加入本刷题计划,一起成长吧! 🏳️‍🌈点击可关注本专栏

文章目录


前言

为什么要学习SQL?

SQL是目前使用最广泛的数据库语言。 不管你是程序员、数据分析师、Web开发者、互联网运营,或者做报表的职场白领,掌握良好的SQL知识对用好数据库是极大的帮助,而且在面试中也会对SQL进行一定程度的考察,所以说我们学习SQL是非常必要,也是非常重要的!

为什么要刷题?

编程要在实践中学习,就像游泳要通过游泳来练习。很多学生喜欢把编程当成古诗词去背诵,背诵各种语法,这样是不对的。

学编程应该像学开车一样。教练给学员讲解基本步骤后,主要靠学员在练车过程中去巩固回忆,更多时候靠的是肌肉记忆。

想要掌握一门语言就得,对其多加练习,这样才能在用到的时候运筹帷幄!

用什么刷题?

这里我极力推荐牛客网,我们平时写算法题都是在Leetcode之类上面的,当然Leetcode上面也有SQL相关题目,但是必须得会员才可以刷,这对很多人都不太友好。而牛客网就不一样了。

牛客网上面的SQL题目几乎都是免费的,大家只要想刷就可以刷,而且牛客网不只是一个题目它是教学平台,都配有视频讲解,需要的同学可以去看。最重要的就是牛客网对所有的SQL题目进行了分类,适合不同阶段的同学,所以我极力推荐大家使用牛客网

本专栏文章即将带你从基础SQL语法到复杂SQL语句,循序渐进持续练习,加入刷题计划一起加油吧!


为了方便刷题我直接把牛客网的链接放在下面,大家点击蓝色字体就可以直接进行跳转刷题了!

传送门:刷题传送门

在这里插入图片描述

本系列文章即将带你从SQL基础语法到SQL复杂语句,循序渐进持续练习,加入刷题计划一起加油吧!


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

题目:

在这里插入图片描述

题解:

SELECT q.device_id,question_id,result 
FROM question_practice_detail q 
JOIN user_profile u ON q.device_id=u.device_id
WHERE university='浙江大学'

考察知识:

多表查询 – 多表连接:若一个查询同时涉及两个或两个以上的表,则称之为连接查询。

连接查询是关系数据库中最主要的查询。
连接查询包括内连接、外连接和交叉连接等。

连接查询中用于连接两个表的条件称为连接条件或连接谓词。

一般格式为:

表名1.列名1 = 表名2.列名2

内连接语法为:

SELECTFROM 表名
[INNER] JOIN 被连接表
ON 连接条件

例如:查询每个学生及其班级的详细信息

SELECT * 
FROM 学生表
INNER JOIN 班级表 ON 学生表.班号=班级表.班号

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

题目:
在这里插入图片描述

题解:

SELECT u.university,
    COUNT(q.question_id)/COUNT(DISTINCT q.device_id) AS avg_answer_cnt
FROM user_profile AS u
RIGHT JOIN question_practice_detail AS q 
ON u.device_id=q.device_id
GROUP BY university;

考察知识:

这里使用到了外连接的知识,这里整体介绍一下这四种连接方式:

  • [INNER] JOIN :内连接,最终结果为在两张表格中都匹配上的数据项(默认情况);
  • LEFT JOIN :左外连接,最终结果为左外连接结果加上左侧表格(此处为第一张表)未匹配上的数据;
  • RIGHT JOIN :右外连接,最终结果为右外连接结果加上右侧表格(此处为第一张表)未匹配上的数据;
  • FULL JOIN :交叉连接,最终结果为交叉连接加上左侧和右侧两张表中未匹配上的数据;

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

题目:
在这里插入图片描述

题解:

SELECT 
    university,
    difficult_level,
    COUNT(qpd.device_id)/COUNT(DISTINCT qpd.device_id) AS avg_answer_cnt
FROM user_profile up 
JOIN question_practice_detail qpd ON up.device_id = qpd.device_id
JOIN question_detail qd ON qpd.question_id = qd.question_id
GROUP BY university,difficult_level;

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

题目:
在这里插入图片描述

题解:

SELECT university,difficult_level,COUNT(qpd.question_id)/COUNT(DISTINCT qpd.device_id)avg_answer_cnt
FROM user_profile up
RIGHT JOIN question_practice_detail qpd
ON up.device_id=qpd.device_id
JOIN question_detail qd
ON qpd.question_id=qd.question_id
WHERE university="山东大学"
GROUP BY 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";

考察知识:

UNION(并):使用 UNION可以实现将多个查询结果集合并为一个结果集。语法格式为:

SELECT 语句1
	UNION [ALL]
SELECT 语句2

使用UNION需要注意:

  • 使用UNION ALL是结果不去重;
  • 所有查询语句中列的个数和列的顺序必须相同;
  • 所有查询语句中对应列的数据类型必须兼容;
  • ORDER BY语句要放在最后一个查询语句的后边;

结语

为了方便刷题我直接把刷题网站的链接放在下面,大家点击蓝色字体就可以直接进行跳转刷题了!

传送门:刷题神器

刷题这件事,大家一定要认真起来,不可懈怠!

日积月累,方成大器!

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注