Java学习手册:Java数据库面试问题

1、Java学习手册:Java基础知识点
2、Java学习手册:Java面向对象面试问题
3、Java学习手册:Java集合、泛型面试问题
4、Java学习手册:Java并发与多线程面试问题
5、Java学习手册:Java虚拟机面试问题
6、Java学习手册:Java IO面试问题
7、Java学习手册:Java反射机制面试问题
8、Java学习手册:Java网络编程面试问题
9、Java学习手册:Java异常面试问题
10、Java学习手册:Java设计模式面试问题
11、Java学习手册:Java数据库面试问题


一、如何通过JDBC访问数据库?

Java学习手册:如何通过JDBC访问数据库?


二、JDBC中Class.forName的作用是什么?

Java学习手册:JDBC中Class.forName的作用是什么?


三、JDBC中getString()方法与getObject()方法有什么区别?

Java学习手册:JDBC中getString()方法与getObject()方法有什么区别?


四、JDBC中Statement、PreparedStatement和CallableStatement的区别

Java学习手册:JDBC中Statement&PreparedStatement&CallableStatement


五、数据库原理

Java学习手册:数据库原理


六、什么是SQL注入?如何防止SQL注入?

什么是SQL注⼊: 通过sql语句的拼接达到⽆参数查询数据库数据⽬的的⽅法。

如将要执⾏的sql语句为 select * from table where name = “+appName+”,利⽤appName参数值的输⼊,来⽣成恶意的sql语句。

因此可以采⽤PrepareStatement来避免Sql注⼊,在服务器端接收参数数据后,进⾏验证,此时PrepareStatement会⾃动检测,⽽Statement不⾏,需要⼿⼯检测。

使用PrepareStatement,可以防止sql注入攻击,sql的执行需要编译,注入问题之所以出现,是因为用户填写 sql语句参与了编译。使用PrepareStatement对象在执行sql语句时,会分为两步,第一步将sql语句 “运送” 到mysql上预编译,再回到java端拿到参数运送到mysql端。预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的语法结构了。用户填写的 sql语句,就不会参与编译,只会当做参数来看。从而避免了sql注入问题。


七、解释下驱动(Driver)在JDBC中的⻆⾊

JDBC驱动提供了特定⼚商对JDBC API接⼝类的实现,驱动必须要提供java.sql包下⾯这些类的实现:Connection, Statement, PreparedStatement,CallableStatement, ResultSet和Driver。


八、什么时候使⽤CallableStatement?⽤来准备CallableStatement的⽅法是什么?

CallableStatement⽤来执⾏存储过程。存储过程是由数据库存储和提供的。存储过程可以接受输⼊参数,也可以有返回结果。⾮常⿎励使⽤存储过程,因为它提供了安全性和模块化。准备⼀个CallableStatement的⽅法是:

CallableStament.prepareCall();

九、数据库连接池是什么意思?

像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客⼾端数量增加的时候,会消耗⼤量的资源,成本是⾮常⾼的。可以在应⽤服务器启动的时候建⽴很多个数据库连接并维护在⼀个池中。连接请求由池中的连接提供。在连接使⽤完毕以后,把连接归还到池中,以⽤于满⾜将来更多的请求。


十、DDL与DML

(1)DDL(data definition language)数据定义语言

主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上,包括:CREATE、ALTER、DROP等。

(2)DML(data manipulation language)数据操作语言

主要是对数据库的数据进行一些操作,包括:SELECT、UPDATE、INSERT、DELETE等。


十一、索引

1、索引的定义

