Java面试题 数据库 & JDBC

Java面试题

数据库 & JDBC

1.数据库三范式是什么

1NF:所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项
2NF:在1NF的基础上,所有非主属性都完全依赖于每一个候选关键属性(在1NF基础上消除非主属性对主码的部分函数依赖)
3NF:在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)

2.SQL分为哪几个大类

DQL:数据查询语言,用于对数据进行查询,如select
DML:数据操作语言,对数据进行增加、修改、删除,如insert、udpate、delete
DCL:数据控制语言,进行授权与权限回收,如grant、revoke
DDL:数据定义语言,进行数据库、表的管理等,如create、drop
DTL:事务控制语言,对事务进行处理,包括begin transaction、commit、rollback

3.SQL 约束有哪几种

非空:NOT NULL -指示某列不能存储NULL值
唯一:UNIQUE-保证某列的每行必须具有唯一的值
主键:PRIMARY KEY -NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速的找出表中的一个特定的记录
外键:FOREIGN KRY-保证一个表中的数据匹配另一个表中的值的参照完整性。
检查:CHECK-保证列中的值符合指定的条件
默认值:DEFAULT-规定没有给列赋值时的默认值。

4.having、where、group by的执行顺序

from where(先过滤单表/视图/结果集,再join)group by having (where过滤的是行,having过滤的是组,所以在group之后)order by

5.什么是事务,事物有哪四个特性(详细解释,其中由隔离性触发的问题有哪些)

事务(Transaction):是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);
事务具有4个属性,通常称为ACID特性:
原子性(atomicity):事务是一个完整的操作。事务的各步操作是不可分的;要么都执行、要么都不执行。
一致性(consistency):当事务完成时,数据必须处于一致状态。
隔离性(isolation):对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
持久性(durability):事务完成后,它对数据库的修改被永久保存,事务日志能保持事务的永久性。
隔离级别分为:ReadUncommitted(读未提交)、Read Committed(读提交)、Repeatable Read(可以重复读)、Serializable(序列化)这4种级别
问题:
脏读:指一个事务读取了另外一个事务未提交的数据。
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。
幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

6.并发下事务会产生哪些问题,可用对应的哪个事务隔离级别来解决
	            脏读  不可重复读	幻读
Read Uncommited	可能	可能	可能
Read commited   不可能	可能	可能
Repeatable Read	不可能	不可能	可能
Serilization	不可能	不可能	不可能
7.Oracle和MySQL的区别(包括默认事务隔离级别)

一、宏观上:
1、Oracle是大型的数据库而Mysql是中小型数据库;Mysql是开源的,Oracle是收费的,且价格昂贵。
2、Oracle支持大并发,大访问量。
3、安装占用的内存也是有差别,Mysql安装完成之后占用的内存远远小于Oracle所占用的内存,并且Oracle越用所占内存也会变多。
二、微观上:
1、对于事务的支持
Mysql对于事务默认是不支持的,而Oracle对于事物是完全支持的。
2、并发性
并发性涉及到资源的获取、共享与锁定。
Mysql以表锁为主,对资源锁定的力度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表的数据。
Oracle使用行级锁,对资源锁定的力度要小很多,只是锁定sql需要的资源,并且加锁是在数据库中的数据行上,不依赖于索引。所以oracle对并发性的支持要好很多。
3、数据的持久性
Oracle保证提交的事务均可以恢复
Mysql默认提交sql语句,但是如果更新过程中出现db或者主机重启的问题,也可能会丢失数据。
4、事务隔离级别
mysql默认的事务处理级别是可重复读
oracle数据库支持读提交和序列化这两种事务隔离级别
5、提交方式
Oracle默认不自动提交,需要手动提交。Mysql默认自动提交。
6、SQL语法的区别
Oracle的SQL语法与MySQL有很大不同。

8.什么是事务的传播行为,为什么要有传播行为

事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。
传播行为分为两种:分为支持事物的传播和不支持事物的传播
保证方法里调用方法与我本身的方法处在同一个事务中,保证事物的一致性。事务的传播特性就是解决这个问题

9.drop table、delete from table和truncate的区别

DELETE:DML语言,可以回退,可以有条件的删除
TRUNCATE TABLE:DDL语言,无法回退,默认所有的表内容都删除,删除速度比delete快
DROP TABLE:用于删除表(表的结构、属性以及索引也会被删除);

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

SQL的三种连接方式分为:左外连接、右外连接、内连接
内连接INNER JOIN:两表关联,保留两表中交集的记录(使用比较运算符来根据指定的连接的每个表都有的列的值来进行匹配连接,如果对应的列值不存在,则连接的所有表对应的该列值都不会进行连接,也就是说都会抛弃)
左外连接LEFT JOIN/LEFT OUTTER JOIN:两表关联,左表全部保留,右表关联不上用null表示(如果左表的某行在右表中没有找到对应的匹配项,那么左表该行在连接表中对应的右表数据都为null;而右表中的某行在坐标中没有找到对应的匹配项,就被抛弃)
右外连接RIGHT JOIN/RIGHT OUTTER JOIN:右表全部保留,左表关联不上的用null表示(与左外连接类似,只不过是右表对应的数据在左表中没有找到匹配项,该行对应的左表数据就被设置为null,左表对应的数据在右表中没有找到匹配项,就被抛弃)
oracle表与表连接有三种方式Nested loop, Hash join, Sort merge join。
Nested Loop就是循环嵌套的连接方法,对于被连接子集都是比较小的话,嵌套循环就是比较好的选择。在嵌套中,内表被外表驱动,外表做一次循环,内表针对外表的每一行做循环。
这种表的返回结果集不能太大,否则就效率实在太低的,而且还要用在表都有索引的情况下才行的。
Sort Merge Join 用在数据没有索引,并且数据必须是都排序号的情况。

