Java面试之数据库篇

1.什么是存储过程?有哪些优缺点
答:存储过程是一些预编译的SQL语句。它是由一些T-SQL语句组成的代码快,这些SQL语句就像是一个方法一样实现一些功能,例如对单表或者多表的增删改查,然后给这个代码块取一个名字,再用到的时候调用它就行了。

  • 存储过程是一个预编译的代码块,执行效率比较高。
  • 一个存储过程代替大量的SQL语句,可以降低网络通信量,提高通信速率
  • 可以再一定程度上保证数据安全

2.索引是什么?有什么作用及其优缺点?
答:索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构。也可以理解为索引就算加快索引表中数据的方法,数据库索引类似于书籍的索引。在数据库中,索引允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
MySQL数据库中几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引。
- 索引加快数据库的检索速度
- 索引降低了插入、删除、修改等维护任务的速度
- 唯一索引可以确保每一行数据的唯一性
- 通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
- 索引需要占物理和数据空间
以下设置了索引无法使用:
- 以%开头的like语句,模糊匹配
- or语句前后都没有同时使用索引
- 数据类型出现隐式转换

3.JDBC连接

  1. 加载驱动类,注册驱动
  2. 通过DrivrManager获取数据库连接
  3. 通过connection创建statement
  4. 通过statement执行sql语句,返回结果集
  5. 操作resultSet结果集
  6. 回收数据库资源,晚声明的先关闭

4.储存过程
答:储存过程是一组为了完成特定功能的sql语句集,经编译后储存在数据库中,用户通过制定储存过程的名字给定参数来执行。
优点:

  1. 储存过程可以用流控制语言编写,可以完成复杂的判断和运算,灵活性好;
  2. 储存过程被创建后,可以程序中多次调用,而不必重新编写该储存过程的sql语句;
  3. 储存过程能实现比较块的执行速度;
  4. 储存过程减少网络流量
  5. 储存过程可以被用作一种安全机制来充分利用

5.sql优化
1.用exists代替in
2、尽量避免在索引列上使用计算
3、避免在索引列上使用is null和is not null
4、当只要一行数据时使用limit1
5、为搜索字段建立索引
6、避免select *
7、尽可能使用not null
8、数据区分度不大的字段不宜使用索引
9、把计算放到业务层而不是数据库层

6.数据库事务的隔离级别

  1. 可读取未确认
    写事务阻止其他事务,避免更新遗失,没有其他阻止读事务(存在脏读问题,就是另一个事务还没有提交最终数据,这个读事务读取了中途数据)

  2. 可读取确认
    写事务会阻止其他读写事务,读事务不会阻止其他事务(存在不可重复度问题,就是一次事务之间进行两次读取,两次结果不一样)

  3. 可重复读
    读事务会阻止其他写事务,不会阻止其他读事务(存在幻读问题,就是阻止update和delete操作但无法阻止insert,两次读取数量有差别)

  4. 可串行化
    读加共享锁,写加排它锁,读取事务可以并发,读写,写写事务之间互斥。

Mysql的默认隔离级别是可重复读


6.事务的基本特征:
答:1.事务的原子性:一个事务必须视为不可分割的最小工作单元,整个事务中的所有操作要么全部提交,咬着全部失败回滚,对于一个事务来说,不可能只执行一部分操作,这就是事务的原子性。
2.一致性:数据库总是从一个一致性状态转换到另一个一致性的状态
3.隔离性:一个事务所做的修改在最终提交前,对其他事物是不可见的
4.持久性:一旦事务提交,则其所做的修改就会永久保存在数据库中。

7.说一说脏读,不可重复读,幻读?
答:脏读:事务A读取了事务B更新的数据,然后B回滚数据,那么A读取到的数据是脏数据,即是脏读。
不可重复读:事务A多次读取同一数据,事务B在事务A读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,读出的数据结果不一致。
幻读:事务A首先根据索引查询出N条数据,然后事务B改变了这N条数据之外的M条或者增添了条件符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。

8.数据表类型有哪些?
答:MyISAM,InnoDB。

9.分别介绍一下MyISAM和InnoDB。
答:MyISAM:是默认表类型,它是传统的ISAM类型,ISM是有索引的顺序访问方法,它是储存记录和文件的标准方法,它不是事务安全,而且也不支持外键,如果执行大量select操作MyISAM比较适合。
InnoDB:支持事务安全的引擎,支持外键、行锁,事务是他最大的特点,如果有大量的uodate和insert’建议使用InnoDB,特别是针对多个并发和QPS(每秒查询率)较高的情况下。但是并发事务会带来几个问题,就是更新丢失,脏读,不可重复读,幻读。

10.innoDB引擎的四大特征
答:插入缓冲;二次写;自适应哈希索引;预读

11.InnoDB中的行锁是通过加在什么上实现的。
答:基于索引

12.MySQL中MyISAM和innoDB的区别
答:1.InnoDB支持事务,MyISAM不支持事务
2.InnoDB支持行级锁,而MyISAM支持表级锁
3.InnoDB支持MVCC,而MyISAM不支持
4.InnoDB支持外键,而MyISAM不支持。
5.InnoDB不支持全文索引,而MYiSAM支持
6.InnoDB是索引组织表,MyISAM是堆表