数据库索引好比是一本书前面的目录,能加快数据库的查询速度。索引是对数据库表中一个或多个列(例如,employee 表的姓氏 (lname) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

2、建立索引的优缺点

优点:

  • 1、大大加快数据的检索速度;
  • 2、创建唯一性索引,保证数据库表中每一行数据的唯一性;
  • 3、加速表和表之间的连接;
  • 4、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;

缺点:
索引的好处是特别明显的,那就是大大的提高了查询的速度。但是相对应的也带来了一些不好的地方。

  • 第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
  • 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  • 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
3、索引的类型

根据数据库的功能,可以在数据库设计器中创建索引:唯一索引、主键索引和聚集索引。 尽管唯一索引有助于定位信息,但为获得最佳性能结果,建议改用主键或唯一约束。

  • 唯一索引:UNIQUE
    例如:create unique index stusno on student(sno);
    表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。

  • 主键索引:primary key
    数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

  • 聚集索引(也叫聚簇索引):cluster
    在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。

4、为什么需要索引?

数据在磁盘上是以块的形式存储的。为确保对磁盘操作的原子性,访问数据的时候会一并访问所有数据块。磁盘上的这些数据块与链表类似,即它们都包含一个数据段和一个指针,指针指向下一个节点(数据块)的内存地址,而且它们都不需要连续存储(即逻辑上相邻的数据块在物理上可以相隔很远)。

在查找的时候,首先找到这个表的第一条记录所在的数据库地址,然后发现Identity为1,并不是所需要的值,然后在这个数据库的底端,找到了下一个数据块的地址。(这个类似于链表),如此一来,查询了5次才找到了所需要的值。(为了简单起见,我们考虑Identity不能有重复值)。好比链表的查找,速度相对慢一些。

为了加快搜索速度,这里就出现了索引。索引是对某个字段进行排序的一种方式。对表中的某个字段建立索引会创建另一种数据结构,其中保存着字段的值,每个值又指向与它相关的记录。这种索引的数据结构是经过排序的,因而可以对其执行二分查找。

通俗的来讲,就是根据你指定的列,建立一个遵循一定数据结构的区域,这些区域可以快速定位到相应数据库字段所在的磁盘地址。

5、索引的好处?

索引是对数据库表中一个或多个列的值进行排序的结构。MySql中索引是B+树,在查找时可以利用二分查找等高效率的查找方式,以O(lg n)的时间找到。因此索引可以加快查询速度。

6、哪些情况需要建立索引?
  • 在经常要搜索的列上
  • 经常出现在where后面的列上
  • 在作为主键的列上
  • 作为外键的列上
  • 经常需要排序、分组和联合操作的字段建立索引
7、哪些情况不适合建立索引?
  • 查询中很少使用的字段
  • 数值太少的字段
  • 唯一性不太差的字段
  • 更新频繁的字段
  • 不会出现在where后的字段
  • 索引适合建立在小字段上,text和blob等大字段不适合建立索引
8、索引的最左匹配原则了解吗?

建了一个(a,b,c)的联合索引,那么实际等于建了(a),(a,b),(a,b,c)三个索引,但是有时在条件查询时只会匹配到a或者(a, b)而不会匹配到(a, b, c)。下面的例子:

SELECT * FROM table WHERE a = 1 AND c = 3; // 使用了索引a,c不走索引
SELECT * FROM table WHERE a = 1 AND b < 2 AND c = 3; // 使用到了索引(a,b),c不走索引

建立联合索引(a, b ,c),所以索引是按照a -> b -> c的顺序进行排序的。a-b-c这样的索引是先找a,然后在范围里面找b,再在范围内找c。 所以上面的语句里的c 会分散在很多个b里面且不是排序的,所以没办法走索引。

举个例子比如(a, b)联合索引,先按a排序再按b排序,得到

(1,1)->(1, 2)->(2, 1)  (2, 4)->(3, 1)->(3, 2)

如果执行select a from table where b=2,就没有使用到(a, b)这个联合索引,因为b的值1,2,1,4,1,2显然不是排序的。

具体来说:MySQL会从左开始一直向右匹配直到遇到范围查询(>,<,BETWEEN,LIKE)就停止匹配,比如: a = 1 AND b = 2 AND c > 3 AND d = 4,如果建立 (a,b,c,d)顺序的索引,使用了索引(a, b, c),但是d是没有走索引的,如果建立(a,b,d,c)的索引,则可以命中索引(a, b, c, d),其中a,b,d的顺序可以任意调整。

等于(=)和in 可以乱序。比如,a = 1 AND b = 2 AND c = 3 建立(a,b,c)索引可以任意顺序。

9、如何建立复合索引,可以使sql语句能尽可能匹配到索引?
  • 等于条件的索引放在前面(最左),范围查询放在后面。 a = 1 AND b = 2 AND c > 3 AND d = 4,建立(a, b, d, c)就是不错的选择。
  • 先过滤后排序(ORDER BY)如SELECT * FROM t WHERE c = 100 and d = ‘xyz’ ORDER BY b建立(c, d, b)联合索引就是不错的选择。
  • 对于索引列的查询,一般不建议使用LIKE操作,像LIKE '%abc’这样的不能命中索引;不过LIKE 'abc%'可以命中索引。
10、建立了索引,索引就一定会被命中吗?或者说索引什么时候失效
  • 使用了not in, <>,!=则不会命中索引。注:<>是不等号
  • innoDB引擎下,若使用OR,只有前后两个列都有索引才能命中(执行查询计划,type是index_merge),否则不会使用索引。
  • 模糊查询中,通配符在最前面时,即LIKE '%abc’这样不能命中索引
  • 对列进行函数运算的情况(如 where md5(password) = “xxxx”)
  • 联合索引中,遇到范围查询时,其后的索引不会被命中
  • 存了数字的char或varchar类型,常见的如用字符串表示的手机号,在查询时不加引号,则不会命中(如where phone=‘13340456789’能命中,where phone=13340456789不能命中)
  • 当数据量小时,MySQL发现全表扫描反而比使用索引查询更快时不会使用索引
11、为什么要使用联合索引?

MySQL5.0之前,一个表一次只能使用一个索引,无法同时使用多个索引分别进行条件扫描。但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引分别进行条件扫描。

  • 减少开销。建了一个(a,b,c)的联合索引,相当于建了(a),(a,b),(a,b,c)三个索引
  • 覆盖索引。减少了随机IO操作。同样的有复合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作
  • 效率高。索引列越多,通过索引筛选出的数据越少。比如有1000W条数据的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W*10%=100w 条数据,然后再回表从100w条数据中找到符合b=2 and c= 3的数据,然后再排序,再分页;如果是复合索引,通过索引筛选出1000w *10% *10% *10%=1w,然后再排序、分页。
12、既然索引可以加快查询速度,索引越多越好是吗?

大多数情况下索引能大幅度提高查询效率,但数据的变更(增删改)都需要维护索引,因此更多的索引意味着更多的维护成本和更多的空间 (一本100页的书,却有50页目录?)而且过小的表,建立索引可能会更慢(读个2页的宣传手册,你还先去找目录?)

13、主键和唯一索引的区别?
  • 主键是一种约束,唯一索引是索引,一种数据结构。
  • 主键一定是唯一索引,唯一索引不一定是主键。
  • 一个表中可以有多个唯一索引,但只能有一个主键。
  • 主键不允许空值,唯一索引允许。
  • 主键可以做为外键,唯一索引不行;
14、聚集索引与非聚集索引的区别?
  • 对于聚集索引,表记录的排列顺序和与索引的排列顺序是一致的;非聚集索引不是
  • 聚集索引就是按每张表的主键构造一棵B+树,每张表只能拥有一个聚集索引;一张表可以有多个非聚集索引
  • 聚集索引的叶子结点存放的是整张表的行记录数据;非聚集索引的叶子结点并不包含行记录的全部数据,除了包含键值还包含一个书签——即相应行数据的聚集索引键。因此通过非聚集索引查找时,先根据叶子结点的指针获得指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录。
15、覆盖索引是什么?

如果一个索引包含(或覆盖)所有需要查询的字段的值,即只需扫描索引而无须回表,这称为“覆盖索引”。InnoDB的辅助索引在叶子节点中保存了部分键值信息以及指向聚集索引键的指针,如果辅助索引叶子结点中的键值信息已经覆盖了要查询的字段,就没有必要利用指向主键索引的主键,然后再通过主键索引来找到一个完整的行记录了。


十二、数据库设计的三大范式?

  • 第一范式1NF: 数据表中的每一列(字段),必须是不可拆分的最小单元,也就是确保每一列的原子性。如订单信息列为orderInfo = “DD1024 2018.5.18”,必须拆分为orderId和orderTime。
  • 第二范式2NF: 在满足第一范式的基础上,表中的所有列都必需依赖于主键(和主键有关系),其他和主键没有关系的列可以拆分出去。通俗点说就是:一个表只描述一件事情。比如order表中有orderId、orderTime、userId和userName,只有前两列依赖于订单表,后两列需要拆分到user表中。
  • 第三范式3NF: 在满足第二范式的基础上,要求数据不能有传递关系。表中的每一列都要与主键直接相关,而不是间接相关(表中的每一列只能依赖于主键)。比如order表中有orderId、orderTime、userId和userName,根据orderId可以查出userId,根据userId又可以查出userName,这就是数据的传递性,完全可以只留下userId这一列。

十三、MySql的事务隔离级别?

  • 读未提交
  • 读已提交
  • 可重复读
  • 串行化

(1)事务的四大特性(ACID)

  • 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):事务开始前和结束后,数据的完整性约束没有被破环。比如A向B转了钱,转账前后钱的总数不变。
  • 隔离性(Isolation):多个用户并发访问数据数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间的数据相互隔离。比如事务A和事务B都修改同一条记录,这条记录就会被重复修改或者后者会覆盖前者的修改记录。
  • 持久性(Durability):事务完成后,事务对数据库的更新被保存到数据库,其结果是永久的。

