数据库面试题整理(共14页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据库面试题整理(共14页).doc》由会员分享,可在线阅读,更多相关《数据库面试题整理(共14页).doc(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上数据库部分1、数据库三范式是什么?第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。第二范式(2NF):第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。第二范式(2NF)要求
2、实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。第三范式(3NF):满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。所以第三范式具有如下特征:1,每一列只有一个值2,每一行都能区分。3,每一个表都不包含其他表已经包含的非主关键字信息。例如,帖子表中只能出现
3、发帖人的 id,而不能出现发帖人的 id,还同时出现发帖人姓名,否则,只要出现同一发帖人 id 的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。2、说出一些数据库优化方面的经验?1、关键字段建立索引。2、使用存储过程,它使SQL变得更加灵活和高效。 3、备份数据库和清除垃圾数据。4、SQL语句语法的优化。5、清理删除日志。3、union 和 union all 有什么不同?UNION 在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表 UNION。这个 SQL
4、在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。而 UNION ALL 只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。从效率上说,UNION ALL 要比 UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用 UNION ALL,4.分页语句取出 sql 表中第31到40的记录(以自动增长 ID 为主键)sql server 方案1:selecttop 10 * from t where id not in (sel
5、ect top 30 id from t order by id ) orde byid sql server 方案2:selecttop 10 * from t where id in (select top 40 id from t order by id) order by iddescmysql 方案:select * from t order by id limit 30,10oracle 方案:select * from (select rownum r,* from t where r30分页技术(直接利用 sql 语句进行分页,效率最高和最推荐的)mysql:sql = sel
6、ect * from articles limit +(pageNo-1)*pageSize + , + pageSize; oracle: sql = select * from +(selectrownum r,* from + (select* from articles order by postime desc) +whererownum +(pageNo-1)*pageSize;sqlserver:sql = select top 10 * from id not id(select top + (pageNo- 1)*pageSize + id from articles)专心-
7、专注-专业5.用一条 SQL 语句查询出每门课都大于 80 分的学生姓名namekechengfenshu张三语文81张三数学75李四语文76李四数学90王五语文81王五数学100王五英语90准备数据的 sql 代码:create table score(id int primary key auto_increment,namevarchar(20),subject varchar(20),score int);insert into score values (null,张三,语文,81), (null,张三,数学,75), (null,李四,语文,76), (null,李四,数学,90)
8、, (null,王五,语文,81),(null,王五,数学,100),(null,王五 ,英语,90);A: select distinct name from score where name not in (selectdistinct name from score where score=80)B:select distince name t1 from score where 80 all (selectscore from score where name=t1);6.所有部门之间的比赛组合一个叫 department 的表,里面只有一个字段 name,一共有4条纪录,分别是 a,
9、b,c,d,对应四个球对,现在四个球对进行比赛,用一条 sql 语句显示所有可能的比赛组合.select a.name,b.name from team a, team b where a.name b.name7、注册 Jdbc 驱动程序的三种方式第一种方式DriverManager.registerDriver(newcom.microsoft.sqlserver.jdbc.SQLServerDriver();jdbc是使用桥的模式进行连接的。DriverManager就是管理数据库驱动的一个类,java.sql.Driver就 是一个提供注册数据库驱动的接口,而com.microsoft
10、.sqlserver.jdbc.SQLServerDriver()是 java.sql.Driver接口的一个具体实现。第二种方式System.setProperty(jdbc.drivers,com.microsoft.sqlserver.jdbc.SQLServerDriver); 多个驱动使用冒号分隔开,在连接时JDBC会按顺序搜索,直到找到第一个能成功连接指定URL的驱动程序。第三种方式(推荐)Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver);好处在于能够在编译时不依赖于特定的JDBCDriver库,也就是减少了项目
11、代码的依赖性,而且也很容易改造成从配置文件读取JDBC配置,从而可以在运行时动态更换数据库连接驱动。8、用 JDBC 如何调用存储过程代码如下:package com.huawei.interview.lym;import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types;publicclass JdbcTest public static voidmain(Strin
12、g args) Connection cn = null;CallableStatement cstmt =null;try /这里最好不要这么干,因为驱动名写死在程序中了Class.forName(com.mysql.jdbc.Driver);/实际项目中,这里应用 DataSource 数据,如果用框架,/这个数据源不需要我们编码创建,我们只需 Datasource ds =context.lookup()cn = DriverManager.getConnection(jdbc:mysql:/test,root,root); cstmt=cn.prepareCall(callinsert
13、_Student(?,?,?); cstmt.registerOutParameter(3,Types.INTEGER); cstmt.setString(1,wangwu);cstmt.setInt(2, 25); cstmt.execute();/get 第几个,不同的数据库不一样,建议不写System.out.println(cstmt.getString(3); catch (Exception e) / TODO Auto-generated catchblocke .printStackTrace();finallytry if(cstmt !=null)cstmt.close()
14、;if(cn !=null)cn.close(); catch (SQLException e) / TODO Auto-generatedcatch blocke.printStackTrace();9、JDBC 中的 PreparedStatement 相比 Statement 的好处一个 sql 命令发给服务器去执行的步骤为:语法检查,语义分析,编译成内部指令,缓存指令,执行指令等过程。select * from student where id =3-缓存-xxxxx 二进制命令select * from student where id =3-直接取-xxxxx 二进制命令selec
15、t * from student where id =4- - 会怎么干?如果当初是 select * from student where id =?- - 又会怎么干?上面说的是性能提高可以防止 sql 注入。10、写一个用 jdbc 连接并访问 oracle 数据的程序代码import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class JDBCDemo
16、public static void main(String args)Connection conn = null;ResultSet rs = null;try /加载驱动Class.forName(oracle.jdbc.OracleDriver);/获得连接conn=DriverManager.getConnection(jdbc:oracle:thin:localhost:1521:orcl,scott,tiger);Statement stat = conn.createStatement();String sql = SELECT * FROM emp;/执行语句获得结果集rs
17、= stat.executeQuery(sql);/遍历结果集while(rs.next()String name = rs.getString(name);System.out.println(name); catch (Exception e) e.printStackTrace(); finally /关闭连接try conn.close(); catch (SQLException e) / TODO Auto-generated catch blocke.printStackTrace();11、Class.forName 的作用?为什么要用?按参数中指定的字符串形式的类名去搜索并加
18、载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的 Class 实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出 ClassNotFoundException。加载完这个 Class 字节码后,接着就可以使用 Class 字节码的 newInstance 方法去创建该类的实例对象了。有时候,我们程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用 Class.forName 去动态加载该类,这个类名通常是在配置文件中配置的,例如,spring 的 ioc 中每次依赖注入的具体类就是这样配置的,j
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 试题 整理 14
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内