面试数据库查询题解析 - 育华助你高薪一臂之力
以下面试题 由已经毕业并工作多日的新晋测试工程师提供
感谢
在找工作的过程中让大家头疼的问题肯定会有数据库的面试题了。
因为什么?因为数据库查询随机性很大变动也很难掌控。但是凭他就想阻碍我们拿到高薪?那是不可能的。
在接下来的几天内Colin老师陆续给大家推出数据库查询面试题解析。
将我们面试中出现过的数据库查询题目进行一对一的解析。不论是刚找工作还是要换工作的同志们助拿高薪一臂之力。
其实数据库题目并没有大家想想的那么困难,一说到数据库就好像碰到了不可触碰的壁垒。有多少童鞋就是因为数据库和心仪offer错失交臂。以至于在心里深深的已将数据库归纳成了自己的不可抗力因素了。
接下来我们来看看数据库的魅力。
面试题:
Book |
|||
bookID |
bookName |
authorID |
press |
author |
|||
name |
authorID |
age |
sex |
图书表(图书号,图书名称,作者编号,出版社)
作者表(作者名称,作者编号,年龄。性别)
以上经典的数据库面试题展示内容,不再是我们学习中看到过那种有行有列有数据的二维表了。大家要习惯去分析表中的重点:表名,列名,关系。
就本题而言,我们能够看出有两张表,当然题目也有说明
1:图书表(包含:图书号,图书名称,作者编号,出版社)4列
2:作者表(包含:作者名称,作者编号,年龄。性别)4列
第一:我们需要做的是分析两张表有没有什么关系;
如果两表之间有关系的话就必然会存在主键和外键;
通过主键和外键我们就能得到哪一张表是多的一方,那张表是少的一方
例如(有外键的表就是多的一方,那么另外一张表就是少的一方了。)
是不是很好理解!
在这两张表中我们发现都存在共同列名那就是作者编号 那么这列绝对就是我们要的主键列和外键列。
第二:根据我们的理解去找到主键和外键;
对于作者表中的作者编号,我觉得肯定是不可能出现作者编号重复的数据,所以作者表中的作者编号就是唯一的,并且这一列数据也不可能是空值,那么就满足了主键特性(唯一,非空)还有一个被外键引用。
这样我们就知道了图书表中的作者编号肯定是引用了作者表中的作者编号。
那么以上结论的出作者表中的作者编号是作者表的主键,而图书表中的作者编号是外键。
那么根据外键出现的表就是多的一方,另外一张和他有关系的表就是少的一方。从而得出这两张表的关系是一对多的关系
第三:找到关系,分析出去除笛卡尔积的条件;
在进行两表联查的时候我们的判断条件就是多的一方表的外键 = 少的一方的主键值。
也就是 图书表.作者编号 = 作者表.作者编号
两张表的关系,主外键,以及判断条件我们都找到了,
接下来就开始做题吧
第一问:用sql语句查询年龄小于平均年龄的作者名称,图书名称和出版社?
分析:
读题:“用sql语句查询”
看到这不用多想 查询关键字安排走起
select
读题:“年龄小于平均年龄”
很明显这个就是条件啦,年龄在表中查到的名字是 age
age < avg(age)
然而写条件就一定要写 where 条件引出关键字 那么在加上我们的条件就可以啦
where age < avg(age)
但是写完后总觉得有点不对。是哪儿有问题呢?对了就是聚合函数
大家都知道 where 后面是不能使用聚合函数avg()的。having后面可以使用
但是我们现在又没有进行分组;所以按照有having就有group by 的要求我们就不能够写having 。没有having 就不能够使用聚合函数。那怎么办
还好我们还学过子查询,用子查询就可以啦
where avg < (select avg(age) from acthor)
完美!
读题:“的作者名称,图书名称和出版社”
看到这句话我们就知道这是我们要查找的数据
根据sql语句查询语句的排序这段内容应该出现在 select后面
select 作者名称,图书名称,出版社 from 表名
写完我们要查找的数据列名后我们就要分析一下这些列来自哪些表,然后把表名写在from 的后面就完成啦
那我们来看一下。
图书表(图书号,图书名称,作者编号,出版社)
作者表(作者名称,作者编号,年龄。性别)
我们要查询的三列分别来自这两张表 那么很明显我们需要的就是两表联查
首先:我们知道了 这两张表 一个是author 作者表我们给他取了一个别名 叫a 另外一个表叫book 图书表 我们也给他取了一个别名叫b
from author a,book b
那么接下来我们就要想到 既然是两表联查 就肯定需要去除笛卡尔积的条件 这个条件就是我们一开始分析后找到的条件
b.authorID = a.authorID
图书表的作者编号 = 作者表的作者编号
到此我们找到
关键字 select
要查询的内容 a.name,b.bookname,b.press
来自表名 from author a,book b
以及条件两个
where b.authorID = a.authorID
and a.age < (select avg(age) from author)
最后我们调整一下各自的出场顺序最终的结果就是
答案:
select a.name, b.bookname, b.press from author a,book b where b.authorID = a.authorID and a.age < (select avg(age) from author);
以上数据库表的分析给大家讲解完了之后我们来试一下
自己试着分析一下第二题。逆向思维:给大家答案自己分析写这个答案的原因!
第二题:哪本书是重复的 展示出书名?
答案:
select bookname from book group BY bookname having count(bookname)>1
第三题思考:下面这道题有些难度。大家试着分析。下一期Colin老师在给大家分析!
题目:删除 图书表中图书名和作者编号同时重复的数据, 重复记录剩一条。
育华志愿两周年