事务并发可能产生的问题: 脏数据:事务对缓冲池中的行记录进行修改,但是还没有被提交。

  • 脏读:事务A读取到了事务B修改但未提交的数据。如果此时B回滚到修改之前的状态,A就读到了脏数据。
  • 不可重复读:事务A多次读取同一个数据,此时事务B在A读取过程中对数据修改并提交了,导致事务A在同一个事务中多次读取同一数据而结果不同。
  • 幻读:事务A对表进行修改,这个修改涉及到表中所有的行,但此时事务B新插入了一条数据,事务A就会发现居然还有数据没有被修改,就好像发生幻觉一样。

脏读是读取到事务未提交的数据,不可重复度读读取到的是提交提交后的数据,只不过在一次事务中读取结果不一样。

不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
在这里插入图片描述
一般来说,数据库隔离级别不一样,可能出现的并发问题也不同。级别最高的是串行化,所有问题都不会出现。但是在并发下性能极低,可重复读会只会导致幻读。

所以一般使用MySQL默认的可重复读即可。MVCC(多版本并发控制)使用undo_log使得事务可以读取到数据的快照(某个历史版本),从而实现了可重复读。MySQL采用Next-Key Lock算法,对于索引的扫描不仅是锁住扫描到的索引,还锁住了这些索引覆盖的范围,避免了不可重复读和幻读的产生。