13.MyISAM和InnoDB中select count(*)哪个更快,为什么?
答:MyISAM更快,因为MyISAM内部维护了一个计数器,可以直接调用。

-----------------------下面三道为面试高频题目---------------------------

14.数据库三大范式!!
答:首先,范式是什么,就是在设计关系数据库时,遵循不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求就被称为范式。越高的范式数据库的冗余越小。
第一范式: 数据库表中的字段都是单一属性的,不可再分(保持数据的原子性)
第二范式: 第二范式必须符合第一范式,非主属性必须完全依赖主键。(完全依赖要求不允许存在非主属性依赖于主键中的某一部分属性)
第三范式: 在满足第二范式的基础上,在实体中不存在其他实体中的非主键属性,传递函数依赖于主键属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

最后,三大范式只是一个设计数据库的理念,可以建立冗余较小,结构合理的数据库,但是并不是一定要遵循三大范式设计,如果有特殊情况的话也要特殊对待。数据库设计最重要的还是看需求和性能。

15.说一说sql语句优化
答:1.避免使用select *查询,将想要查询的字段列出来。
2.使用连接(join)来代替子查询
3.使用limit对查询结果的记录进行限定
4.用exists代替in是一个好的选择
5.用where子句替代HAVING子句,因为HAVING只会在检索出所有记录之后才会对结果进行过滤;
6.不要再where子句=左边进行函数,算术运算或者其他表达式运算,否则系统将可能无法正确使用索引。
7.避免在where子句中对字段进行null值判断,这将会导致索引没法用而进行全表扫描
8.尽量避免where子句使用or来连接条件,否则将会导致引擎放弃使用索引而进行全表扫描。
9.尽量避免使用!=或<>操作符,否则将引擎放弃索引而使用全表扫描

16.说一说表结构优化。
答:1.选择正确的引擎
2.使用可存下数据的最小的数据类型
3.使用enum,char而不是varchar
4.尽可能使用not null定义字段,给空字段设置默认值
5.给频繁使用和查询的字段建立合适的索引。

17.说几个mysql中你常用的函数?
答:sum,count,avg,top,min,max等等

18.说几个处理增删改查之外常用的关键字?
答:distinct(不重复),limit(选取行数),order by,group by,union,union all,between

19.说几个除了增删改查之外常用的命令?
答:Explain、describe(desc table用于展示出表的所有列)、show、truncate(当你不再需要该表时, 用 drop;当你仍要保留该表,但要删除所有记录时, 用 truncate;当你要删除部分记录时, 用 delete.)

20.union 和 union all的区别?
答:union会在进行表连接后筛选掉重复的记录,union all不会去除重复的记录。对排序的处理:union会将字段的顺序进行排序,union all只是简单的将两个结果合并后就返回;从效率上来说union all要比union快很多。

21.varchar(20)和int(20)含义一样吗?
答:不一样,前一个表示最多只能存放20个字符,后者表示最多显示20个字符,但存储空间还是占4个字节,储存范围不变。

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

23.储存过程和触发器的区别
答:触发器和存储过程非常相似,触发器也是sql语句集,两者唯一的区别就是触发器不能用EXECUTE语句调用,而是在用户在执行T-SQL语句时自动触发执行。触发器是一个在修改了指定表中的数据时执行的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。

24.MySQL主要的索引类型
答:1.普通索引:是最基本的索引
2.唯一索引:索引列必须唯一,但允许有空值
3.主键索引:是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。
4.单列索引:以上都是单列索引
5.组合索引:是指在多个字段上创建的索引。只有查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左缀集合。
6.全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较,mysql中MyISAM支持全文索引而InnoDB不支持;

25.使用索引注意事项
答:索引不会包含有NULL的列,复合索引中只要有一列包含Null值,那么这一列对于此索引就是无效的;
mysql查询只使用一个索引,因此数据库默认排序可以符合要求的情况下不要使用排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建立复合索引。
注意like后面如果是“%AABB”或者“%AABB%”那么是不会使用索引的。
不使用NOT IN,<>,!=操作,这些操作符也不会使用索引,但>,>=,=<,<=,BETWEEN,IN这些都是可以用到索引。
索引要建立在经常查询操作的字段上,索引要建立在值比较唯一的字段上,

26.说一说什么是外键,优缺点:
答:外键指的是外键约束,目的是保持数据一致性,完整性,控制存储在外键表中的数据,控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值。
优点:有数据库自身保证数据一致性,完整性,更可靠。因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器出现问题的时候,也能最大限度的保证数据的一致性和完整性。还有就是有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要,外键在一定程度上说明了业务逻辑,会使设计周到具体全面
缺点:过分使用外键会增加开发难度,更改业务困难,扩展困难等等。不用外键数据管理更加简单操作方便,性能更高。

27.在什么时候你会选择使用外键,为什么
答:在我的业务逻辑非常简单,业务一旦确定不会轻易修改,表结构简单,业务量小的时候我会选择使用外键。因为当不符合以上条件的时候,外键会影响业务的扩展和修改,当数据量庞大时,会影响增删改查的效率。

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

29.mysql有没有rowid?
答:没有,InnoDB如果没有定义主键,内部会生成一个主键编号rowid ,但是无法查询到。在平时InnoDB建表的时候我们最好自己确定主键,防止每次插入数据前数据库会去生成rowid。

你可能感兴趣的:(Java面试,Java面试)