考研复试数据库原理面试题(二)SQL、索引、存储过程、触发器

写作目的:为了应对考研复试中的面试,我整理了导师可能提问的地方,力求用口语化的语言描述出来。

这只是一部分,陆续还有数据库原理的其它章节,还会推出数据结构、计算机网络复试题整理。

数据库原理我的参考书是《数据库原理及应用第二版(雷景生)》,因为一些机缘巧合选择了这本书。不过没关系,网上有很多关于数据库原理的面试题,而且答案也很容易搜到。思维导图在我的processon。如果对你有帮助就打赏一下吧。

https://www.processon.com/view/link/5e7e0107e4b027d999d2cb1d

还有其它系列的面试题整理

考研复试计算机组成原理面试题

考研复试操作系统面试题

目录

sql语言的特点和功能

三种模式与SQL的关系?

SQL各部分的的执行顺序?

什么是存储过程?

什么是触发器?

存储过程和函数区别?​

什么情况下用存储过程什么情况下不用?

存储过程的优缺点

什么是最左匹配原则

为什么索引底层用B+树而不用B树、红黑树、hash

索引的优点和缺点


sql语言的特点和功能

sql全程是结构化查询语言。它的功能是数据查询DQL、数据操纵DML、数据定义DDL、数据控制DCL。

特点是:①语言集的风格综合统一;②高度非过程化,只需要指出“做什么”,不用说“怎么做”;③面向集合操作方式;④同一种语言提供两种使用方式(自含式语言、嵌入式语言),灵活方便;⑤简单易学。

sql语言的动词:

DQL:SELECT

DDL:CREATE DROP ALTER

DML:INSERT UNDATE DELETE

DCL:GRANT REVOKE

三种模式与SQL的关系?

sql支持关系数据库三级模式结构。

外模式对应视图和部分基本表;模式对应基本表;内模式对应于存储文件。

SQL各部分的的执行顺序?

先根据where子句给出的条件从from子句指定的基本表或视图中找出满足条件的元组;然后,再按照select子句中的目标列选出元组中的属性值形成结果。如果有group by的话,则按照条件进行分组,如果有having的话,则只是给定的组才能输出。如果有order by则按照条件进行升序或降序。

什么是存储过程?

一组为了完成特定功能的sql语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果需要参数)来执行它。

什么是触发器?

是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件触发,比如对一个表进行增删改(insert、delete、update)操作会激活执行它。

存储过程和函数区别?​

①返回值区别:函数有1个返回值,而存储过程是本质上没有返回值,但可以通过设置输出参数方式输出(输入:in ,输出:out ,输入输出:in out );

②调用区别:函数可以嵌入在sql中使用的,可以在select中调用,而存储过程必须单独调用;​

什么情况下用存储过程什么情况下不用?

1、当一个业务同时对多个表进行处理的时候采用存储过程比较合适。

2、复杂的数据处理用存储过程,如有些报表处理

3、多条件多表联合查询,并做分页处理

存储过程的优缺点

优点:

1. 运行速度:存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用,所以执行速度会比普通sql快。

2. 减少网络传输:存储过程直接就在数据库服务器上跑。

3. 可维护性:因为可以实时更新DB端的存储过程, 有些bug,直接改存储过程里的业务逻辑就搞定了。

4. 增强安全性:提高代码安全,防止 SQL注入。这一点sql语句也可以做到。

5. 可扩展性:应用程序和数据库操作分开,独立进行,而不是相互在一起。方便以后的扩展和DBA维护优化。

缺点:

1. SQL本身是一种结构化查询语言,但不是面向对象的的,本质上还是过程化的语言,面对复杂的业务逻辑,过程化的处理会很吃力。同时SQL擅长的是数据查询而非业务逻辑的处理,如果如果把业务逻辑全放在存储过程里面,违背了这一原则。

2. 如果需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则仍需要更新程序集中的代码以添加参数、更新调用,等等,这时候估计会比较繁琐了。

3. 开发调试复杂,由于编程工具的问题,存储过程的开发调试要比一般程序困难。

4. 没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。如果缓存并发严重,经常要加锁,那效率实在堪忧。

5. 不支持群集,数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

什么是最左匹配原则

一句话说不清,不敢往上写。

为什么索引底层用B+树而不用B树、红黑树、hash

红黑树在增加删除时会进行频繁的调整,来保证红黑树的性质,会影响性能。

hash的速度虽然在随机访问时非常快,但是在顺序查找时非常鸡肋。

B+树的优势:

1、 B+树的磁盘读写代价更低:B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

2、B+树的查询效率更加稳定:由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

3、由于B+树的数据都存储在叶子结点中,分支结点均为索引,方便扫库,只需要扫一遍叶子结点即可,但是B树因为其分支结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树用于数据库索引。

4、B+树适合范围查找,顺序遍历叶节点即可。而B树在范围查找时比较鸡肋。

索引的优点和缺点

索引的缺点:首先,索引需要占用一定的空间,创建和维护索引需要消耗时间;其次对表进行增加删除时索引也要动态维护,降低了维护速度;

索引的优点:

1.大大加快数据的检索速度;

2.创建唯一性索引,保证数据库表中每一行数据的唯一性;

3.加速表和表之间的连接;

4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

什么时候应该创建索引,什么时候不应该创建索引

不使用索引的时候

第一,对于那些在查询中很少使用或者参考的列不应该创建索引。

第二,对于那些只有很少数据值种类的列也不应该增加索引。

第三,对于那些数据量要么相当大,要么取值很少的,不应该创建索引。

第四,当修改性能远远大于检索性能时,不应该创建索引。

使用索引的时候

1.主键自动建立唯一索引;

2.频繁作为查询条件的字段应该创建索引;

3.查询中与其他表有关联的字段,例如外键关系;

4.查询中排序的字段创建索引将大大提高排序的速度(索引就是排序加快速查找);

5.查询中统计或者分组的字段;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章