最全面的MySQL面试题大全-一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nihui123/article/details/90452750

现在正是毕业季,很多的在校的大学生都在找工作,但是有很多的公司都会在某个方面卡大家一下,其中让很多人头疼的地方就是数据库的查询。这里我就总结了之前在有些公司面试的时候遇到的一些关于数据库查询的笔试题给大家做一个归纳。所使用的是面试题中比较经典的一个场景就是学生管理系统中所涉及到的表结构。

表结构介绍

第一张表 学生表
sid 学生id
sname 学生姓名
sage 学生年龄
sex 学生性别


在这里插入图片描述

第二张表 老师表
tid 老师id
Tname 老师姓名


在这里插入图片描述

第三张表 成绩表
sid 学生id
cid 课程id
score 分数


在这里插入图片描述

第四张表 课程表
cid课程id
Cname课程名称
Tid 教师id


在这里插入图片描述

面试题

1.用一条SQL语句查询每门课程都是大于80分的学生的姓名

分析:首先需要知道课程、分数、学生姓名这三个信息是分别存在于多张表中的。所需要查询到所有的信息就必须涉及到多表查询的问题。
所以有通过分析由以下的语句即结果

SELECT sname,score as sco FROM Student as s,SC
WHERE s.sid = SC.Sid AND SC.score>80;
SELECT sname,score as sco FROM Student as s,SC
WHERE s.sid = SC.Sid
HAVING sco>80;

查询结果
在这里插入图片描述

2.查询“语文”课程比“数学”课程成绩高的学生的信息以及课程分数。

分析:首先了解一下,在课程表中,语文课的课程id是01,数学课的课程id是02,这样的话可以将这两个课程的比较变成对于id的比较。其次,学生信息与课程成绩信息分别在两张不同的表中,所以一定会涉及到多表查询。

这里通过这个题来一步一步的分析一下遇到这样的问题应该怎么去思考。

  1. 首先涉及到多表查询的时候考虑最多的就是给表起个别名,会看到下面条语句与select * from student效果是一样的,但是在使用多表查询的时候就会显示出优势。
select s.* from Student as s;
  1. 需要分别找到cid为01和02的两门课程,也就是说要在sc表中查找两边,这样的话就必须要使用到别名。
select * FROM SC WHERE cid = 01;
select * FROM SC WHERE cid = 02;
  1. 那么怎么将将这些结果组合到一起呢,这个时候别名就开始起作用了。
select s.*,a.score as score from Student as s,
	(select * FROM SC WHERE cid = 01) a,
	(select * FROM SC WHERE cid = 02) b
WHERE a.sid = b.sid AND a.score>b.score and s.Sid=a.sid;

以上就是整个的分析过程,首先要分别找到两个表结果之间的关系,其次我们可以将查询出来的结果作为一个临时表来使用,只不过使用的时候为了方便为这个表起一个别名。

3.查询平均成绩大于65分的学生的编号和姓名以及平均成绩。

分析:首先需要分析一下,这个题其实和之前的第一题属于同一个类型的题学生信息与成绩信息并没有在同一张表中,所以在查询的时候需要涉及到的就是多表查询的问题。

select s.sid, sname, avg(score) as avg_score
from Student as s, SC
where s.sid = SC.sid
group by s.sid
having avg_score > 60

这里有个问题,为什么要进行group by呢,不进行这个操作会怎么样呢?
下面我们就来分析一下这个问题。
首先,来看一个结果,会看到在没有使用having条件的时候结果是这个样子的。
在这里插入图片描述
然后在将group by 语句取消之后看看查询结果
在这里插入图片描述
为什么会出现这个情况呢?
再来看一个结果
在这里插入图片描述
这个在后面说道group by的时候大家就会明白了。

4.查询在SC表中有成绩的学生信息

分析:分析条件可以知道,需要查询的结果也是涉及到了两张表。那么这次又该怎么样子查询呢?根据题目要求可以隐约的感觉到是在某个范围内查询,而提供的能表示范围的常用的语法有三个,一个是大于小于、一个是利用 between 和and 还有最后一个就是使用 in 条件。那么这个场景最好使用的就是 in。

select * from Student 
WHERE Sid in
(  
   select sid FROM SC 
   WHERE score is not NULL
)

在这里插入图片描述

Group by详解

首先通过几个结果的对比来分析一下。要求按照性别对学生表进行分组操作。会看到这个结果与我们想要的结果不太一样。

SELECT * from Student
GROUP BY Ssex;

在这里插入图片描述
首先需要理解一下,group by其实就是一个聚合函数的使用。也就是说在执行了group by ssex这个语句之后,数据库中其实有一步操作就是关于将所有与ssex有关的数据进行了合并,然后按照合并后的结果进行展示那么我们在看一个效果
在这里插入图片描述
只有两个结果,而作为一个聚合函数来说就是输入多个数据然后输出一个数据来操作的。例如count , sum ,avg 等等。

那么下面这个情况又怎么去理解呢?

SELECT * from Student
GROUP BY Ssex,Sid;

在这里插入图片描述
将多个条件作为group by的字段,可以将多个字段看成是一个字段,也就是说两个条件同时满足进行合并。

总结

通过上面的例子,对于比较常用的几个面试题做了详细的分析与说明,并且给出了笔者的参考答案以及结果。对于每个题都给出了分析的思路,也是为了帮助大家可以更快的找到学习SQL的窍门。可以更加高效的组织数据的查询操作,后期还会有跟多的场景以及面试题与大家一起分享。

猜你喜欢

转载自blog.csdn.net/nihui123/article/details/90452750