数据库面试整理

Posted qianbin

tags:

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

概念

1、什么是视图?以及视图的使用场景有哪些?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

  • 只暴露部分字段给访问者,所以就建一个虚表,就是视图。
  • 查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异

2、触发器的作用?

触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

3、什么是存储过程?用什么来调用?

存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。 调用: 1)可以用一个命令对象来调用存储过程。 2)可以供外部程序调用,比如:java程序。

 

4、存储过程的优缺点?

优点: 1)存储过程是预编译过的,执行效率高。 2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。 3)安全性高,执行存储过程需要有一定权限的用户。 4)存储过程可以重复使用,可减少数据库开发人员的工作量。 缺点:移植性差

5、索引的作用?和它的优点缺点是什么?

索引就一种特殊的查询表,数据库的搜索可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。

6、什么样的字段适合建索引

唯一、不为空、经常被查询的字段

7、什么是事务?什么是锁?

事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 锁:在所以的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

8、什么叫视图?游标是什么?

视图:是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改会影响基本表。它使得我们获取数据更容易,相比多表查询。 游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

9、视图的优缺点

优点: 1)对数据库的访问,因为视图可以有选择性的选取数据库里的一部分。 2 )用户通过简单的查询可以从复杂查询中得到结果。 3 )维护数据的独立性,试图可从多个表检索数据。 4 )对于相同的数据可产生不同的视图。 缺点: 性能:查询视图时,必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,那么就无法更改数据

10、列举几种表连接方式,有什么区别?

内连接、自连接、外连接(左、右、全)、交叉连接

内连接:只有两个元素表相匹配的才能在结果集中显示。

外连接: 左外连接: 左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。

             右外连接: 右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。

             全外连接:连接的表中不匹配的数据全部会显示出来。

交叉连接: 笛卡尔效应,显示的结果是链接表数的乘积。

12、主键和外键的区别?

主键在本表中是唯一的、不可唯空的,外键可以重复可以唯空;外键和另一张表的主键关联,不能创建对应表中不存在的外键。

13、在数据库中查询语句速度很慢,如何优化?

1.建索引

2.减少表之间的关联

3.优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据 量大的表排在前面

4.简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

5.尽量用PreparedStatement来查询,不要用Statement

 14、数据库三范式是什么?

第一范式:列不可再分

第二范式:行可以唯一区分,主键约束

第三范式:不存在传递依赖。且三大范式是一级一级依赖的,第二范式建立在第一范式上,第三范式建立第一第二范式上

15、union和union all有什么不同?

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。

UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。 从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

16、Varchar和varchar有什么区别?

Char的长度是固定的,而varchar的长度是可以变化的,比如,存储字符串“abc”对于char(20),表示你存储的字符将占20个字节,包含17个空,而同样的varchar2(20)只占了3个字节,20只是最大值,当你存储的字符小于20时,按实际长度存储。 char的效率要比varchar2的效率高。 目前varchar是varchar2的同义词,工业标准的varchar类型可以存储空字符串,但是oracle不能这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型varchar2,这个类型不是一个标准的varchar,他将在数据库中varchar列可以存储空字符串的特性改为存储null值,如果你想有向后兼容的能力,oracle建议使用varchar2而不是varchar

17、Oracle语句有多少类型

Oracle语句分三类:DDL、DML、DCL。

 

数据定义语言DDL(Data Definition Language),包括: Create语句:可以创建数据库和数据库的一些对象。

                                                                               Drop语句:可以删除数据表、索引、触发程序、条件约束以及数据表的权限等。

                                                                               Alter语句:修改数据表定义及属性。

                                                                               Truncate语句:删除表中的所有记录,包括所有空间分配的记录被删除。

数据操控语言DML(Data Manipulation Language),包括: Insert语句:向数据表张插入一条记录。

                                                                                    Delete语句:删除数据表中的一条或多条记录,也可以删除数据表中的所有记录,但是它的操作对象仍是记录。

                                                                                    Update语句:用于修改已存在表中的记录的内容。

数据库控制语言DCL(Data Control Language),包括: Grant语句:允许对象的创建者给某用户或某组或所有用户(PUBLIC)某些特定的权限。

                                                                               Revoke语句:可以废除某用户或某组或所有用户访问权限

18、order by与group by的区别

order by 排序查询、asc升序、desc降序

