JAVA企业面试题精选 数据库1-10

第二部分

1.数据库

1.1.什么是关系型数据库管理系统?

参考答案:

  由关系,数据,数据之间的约束三者所组成的数据模型则被称为RDBMS,即关系型数据库管理系统.

1.2.简述几种主流的数据库及其厂商

参考答案:

  主流的数据库及其厂商如下:
  Oracle数据库是著名的Oracle(甲骨文)公司的数据库产品,Oracle数据库是世界上第一个商品化的关系型数据库管理系统;Oracle数据库采用标准SQL(结构化查询语言),自持多种数据类型,提供面向对象的数据支持,就有第四代语言开发工具,支持UNIX,WINDOWS,OS/2等多种平台;Oracle公司的产品丰富,包括Oracle服务器,Oracle开发工具和Oracle应用软件,其中最著名的就是Oracle数据库.
  2)DB2是IBM公司的关系型数据库管理系统.DB2有很多不同的版本,可以运行在从掌上产品到大型机不同的终端及其上;DB2 Universal Database Personal Edition和DB2 Universal Database Workgroup Edition分别是单用户和多用户系统,可以运行在OS/2和Windows上;DB2是Oracle的主要竞争对手.
  3)Sybase是美国Sybase公司的关系型数据库系统.Sybase是较早采用C/S技术的数据库厂商;典型的UNIX或Windows NT平台上客户机/服务器环境下的大型数据库系统;Sybase通常与Sybase SQL Anywhere用于客户机/服务器环境,前者作为服务器数据库,后者为客户机数据库,采用该公司研制的PowerBuilder为开发工具,在国内大中型系统中具有广泛的应用;Sybase公司2010年被SAP收购.
  4)Microsoft SQL Server是微软的产品,运行在Windows NT服务器上.Microsoft SQL Server的最初版本适用于中小企业,但是应用范围不断扩展,已经触及到大型,跨国企业的数据库管理.
  MySQL是开放源码的小型关系型数据库管理系统.广泛应用在中小型网站中,成本低,规模较Oracle和DB2小;2008年1月16日,Sun收购MySQL.2009年4月20日,Sun被Oracle收购,所以MySQL现在属于Oracle公司.

1.3.简述结构化查询语言的分类

参考答案:

  结构化查询语言(SQL)可分为:
  1.数据定义语言(DDL):Data Definition Language
  2.数据操纵语言(DML):Data Manipulation Language
  3.事物控制语言(TCL):Transaction Control Language
  4.数据查询语言(DQL):Data Query Language
  5.数据控制语言(DCL):Data Control Language

1.4.简述date和timestamp的区别?

参考答案:

  date的最小单位是秒,timestamp包含小数位的秒.如果需要秒以下的单位,需要用timestamp.

1.5.简述索引的原理及创建索引的意义?

参考答案:

  索引是对表的一列或多列进行排序的结构.因为绝大多数的搜索方法在搜索排序结构时效率都会大大提高,所以如果表中某一列经常被作为关键字搜索,则建议对此列创建索引.
  索引提供指针以指向村粗在表中指定列的数据值,根据指定的排序次序排列这些指针.数据库使用索引的方式和与使用书的目录很相似:通过搜索索引找到特定的值,然后跟随指针到达包含该值的行.

1.6.简述视图的意义

参考答案:

  视图的意义在于两个方面:
  1)简化复杂查询.如果需要经常执行某项复杂查询,可以基于这个复杂查询建立视图,此后查询此视图即可.
  2)限制数据访问.视图本质上就是一条SELECT语句,所以当访问视图时,只能访问到所对应的SELECT语句中涉及到的列,对基表中的其他列起到安全和保密的作用.

1.7.触发器分为事前触发和事后触发,这两种触发有何区别?语句级触发和行级触发有何区别?

参考答案:

  事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后.通常事前触发器可以获取事件之前和新的字段值.语句级触发器可以在语句执行之前或之后执行,而行级触发器所影响的每一行时都会触发一次.
  简单而言,事前触发主要是验证一些条件或进行一些准备工作,在数据保存之前触发,而事后触发则是进行收尾工作,保证事务的完整性,在表经过修改以后才触发.行级触发器是对DML语句影响的每个行执行一次,如UPDATE语句影响多行,就会对每行都激活一次触发器.而语句级触发器是对每个DML语句执行一次,如INSERT语句在表中即使插入了100多行,表上的INSERT语句级触发器也只会执行一次.

1.8.SQL语句中exists和in有何区别?SQL语句优化有哪些方法?

