数据库方面面试题DBA数据库管理员JAVA程序员架构师必看_精品文档Word文档格式.doc
《数据库方面面试题DBA数据库管理员JAVA程序员架构师必看_精品文档Word文档格式.doc》由会员分享,可在线阅读,更多相关《数据库方面面试题DBA数据库管理员JAVA程序员架构师必看_精品文档Word文档格式.doc(28页珍藏版)》请在冰豆网上搜索。
=(SELECTMAX(ROWID)FROMEM5_PIPE_PREFABD–D相当于First,Second
WHEREEM5_PIPE_PREFAB.DRAWING=D.DRAWINGAND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
—-执行下面SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录
DELETEFROMEM5_PIPE_PREFAB
=(SELECTMAX(ROWID)FROMEM5_PIPE_PREFABD
2、说一下数据表设计要遵守的三范式是什么?
除了这些你觉得数据表的设计还要注意哪些规则?
1、无重复列,实际上就是一个表中一个列不允许有多值属性、复合属性或者嵌套的表,即列的值域必须是原子值,表必须有主键。
2、属性完全依赖于主键[消除部分子函数依赖]。
第二范式其实是在第一范式上的扩展,所以第二范式必须符合第一范式,表中列不存在部分函数依赖。
3、属性不依赖于其它非主属性[消除传递依赖]。
第三范式是在第二范式的基础上进行的扩展,所以必须符合第二范式且表中不存在传递依赖。
数据量大的情况下如:
百万级数据肯定不能按第三范式来了,必须适当增加冗余数据,减少查询的关联次数,当然做好索引是大前提。
还可以考虑使用分区表。
还不行的话那就换个牛叉点的database。
3、写一个SQL存储过程,建立一个表USER字段是姓名,年龄,职位,权限,然后向里面插入6条数据,然后查询出年龄大于18的所有信息。
Createtableuser(
Namevarchar(20),
Ageint,
Positionvarchar(20)
Quanxianvarchar(20)
)
Insertintouservalues(‘111’,11,’11111’,’1111111’)
Insertintouservalues(‘112’,12,’11112’,’1111112’)
Insertintouservalues(‘113’,13,’11113’,’1111113’)
Insertintouservalues(‘114’,14,’11114’,’1111114’)
Insertintouservalues(‘115’,15,’11115’,’1111115’)
Insertintouservalues(‘116’,16,’11116’,’1111116’)
CreateprocedureselectUser
As
Select*fromuserwhereage>
18
4、1.
你对哪种数据库最熟悉?
使用该数据库多少年?
简单描述对该数据库的理解.
答:
SQL,适合中小型企业使用
2.
对其它较熟悉的商业数据库的了解及使用年限.
3.
如何将数据库(实例)备份和还原?
(针对自己最熟悉的)
SQL,在企业管理器上右点要备份或还原的数据,从所有任务选择备份或还原。
4.
如何知道一个表或视图的结构?
查询系统表sysobjects
5.
描述INNERJOIN的功能和已在何种情况下使用INNERJOIN.
内联接是用比较运算符比较要联接列的值的联接,连接的2个表都要满足、
5、存储过程和SQL语句的优缺点
存储过程的优缺点:
优点:
1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProcedure为封装此代码提供了一个替换位置。
2.执行计划(存储过程在首次运行时将被编译,这将产生一个执行计划--实际上是MicrosoftSQLServer为在存储过程中获取由T-SQL指定的结果而必须采取的步骤的记录。
)缓存改善性能。
……..但sqlserver新版本,执行计划已针对所有T-SQL批处理进行了缓存,而不管它们是否在存储过程中,所以没比较优势了。
3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。
4.使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用(RPC)处理服务器上的存储过程而提高性能。
RPC封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。
5.可维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。
6.代码精简一致,一个存储过程可以用于应用程序代码的不同位置。
7.更好的版本控制,通过使用MicrosoftVisualSourceSafe或某个其他源代码控制工具,您可以轻松地恢复到或引用旧版本的存储过程。
8.增强安全性:
a、通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问;
b、提高代码安全,防止SQL注入(但未彻底解决,例如,将数据操作语言--DML,附加到输入参数);
c、SqlParameter类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证)。
缺点:
1.如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新GetValue()调用,等等,这时候估计比较繁琐了。
2.可移植性差
由于存储过程将应用程序绑定到SQLServer,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。
如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不特定于RDBMS的中间层中可能是一个更佳的选择。
Sql语句灵活,可移植性强,查询速度比存储过程慢些
6、为数据库创建索引都需要注意些什么?
1.索引能提高速度的关键就是索引所占的空间要比表小得多
2.注意索引的大小,有一些表可以建成索引组织表
3.索引的列不要太多,要选择一些selective比较低的列建B-tree索引,选择selective高的列建bitmap索引(在更新比较多的表不不要建bitmap索引)
4.将selective较低的列放在前面
5.在更新不多的表上建索引时,可以考虑用compress选择,以节约索引的空间
7、一组SQL相关操作面试题
1.在表A中有数据
ID
MO
1
Y
2
N
请用一个SELECT语句写出,如果MO的值为“Y”,返回“YES”,为N返回“NO”
效果如下:
YES
NO
SELECTID,MO=CASE
WHENMO=’Y’THEN‘YES’
WHENMO=’N’THEN‘NO’
END
FROMAz
2.在表A中查询出自动增长列中31到40之间的数据(注意可能不是连续的)
select*fromAwhereidbetween31and40
3.有一个表table中有一个自动增长字段ID,如果在存储过程中向这个表插入一条记录后,如何获得新记录的ID.(写出获取新记录ID的函数即可)
CREATEFUNCTIONc_currentId()
RETURNSint
AS
BEGIN
declare@lastIdint
select@lastId=max(cid)fromc
RETURN(@lastId)
selecttempdb.dbo.c_currentId()as‘当前C表中最新的编号’
4.having的用法,是用来做什么的
having用来对groupby分组后的记录进行过滤。
5.sql中的什么函数可以转换为时间
selectconvert(datetime,’2000/01/01′)
selectcast(’2001/02/02′asdatetime)
6.查询数据放入一张临时表
select*into#AfromTest
select*from#A
8、如何使用SQL进行模糊查询
LIKE条件一般用在指定搜索某字段的时候,通过”%_”通配符的作用实现模糊查找功能,通配符可以在前面也可以在后面或前后都有。
搜索以mian开头:
SELECT*FROMtebleWHEREtitleLIKE‘mian%’
搜索以mian结束:
SELECT*FROMtebleWHEREtitleLIKE‘%mian’
搜索包含mian:
SELECT*FROMtebleWHEREtitleLIKE‘%mian%’
注释:
%表示0个或多个字符构成的字符串
_表示单个字符
9、说一下mysql,oracle等常见数据库的分页实现方案?
1.Oracle:
select*from(selectrow_.*,rownumrownum_from(query_SQL)row_whererownum=<
max)whererownum_>
=min
2.SQLServer:
selecttop@pagesize*fromtablenamewhereidnotin(selecttop@pagesize*(@page-1)idfromtablenameorderbyid)orderbyid
3.MySQL
select*fromtablenamelimitposition,counter
4.DB2
select*from(select*,rownumber()asROW_NEXTfromtablename)whereROW_NEXTbetweenminandmax
——————————————————————————————–
1.分页方案一:
(利用NotIn和SELECTTOP分页)效率次之
语句形式:
SELECTTOP10*FROMTestTable
WHERE(IDNOTIN(SELECTTOP20
idFROM
TestTable
ORDERBY
id))
ORDERBYID
SELECT
TOP页大小*FROMTestTable
WHERE(IDNOTIN (SELECT
TOP
每页大小-1