group by 分组查询、having 只能用于group by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group by 子句的查询语句需要使用聚合函数。

 

19、MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引

  • 索引加快数据库的检索速度
  • 索引降低了插入、删除、修改等维护任务的速度
  • 唯一索引可以确保每一行数据的唯一性
  • 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
  • 索引需要占物理和数据空间

 

20、数据库的乐观锁和悲观锁是什么?

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。 

乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段。

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

21、 超键、候选键、主键、外键分别是什么?

超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键

候选键:是最小超键,即没有冗余元素的超键。

主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

外键:在一个表中存在的另一个表的主键称此表的外键。

 

SQL语句

 

1、1.创建数据库。要求用SQL语句创建满足如下要求的数据库:
(1)数据库名称为School;
(2)主数据文件:逻辑名为SchoolData,文件名为“D:\\School\\SchoolData.mdf”,文件初始大小为50MB,文件的最大大小不受限制,文件的增长率为20%。

(3)日志文件:逻辑名为SchoolLog,文件名为“D:\\School\\SchoolLog.ldf,”文件初始大小为10MB,文件的最大大小为50MB,文件的增长率为1MB;

 

 

create database School    
on primary    
(name=SchoolData,    
filename=D:\\School\\SchoolData.mdf,    
size=50MB,    
maxsize=unlimited ,    
filegrowth=20%)    
log on( name=SchoolLog, filename=D:\\School\\SchoolLog.ldf, size=10MB, maxsize=50MB, filegrowth=1MB )

 

2.创建数据类型和表,增加约束。

(1)表tblstudent(学生表):

技术分享图片

create table tblstudent(    
stuID bigint primary key,    
stuName nvarchar(10) not null,    
stuSex nchar(1) not null,    
stuBirth datetime,    
stuNum nvarchar(18) unique,    
Departed int,    
City nvarchar(10) default 杭州 ,//设置默认值    
constraint ck_tblstudent_stusex check(stuSex IN(,) ),//建立约束    
constraint ck_tblstudent_stuBirth check(stuBirth<getdate())    
)     

 

2)表tblscore(成绩表):

技术分享图片

create table tblscope(    
stuID bigint ,    
Math int,    
English int,    
Computer int,    
Summary int,    
/*建立外键约束*/    
constraint stuID_FK foreign key (stuID) references tblstudent(stuID),    
constraint ck_tblscope_Math CHECK(Math between 0 and 100 or Math is null),    
constraint ck_tblscope_English CHECK(English between 0 and 100 or English is null),    
constraint ck_tblscope_Computer CHECK(Computer between 0 and 100 or Computer is null)    
)    

 

3.使用SQL语句插入下表中的数据:

技术分享图片

/*批量插入,当添加一条新的记录时,可以省略字段名,但每个字段都必须有值)*/    
insert into tblscope values(1001,70,80,90,null),(1002,45,55,60,null);  <strong>  
</strong>  

 

4.找出总成绩最高的学生的学号和姓名

/*第一步:从tblscope表中找出最高成绩*/    
select  max(Math+English+Computer) from tblscope     
    
/*第二步:从tblscope表中找出总成绩=最高分的那位学生ID*/    
select stuID from tblscope group by stuID having     
sum(Math+English+Computer)=(select  max(Math+English+Computer) from tblscope )    
    
/*第三步:根据最高分查出来的学生stuID再来查询学生信息*/    
select stuID,stuName from tblstudent where stuID=    
(select stuID from tblscope group by stuID having     
sum(Math+English+Computer)=(select  max(Math+English+Computer) from tblscope ))  

 

5.统计男生女生的人数

select stuSex as 性别,count(*) as 人数 from tblstudent group by stuSex 

查询结果:

技术分享图片

 

 

 

            

摘自: https://www.2cto.com/database/201710/688377.html

           https://www.cnblogs.com/remember-forget/p/6140112.html

           http://blog.csdn.net/beauxie/article/details/52946590#

 





以上是关于数据库面试整理的主要内容,如果未能解决你的问题,请参考以下文章

面试常用的代码片段

面向面试编程代码片段之GC

小程序各种功能代码片段整理---持续更新

常用python日期日志获取内容循环的代码片段

前端面试题之手写promise

面试Spring 事务面试考点吐血整理(建议珍藏)