参考答案:

  SQL语句中exists和in区别如下:
  exists是用循环(loop)的方式,由outer表的记录数决定循环的次数,对于exists影响最大,所以外表的记录数少,适合用exists;in先执行子查询,子查询的返回结果去重之后,再执行主查询,所以,子查询的返回结果越少,越适合用该方法.
  SQL语句的优化方式如下:
  1.尽量避免非操作符的使用.在索引列上使用NOT,<>等非操作符,数据库管理系统是不会使用索引的,可以将查询语句转换为可以使用索引的查询.
  2.避免对查询的列的操作.任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数,计算表达式等,查询时要尽可能将操作移至等式的右边,甚至去掉函数.
  3.避免不必要的类型转换.需要注意的是,尽量避免潜在的数据类型转换.如字符型数据与数值型数据比较,会自动将字符进行转换,从而导致全表扫描.
  4.增加查询的范围限制.增加查询的范围限制,避免全范围的搜索.
  5.合理使用IN与EXISTS.例如:有A,B两个表,它们分别使用如下情况:
  1)当只显示一个表的数据如A,关系条件只一个如ID时,使用IN更合适,SQL语句如下:

SELECT * FROM A WHERE id IN (SELECT id FROM B);

  2)当只显示一个表的数据如A,关系条件不止一个列,例如关系条件涉及到的列为ID,col1时,使用IN就不方便了,可以使用EXISTS,SQL语句如下:

SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE id = A.id and col1 = A.col1);

  in与exists的区别:in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以为认为exists比in效率高的说法是不准确的.如果查询的两个表大小相当,那么用in和exists差别不大.如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in.
  2)not in与not exists的区别:如果查询语句使用了not in那么内外表都进行全表扫描,没有用到索引;而not exists的子查询依然能用到表上的索引.所以无论哪个表大,用not exists都比not in要快.
  6.尽量去掉< >.尽量去掉< >,避免全表扫描,如果数据是枚举值,且取值范围同定,则修改为OR或者IN a< >0改为a>0 or a<0 a< >’ ’ 改为a>’ ‘.
  7.去掉WHERE子句中的IS NULL和IS NOT NULL.WHERE子句中的IS NULL和IS NOT NULL将不会使用索引而是进行全表搜索,因此需要通过改变查询方式,分情况讨论等办法,去掉WHERE子句中的IS NULL和IS NOT NULL,IS NOT NULL改为A>0或者A>’ ‘.
  8.尽量不要使用前导模糊查询.由于前导模糊查询(前面有%的like查询)不能利用索引,所以速度会比较慢.
  9.SELECT子句中避免使用’‘.当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用’‘是一个方便的方法,不幸的是,这是一个非常低效的方法.实际上,数据库在解析的过程中,会将’*’依次转换成所有的列名,这个工作是通过查询数据字典完成的,这意味着将消耗更多的时间.
  10.规范所有的SQL关键字的书写 比如:SELECT,UPDATE,DELETE,FROM等,要么全部大写,要么全部小写,不要大小写混用.

1.9说说你对数据库事务隔离级别的理解

参考答案:

  事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度.另个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:
  1.幻读:事务T1读取一条自定WHERE条件的语句,返回结果集.此时事务T2插入一行新纪录,恰好满足T1的WHERE条件.然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录则是幻读记录.
  2.不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读.
  3.脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据.
  为了处理这些问题,SQL标准定义了以下几种事务隔离级别:
  1) READ UNCOMMITTED 幻读,不可重复读和脏读都允许.
  2) READ COMMITTED 允许幻读,不可重复读,不允许脏读
  3) REPEATABLE READ 允许幻读,不允许不可重复读和脏读
  4) SERIALIZABLE 幻读,不可重复读和脏读都不允许
  Oracle数据库支持READ COMMITTED和SERIALIZABLE 这两种事务隔离级别.所以Oracle不支持脏读.SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle默认使用的是READ COMMITTED.

1.10.在数据库中条件查询速度很慢的时候,如何优化?

参考答案:

  1.为经常出现在WHERE子句中的列创建索引;为经常出现在ORDER BY,DISTINCT后面的字段建立索引.如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致;为经常作为表的连接条件的列上创建索引.
  2.减少表之间的关联
  3.优化SQL,尽量让SQL很快定位数据,不要让SQL做全表查询,应该走索引,把数据量大的表排在前面
  4.简化查询字段,没用的字段不要,对返回的结果进行控制,尽量返回少量数据

你可能感兴趣的:(java面试题)