十四、现在发现sql查询很慢,如何分析哪里出了问题,应该如何优化?

开启慢查询,查找哪些sql语句执行得慢。使用explain查看语句的执行计划,比如有没有使用到索引,是否启用了全表扫描等。查询慢,很大可能是因为没有使用索引或者索引没有被命中。还有其他的原因,比如发生了死锁,硬件、网速等原因。

优化手段:为相关列添加索引,并且确保索引可以被命中。优化sql语句的编写。


十五、InnoDB和MyISAM引擎的区别?

  • InnoDB支持事务,MyISAM不支持
  • InnoDB是行锁设计,MyISAM是表锁设计
  • InnoDB支持外键,MyISAM不支持
  • InnoDB采用聚集的方式,每张表按照主键的顺序进行存放。如果没有主键,InnoDB会为每一行生成一个6字节的ROWID并以此为主键;MyISAM可以不指定主键和索引
  • InnoDB没有保存表的总行数,因此查询行数时会遍历整表;而MyISAM有一个变量存储可表的总行数,查询时可以直接取出该值
  • InnoDB适合联机事务处理(OLTP),MyISAM适合联机分析处理(OLAP)

十六、COUNT( * )和COUNT(1)的区别?COUNT(列名)和COUNT( * )的区别?

COUNT( * )和COUNT(1)没区别。COUNT(列名)和COUNT( * )区别在于前者不会统计列为NULL的数据,后者会统计。


十七、WHERE和HAVING的区别?

  • WHERE过滤的是行,HAVING过滤分组。
  • WHERE能完成的,都可以用HAVING(只是有时候没必要)
  • WHERE在分组前对数据进行过滤,HAVING在分组后对数据进行过滤
  • WHERE后不能接聚合函数,HAVING后面通常都有聚合函数

十八、MySQL中JOIN和UNION什么区别?

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相同的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。默认情况下,UNION会过滤掉重复的值。使用 UNION ALL则会包含重复的值。

JOIN 用于连接两个有关联的表,筛选两个表中满足条件(ON后的条件)的行记录得到一个结果集。从结果集中SELECT的字段可以是表A或者表B中的任意列。

JOIN常用的有LEFT JOIN、RIGHT JOIN、INNER JOIN。

  • LEFT JOIN会以左表为基础,包含左表的所有记录,以及右表中匹配ON条件的记录,对于未匹配的列,会以NULL表示。
  • LEFT JOIN会以右表为基础,包含左表的所有记录,以及右表匹配ON条件的记录,对于未匹配的列,会以NULL表示。
  • INNER JOIN,产生两个表的交集(只包含满足ON条件的记录)

十九、未完待续


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值