数据库面试题查询题目解析-助力高薪

Posted 育华志远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库面试题查询题目解析-助力高薪相关的知识,希望对你有一定的参考价值。



以下面试题 由已经毕业并工作多日的新晋测试工程师提供

感谢





Colin有话说



不知道通过上次的讲解大家对数据库查询题目的分析有没有自己的理解了呢?

希望大家自己多总结和多整理数据库查询的思路和相关的逻辑。

当然凡事也不要太急于求成

我们需要一步一脚印的踏踏实实的进步!

不管是什么样的数据库难题或者相关的问题

大家都可以给我留言,我们一起讨论研究。

一起努力做到最优!



那我们就继续给大家解决一下我们上一次留下来的那个思考题吧

先回顾下一题目


面试题:


Book

bookID

bookName

authorID

press

author

name

authorID

age

sex

图书表(图书号,图书名称,作者编号,出版社)

作者表(作者名称,作者编号,年龄。性别)


题目:删除 图书表中图书名和作者编号同时重复的数据, 重复记录剩一条。

1:首先我们还是读题分析 关键字和相关的sql语句

读题: "删除"

        前两个自我们就找到了它的关键字 delete

        然后想起他的语法 delete from 表名 where 条件


读题:"图书表"

        通过这三个字的描述我们也就找到了 一张来自的表是 图书表

        from 图书表

        delete from book where 条件

        除此之外我们还要知道这张表中都包含哪些信息

        【图书号,图书名称,作者编号,出版社


读题:"图书名和作者编号同时重复的数据, 重复记录剩一条"

           这句话就是我们删除的核心的条件了

           首先我们知道 图书编号和作者编号在图书表中是存在的

           而我的条件是这两列值同时重复的时候

           也就意味着 图书名重复  and 作者编号也要重复 的时候才可以删除


接下来我们就可以对这两个条件分别进行获取


1:首先是图书名重复

图书名重复也就是说当前这个书名最少要出现两次及以上才能够称之为重复

那我们就来找一下哪些书名是重复出现的

按照以上要求我们得到的sql语句是


select bookname from book group by bookname having count(bookname) > 1


以上sql语句的意思指的是 在book表中查询书名 条件是 根据书名分组 并且分组后书名的总数在一次以上的书名。 


我们通过以上sql语句得到的是这张表中重复出现的书名。但是得到的有可能不止是一个书名还有可能是两个或者多个。那么我们通过这条语句得到的其实就是重复出现的书名的一张表

然后是用子查询的形式在这张表中找到每一个重复的书名

select b.bookname from(select bookname from book  group BY bookname havingcount(bookname)>1) as b

我们给这种表了一个别名 叫b


以上得到的最终结果就是我们重复出现的书名了 [还是要注意重复的书名可能不止一个]


2:作者编号也要重复

我们在找作者编号的时候需要注意了

和上面分析的一样


select  authorid from book group by authorid having count(authorid) > 1


以上sql语句的意思指的是 在book表中查询作者编号 条件是 根据作者编号分组 并且分组后作者编号的总数要在一次以上的作者编号。 

但是我们现在查询的并不在是简单的 authorid 了,为什么?

因为: 重复记录剩一条。

如果按照我们刚刚写的,其实我们已经找到了重复的书名和重复的作者编号。

但是这样删除的那么就不可能做到最后一个要求: 重复记录剩一条。

他会把所有重复的数据全部都删除,一条不留。


为了在保留一条重复的数据我们需要得到重复的作者编号中最小的图书号

【找最小的图书号就是为了保留这一条,因为以后图书出现重复那么哪些重复出现的图书的id编号可定时要大于之前第一次出现的图书id的】


select min(bookid) as i from book group BY authorid having count(authorid)>1


我们给最小的图书id取了一个别名 叫 i

同样以上代码得到的也很有可能不止是一个重复的作者编号对应的最小的图书id

所以使用子查询我们就可以得到每一个重复出现的书的最小编号:


select o.i from (select min(bookid) as i from book group BY authorid having count(authorid)>1) as o



接下来就是进行组装啦:


delete from book where bookname  = 重复出现的书名 and bookid != 最小的图书编号


这样既可以删除那些重复出现的,也可以保留一条重复的数据。

但是我们分析后得知 重复出现的书名以及重复出现作者编号而得到的最小图书编号不是一个值很有可能是多个值

所以我们就需要使用包含或不包含来进行判断

最终:

delete from book where bookname in(select b.bookname from(select bookname from book  group BY bookname havingcount(bookname)>1) as b)

and bookid NOTIN ( select o.i from (select min(bookid) as i from book group BY authorid having count(authorid)>1) as o

);



解释:在book表中删除 (bookname)书名 包含在给出的以查找到的所有重复出现的书名中的书名 

并且 图书编号 不包含 在 重复的作者编号下查找的最小的图书编号。

反之重复的作者编号中不是最小的图书编号就会被删除。



数据库面试题查询题目解析(2)-助力高薪


好啦以上就是给大家分析的内容。有什么问题欢迎留言咨询。


数据库面试题查询题目解析(2)-助力高薪

育华志远两周年


扫描二维码

关注更精彩

育华志远

数据库面试题查询题目解析(2)-助力高薪


点“在看你懂得

以上是关于数据库面试题查询题目解析-助力高薪的主要内容,如果未能解决你的问题,请参考以下文章

Android Framework精编内核解析,助力高薪面试

最强解析面试题:从尾到头打印链表「建议收藏!」

最强解析面试题:从尾到头打印链表「建议收藏!」

最强解析面试题:接雨水...

DP-03动态规划算法题目解析

DP-03动态规划算法题目解析