1、数据库部分1、数据库三范式是什么 ?第一范式(1NF):字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。第二范式(2NF):第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。第二范式(2NF)要求实体的属性完全依赖于主关
2、键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。第三范式(3NF):满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。所以第三范式具有如下特征:1,每一列只有一个值2,每一行都能区分。3,每一个表都不包含其他表已经包含的非主关键字信息。例如,帖子表中只能出现发帖人的 id,而不能出
3、现发帖人的 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 (select
5、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 = “selec
6、t * 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 fr
7、om articles)“5.用一条 SQL 语句查询出每门课都大于 80 分的学生姓名name kecheng fenshu张三 语文 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,李四
8、, 语文,76), (null,李四,数学,90), (null,王五,语文,81),(null,王五, 数学,100),(null,王五 ,英语,90);A: select distinct name from score where name not in (selectdistinct name from score where score“ +pageSize*(pageNumber-1);13、用 JDBC 查询学生成绩单 ,把主要代码写出来(考试概率极大).Connection cn = null;PreparedStatement pstmt =null;Resultset rs
9、 = null;tryClass.forname(driveClassName);cn = DriverManager.getConnection(url,username,password); pstmt =cn.prepareStatement(“select score.* fromscore ,student “ +“wherescore.stuId = student.id and student.name = ?”);pstmt.setString(1,studentName); Resultset rs =pstmt.executeQuery(); while(rs.next()
10、system.out.println(rs.getInt(“subject”) + “ ” +rs.getFloat(“score”) );catch(Exception e)e.printStackTrace();finallyif(rs != null) tryrs.close() catch(exception e)if(pstmt != null)trypstmt.close()catch(exception e)if(cn != null) trycn.close() catch(exception e)14、这段代码有什么不足之处 ?try Connection conn = .;
11、 Statement stmt = .;ResultSet rs =stmt.executeQuery(“select * from table1“);while(rs.next() catch(Exception ex) 没有 finally 语句来关闭各个对象,另外,使用 finally 之后,要把变量的定义放在 try 语句块的外面,以便在 try 语句块之外的 finally 块中仍可以访问这些变量。15、说出数据连接池的工作机制是什么 ?J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙
12、。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。实现方式,返回的 Connection 是原始 Connection 的代理,代理 Connection 的 close 方法不是真正关连接,而是把它代理的 Connection 对象还回到连接池中。16、为什么要用 ORM? 和 JDBC 有何不一样?orm 是一种思想,就是把 object 转变成数据库中的记录,或者把数据库中的记录转变成objecdt,我们可以用 jdbc 来实现这种思想,其实,如果我们的项目是严格按照
13、oop 方式编写的话,我们的 jdbc 程序不管是有意还是无意,就已经在实现 orm 的工作了。现在有许多 orm 工具,它们底层调用 jdbc 来实现了 orm 工作,我们直接使用这些工具,就省去了直接使用 jdbc 的繁琐细节,提高了开发效率,现在用的较多的 orm 工具是 hibernate 。也听说一些其他 orm 工具,如 toplink,ojb 等。17.主键自动增长不同数据库之间的差异MySQL:使用 AUTO_INCREMENT 关键字来执行 auto-increment 任务。默认地,AUTO_INCREMENT 的开始值是 1,每条新纪录递增 1。要让 AUTO_INCRE
14、MENT 序列以其他的值起始,请使用下列 SQL 语法:ALTER TABLE Persons AUTO_INCREMENT=100 (创建时会自动添加一个唯一的值)SQL Server:使用 IDENTITY 关键字来执行 auto-increment 任务,默认地,IDENTITY 的开始值是 1,每条新纪录递增 1。要规定 “P_Id“ 列以 20 起始且递增 10,请把 identity 改为 IDENTITY(20,10) (创建时会自动添加一个唯一的值)Oracle:必须通过 sequence 对创建 auto-increment 字段(该对象生成数字序列)。18、sqlserve
15、r 与 oracle 的区别:sql server 与 oracle 的区别:-1.数据类型不同。-sql server 的数据类型: int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima,float,bit-oracle 的数据类型:number(p,s),char,varchar2,Date,LOB -2.获得当前系统时间的函数不同。-sql server :getdate()-oracle:sysdate-例如:设定日期格式的函数:to_char(sysdate,yyy-m
16、m-dd);-3.在 oracle 中没有默认约束的说法-sql server 中添加默认约束:alter table talbe_name add DF_table_name default(男) for sex;-oracle 中添加默认值:alter table table_name modify(sex default(男);-4.连接变量和字符串的方式不一样-sql server 中连接:使用“+”连接,例如:print aaaa+name;-oracle 中连接:使用“|”连接,例如:dbms_output.put_line(aaa|name);-name 为变量-5.oracle
17、 没有 identity 自动增长列,而是使用序列实现增长-sql server 自动增长:在表的主键列中可直接使用 identity(1,1)实现增长-oracle 使用序列自动增长:create sequence se_id start with 1increment by 1-使用序列实现自动增长:se_id.nextval-6.条件语句 ifelse的语法不同-sql server 中:if 条件beginendelsebeginend -oracle 中:if 条件 1 then;elsif 条件 2 then;else;end if;-7.case 语句的语法不同-sql server 中:-select .case.(else).end.语句