11.什么是视图,以及视图的优缺点

数据库视图是虚拟表或逻辑表,它被定义为具有连接的SQL SELECT查询语句。 因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库表查询数据。 大多数数据库管理系统(包括MySQL)允许您通过具有一些先决条件的数据库视图来更新基础表中的数据。
优点:
简单性。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。
安全性。通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既看不见也取不到。数据库授权命令可以使每个用户对数据库的检索限制到特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上。
逻辑数据独立性。视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
缺点:
性能:SQL Server必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,SQL Server也把它变成一个复杂的结合体,需要花费一定的时间。
修改限制:当用户试图修改视图的某些行时,SQL Server必须把它转化为对基本表的某些行的修改。对于简单视图来说,这是很方便的,但是,对于比较复杂的视图,可能是不可修改的。

12.什么是索引,索引的分类,索引有哪些优缺点,建立索引有哪些原则

索引在MySQL中也叫做“键”,它是一个特殊的文件,它保存着数据表里所有记录的位置信息,更通俗的来说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。
当数据库中数据量很大时,查找数据会变得很慢,我们就可以通过索引来提高数据库的查询效率。
三大类:单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引。
优点:加快数据的查询速度
缺点:创建索引会耗费时间和占用磁盘空间,并且随着数据量的增加所耗费的时间也会增加
使用原则:
通过优缺点对比,不是索引越多越好,而是需要自己合理的使用。
对经常更新的表就避免对其进行过多索引的创建,对经常用于查询的字段应该创建索引,
数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。
在一字段上相同值比较多不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。

13.如何优化数据库

1、优化索引、sql语句、分析慢查询
2、设计表的时候严格根据数据的设计规范来设计数据库
3、使用缓存,吧经常访问到的数据而且不需要变化的数据放到缓存中
4、使用固态硬盘
5、采用MYSQL内部自带的表分区技术,吧数据分层到不同的文件中,能够提高餐盘的 读写效率
6、垂直分表,吧一些不经常用到的数据放到一个表中,节约磁盘的I/O
7、主从分离读写,采取主从复制把数据库的读操作和写操作分离出来
8、数据库分表分机器(数据特变大的),主要的原理就是数据路由
9、选择合适的表引擎,对参数地上的优化
10、进行加购级别的缓存,静态化和分布式。
11、不采用全文索引吗,用什么搜什么
12、采用更快的处分方式,例如NoSql储存经常访问的数据

14.描述JDBC连接数据库的步骤

首先准备JDBC所需的四个参数(user,password,url,driverClass)
1、加载JDBC驱动程序 2、创建数据库的连接 3、创建一个preparedStatement 4、执行SQL语句 5、遍历结果集 6、处理异常,关闭JDBC对象资源

15.什么是SQL注入,怎样防止

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令
采用PreparedStatement来避免sql注入,会自动对用户填写的数据进行验证(简单有效)
sql注入只对sql语句的准备(编译)过程有破坏作用而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.
使用正则表达式过滤传入的参数(典型的SQL 注入攻击的正则表达式 )
字符串过滤,敏感词过滤

16.什么是数据库连接池,实现原理以及优势

数据库连接池负责分配、管理和释放数据库连接
连接池的基本原理是,先初始化一定的数据库连接对象,并且把这些连接保存在连接池中。当程序需要访问数据库的时候,从连接池中取出一个连接,数据库操作结束后,再把这个用完的连接重新放回连接池
1. 资源重用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
2. 更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3. 新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术,几年钱也许还是个新鲜话题,对于目前的业务系统而言,如果设计中还没有考虑到连接池的应用,那么…….快在设计文档中加上这部分的内容吧。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。
4. 统一的连接管理,避免数据库连接泄漏
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。一个最小化的数据库连接池实现:

17.什么是存储过程,什么是函数,怎样创建存储过程和函数

存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合
创建存储过程,需要使用CREATE PROCEDURE语句,语句基本格式如下:
CREATE PROCEDURE sp_name([proc_parameter])
[characteristics …] routine_body
创建存储函数需要使用CREATE FUNCATION语句,其基本语法如下:
CREATE FUNCTION func_name([func_parameter]) RETURNS type
[characteristic …] routine_body

18.什么是触发器,触发器有哪些作用

就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行
特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行;
作用:保证数据的完整性,起到约束的作用;
MySQL触发器的作用有:1、可以基于数据库的值使用户具有操作数据库的某种权利;2、可以跟踪用户对数据库的操作;3、实现复杂的非标准的数据库相关完整性规则;4、同步实时地复制表中的数据;5、自动计算数据值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值