sql常见面试题.docx
《sql常见面试题.docx》由会员分享,可在线阅读,更多相关《sql常见面试题.docx(16页珍藏版)》请在冰豆网上搜索。
sql常见面试题
sql理论题
1.触发器作用?
答:
触发器是一中特殊存储过程,重要是通过事件来触发而被执行。
它可以强化约束,来维护数据完整性和一致性,可以跟踪数据库内操作从而不容许未经允许更新和变化。
可以联级运算。
如,某表上触发器上包括对另一种表数据操作,而该操作又会导致该表触发器被触发。
2。
什么是存储过程?
用什么来调用?
答:
存储过程是一种预编译SQL语句,长处是容许模块化设计,就是说只需创立一次,后来在该程序中就可以调用多次。
如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
可以用一种命令对象来调用存储过程。
3。
索引作用?
和它长处缺陷是什么?
答:
索引就一种特殊查询表,数据库搜索引擎可以运用它加速对数据检索。
它很类似与现实生活中书目录,不需要查询整本书内容就可以找到想要数据。
索引可以是唯一,创立索引容许指定单个列或者是各种列。
缺陷是它减慢了数据录入速度,同步也增长了数据库尺寸大小。
3。
什么是内存泄漏?
答:
普通咱们所说内存泄漏指是堆内存泄漏。
堆内存是程序从堆中为其分派,大小任意,使用完后要显示释放内存。
当应用程序用核心字new等创立对象时,就从堆中为它分派一块内存,使用完后程序调用free或者delete释放该内存,否则就说该内存就不能被使用,咱们就说该内存被泄漏了。
4。
维护数据库完整性和一致性,你喜欢用触发器还是自写业务逻辑?
为什么?
答:
我是这样做,尽量使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最以便。
另一方面是使用触发器,这种办法可以保证,无论什么业务系统访问数据库都可以保证数据完整新和一致性。
最后考虑是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。
5。
什么是事务?
什么是锁?
答:
事务就是被绑定在一起作为一种逻辑工作单元SQL语句分组,如果任何一种语句操作失败那么整个操作就被失败,后来操作就会回滚到操作前状态,或者是上有个节点。
为了保证要么执行,要么不执行,就可以使用事务。
要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
锁:
在因此DBMS中,锁是实现事务核心,锁可以保证事务完整性和并发性。
与现实生活中锁同样,它可以使某些数据拥有者,在某段时间内不能使用某些数据或数据构造。
固然锁还分级别。
6。
什么叫视图?
游标是什么?
答:
视图是一种虚拟表,具备和物理表相似功能。
可以对视图进行增,改,查,操作,试图普通是有一种表或者各种表行或列子集。
对视图修改不影响基本表。
它使得咱们获取数据更容易,相比多表查询。
游标:
是对查询出来成果集作为一种单元来有效解决。
游标可以定在该单元中特定行,从成果集当前行检索一行或多行。
可以对成果集当前行做修改。
普通不使用游标,但是需要逐条解决数据时候,游标显得十分重要。
7。
为管理业务培训信息,建立3个表:
S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号,学员姓名,所属单位,学员年龄
C(C#,CN)C#,CN分别代表课程编号,课程名称
SC(S#,C#,G)S#,C#,G分别代表学号,所选课程编号,学习成绩
(1)使用原则SQL嵌套语句查询选修课程名称为’税收基本’学员学号和姓名?
答案:
selects#,snfromswhereS#in(selectS#fromc,scwherec.c#=sc.c#and cn=’税收基本’)
(2)使用原则SQL嵌套语句查询选修课程编号为’C2’学员姓名和所属单位?
答:
selectsn,sdfroms,scwheres.s#=sc.s#andsc.c#=’c2’
(3)使用原则SQL嵌套语句查询不选修课程编号为’C5’学员姓名和所属单位?
答:
selectsn,sdfromswheres#notin(selects#fromscwherec#=’c5’)
(4)查询选修了课程学员人数
答:
select学员人数=count(distincts#)fromsc
(5)查询选修课程超过5门学员学号和所属单位?
答:
selectsn,sdfromswheres#in(selects#fromscgroupbys#havingcount(distinct c#)>5)
是查询A(ID,Name)表中第31至40条记录,ID作为主键也许是不是持续增长列,完整查询语句如下:
select top10*fromAwhereID>(selectmax(ID)from(select top30IDfromAorderbyA
)T)orderbyA
规定是查询表A中存在ID重复三次以上记录,完整查询语句如下:
select*from(selectcount(ID)ascountfromtablegroupbyID)TwhereT.count>3
createtabletesttable1
(
idintIDENTITY,
departmentvarchar(12)
)
select*fromtesttable1
insertintotesttable1values('设计')
insertintotesttable1values('市场')
insertintotesttable1values('售后')
/*
成果
id department
1 设计
2 市场
3 售后
*/
createtabletesttable2
(
idintIDENTITY,
dptIDint,
namevarchar(12)
)
insertintotesttable2values(1,'张三')
insertintotesttable2values(1,'李四')
insertintotesttable2values(2,'王五')
insertintotesttable2values(3,'彭六')
insertintotesttable2values(4,'陈七')
/*
用一条SQL语句,怎么显示如下成果
id dptID department name
1 1 设计 张三
2 1 设计 李四
3 2 市场 王五
4 3 售后 彭六
5 4 黑人 陈七
*/
答案是:
SELECTtesttable2.* ,ISNULL(department,'黑人')
FROMtesttable1rightjointesttable2ontesttable2.dptID=testtable1.ID
在面试应聘SQLServer数据库开发人员时,我运用了一套原则基准技术问题。
下面这些问题是我觉得可以真正有助于裁减不合格应聘者问题。
它们按照从易到难顺序排列。
当你问到关于主键和外键问题时,背面问题都十分有难度,由于答案也许会更难解释和阐明,特别是在面试情形下。
你能向我简要论述一下SQLServer中使用某些数据库对象吗?
你但愿听到答案涉及这样某些对象:
表格、视图、顾客定义函数,以及存储过程;如果她们还可以提到像触发器这样对象就更好了。
如果应聘者不能回答这个基本问题,那么这不是一种好兆头。
NULL是什么意思?
NULL(空)这个值是数据库世界里一种非常难缠东西,因此有不少应聘者会在这个问题上跌跟头您也不要觉得意外。
NULL这个值表达UNKNOWN(未知):
它不表达“”(空字符串)。
假设您SQLServer数据库里有ANSI_NULLS,固然在默认状况下会有,对NULL这个值任何比较都会生产一种NULL值。
您不能把任何值与一种UNKNOWN值进行比较,并在逻辑上但愿获得一种答案。
您必要使用ISNULL操作符。
什么是索引?
SQLServer里有什么类型索引?
任何有经验数据库开发人员都应当可以很容易地回答这个问题。
某些经验不太多开发人员可以回答这个问题,但是有些地方会说不清晰。
简朴地说,索引是一种数据构造,用来迅速访问数据库表格或者视图里数据。
在SQLServer里,它们有两种形式:
汇集索引和非汇集索引。
汇集索引在索引叶级保存数据。
这意味着无论汇集索引里有表格哪个(或哪些)字段,这些字段都会按顺序被保存在表格。
由于存在这种排序,因此每个表格只会有一种汇集索引。
非汇集索引在索引叶级有一种行标记符。
这个行标记符是一种指向磁盘上数据指针。
它容许每个表格有各种非汇集索引。
什么是主键?
什么是外键?
主键是表格里(一种或各种)字段,只用来定义表格里行;主键里值总是唯一。
外键是一种用来建立两个表格之间关系约束。
这种关系普通都涉及一种表格里主键字段与此外一种表格(尽管也许是同一种表格)里一系列相连字段。
那么这些相连字段就是外键。
什么是触发器?
SQLServer有什么不同类型触发器?
让将来数据库开发人员懂得可用触发器类型以及如何实现它们是非常有益。
触发器是一种专用类型存储过程,它被捆绑到SQLServer表格或者视图上。
在SQLServer里,有INSTEAD-OF和AFTER两种触发器。
INSTEAD-OF触发器是代替数据操控语言(DataManipulation
Language,DML)语句对表格执行语句存储过程。
例如,如果我有一种用于TableAINSTEAD-OF-UPDATE
触发器,同步对这个表格执行一种更新语句,那么INSTEAD-OF-UPDATE触发器里代码会执行,而不是我执行更新语句则不会执行操作。
AFTER触发器要在DML语句在数据库里使用之后才执行。
这些类型触发器对于监视发生在数据库表格里数据变化十分好用。
您如何确一种带有名为Fld1字段TableB表格里只具备Fld1字段里那些值,而这些值同步在名为TableA表格Fld1字段里?
这个与关系有关问题有两个也许答案。
第一种答案(并且是您但愿听到答案)是使用外键限制。
外键限制用来维护引用完整性。
它被用来保证表格里字段只保存有已经在不同(或者相似)表格里另一种字段里定义了值。
这个字段就是候选键(普通是此外一种表格主键)。
此外一种答案是触发器。
触发器可以被用来保证以此外一种方式实现与限制相似作用,但是它非常难设立与维护,并且性能普通都很糟糕。
由于这个因素,微软建议开发人员使用外键限制而不是触发器来维护引用完整性。
对一种投入使用在线事务解决表格有过多索引需要有什么样性能考虑?
你正在寻找进行与数据操控关于应聘人员。
对一种表格索引越多,数据库引擎用来更新、插入或者删除数据所需要时间就越多,由于在数据操控发生时候索引也必要要维护。
你可以用什么来保证表格里字段只接受特定范畴里值?
这个问题可以用各种方式来回答,但是只有一种答案是“好”答案。
您但愿听到回答是Check限制,它在数据库表格里被定义,用来限制输入该列值。
触发器也可以被用来限制数据库表格里字段可以接受值,但是这种办法规定触发器在表格里被定义,这也许会在某些状况下影响到性能。
因而,微软建议使用Check限制而不是其她方式来限制域完整性。
如果应聘者可以对的地回答这个问题,那么她机会就非常大了,由于这表白她们具备使用存储过程经验。
返回参数总是由存储过程返回,它用来表达存储过程是成功还是失败。
返回参数总是INT数据类型。
OUTPUT参数明确规定由开发人员来指定,它可以返回其她类型数据,例如字符型和数值型值。
(可以用作输出参数数据类型是有某些限制。
)您可以在一种存储过程里使用各种OUTPUT参数,而您只可以使用一种返回参数。
什么是有关子查询?
如何使用这些查询?
经验更加丰富开发人员将可以精确地描述这种类型查询。
有关子查询是一种包括子查询特殊类型查询。
查询里包括子查询会真正祈求外部查询值,从而形成一种类似于循环状况。
什么是SQL注入式袭击?
所谓SQL注入式袭击,就是袭击者把SQL命令插入到Web表单输入域或页面祈求查询字符串,欺骗服务器执行恶意SQL命令。
在某些表单中,顾客输入内容直接用来构造(或者影响)动态SQL命令,或作为存储过程输入参数,此类表单特别容易受到SQL注入式袭击。
常用SQL注入式袭击过程类如:
⑴某个ASP.NETWeb应用有一种登录页面,这个登录页面控制着顾客与否有权访问应用,它规定顾客输入一种名称和密码。
⑵登录页面中输入内容将直接用来构造动态SQL命令,或者直接用作存储过程参数。
下面是ASP.NET应用构造查询一种例子:
System.Text.StringBuilderquery=newSystem.Text.StringBuilder(
"SELECT*fromUsersWHERElogin='")
.Append(txtLogin.Text).Append("'ANDpassword='")
.Append(txtPassword.Text).Append("'");
⑶袭击者在顾客名字和密码输入框中输入"'或'1'='1"之类内容。
⑷顾客输入内容提交给服务器之后,服务器运营上面ASP.NET代码构造出查询顾客SQL命令,但由于袭击者输入内容非常特殊,因此最后得到SQL命令变成:
SELECT*fromUsersWHERElogin=''or'1'='1'ANDpassword=''or'1'='1'。
⑸服务器执行查询或存储过程,将顾客输入身份信息和服务器中保存身份信息进行对比。
⑹由于SQL命令事实上已被注入式袭击修改,已经不能真正验证顾客身份,因此系统会错误地授权给袭击者。
如果袭击者懂得应用会将表单中输入内容直接用于验证身份查询,她就会尝试输入某些特殊SQL字符串篡改查询变化其本来功能,欺骗系统授予访问权限。
系统环境不同,袭击者也许导致损害也不同,这重要由应用访问数据库安全权限决定。
如果顾客帐户具备管理员或其她比较高档权限,袭击者就也许对数据库表执行各种她想要做操作,涉及添加、删除或更新数据,甚至也许直接删除表
如何防范SQL注入式袭击?
好在要防止ASP.NET应用被SQL注入式袭击闯入并不是一件特别困难事情,只要在运用表单输入内容构造SQL命令之前,把所有输入内容过滤一番就可以了。
过滤输入内容可以按各种方式进行。
⑴对于动态构造SQL查询场合,可以使用下面技术:
第一:
替代单引号,即把所有单独浮现单引号改成两个单引号,防止袭击者修改SQL命令含义。
再来看前面例子,"SELECT*fromUsersWHERElogin='''or''1''=''1'ANDpassword='''or''1''=''1'"显然会得到与"SELECT*fromUsersWHERElogin=''or'1'='1'ANDpassword=''or'1'='1'"不同成果。
第二:
删除顾客输入内容中所有连字符,防止袭击者构造出类如"SELECT*fromUsersWHERElogin='mas'--ANDpassword=''"之类查询,由于此类查询后半某些已经被注释掉,不再有效,袭击者只要懂得一种合法顾客登录名称,主线不需要懂得顾客密码就可以顺利获得访问权限。
第三:
对于用来执行查询数据库帐户,限制其权限。
用不同顾客帐户执行查询、插入、更新、删除操作。
由于隔离了不同帐户可执行操作,因而也就防止了原本用于执行SELECT命令地方却被用于执行INSERT、UPDATE或DELETE命令。
⑵用存储过程来执行所有查询。
SQL参数传递方式将防止袭击者运用单引号和连字符实行袭击。
此外,它还使得数据库权限可以限制到只容许特定存储过程执行,所有顾客输入必要遵从被调用存储过程安全上下文,这样就很难再发生注入式袭击了。
⑶限制表单或查询字符串输入长度。
如果顾客登录名字最多只有10个字符,那么不要承认表单中输入10个以上字符,这将大大增长袭击者在SQL命令中插入有害代码难度。
⑷检查顾客输入合法性,确信输入内容只包括合法数据。
数据检查应当在客户端和服务器端都执行——之因此要执行服务器端验证,是为了弥补客户端验证机制脆弱安全性。
在客户端,袭击者完全有也许获得网页源代码,修改验证合法性脚本(或者直接删除脚本),然后将非法内容通过修改后表单提交给服务器。
因而,要保证验证操作的确已经执行,唯一办法就是在服务器端也执行验证。
你可以使用许多内建验证对象,例如RegularExpressionValidator,它们可以自动生成验证用客户端脚本,固然你也可以插入服务器端办法调用。
如果找不到现成验证对象,你可以通过CustomValidator自己创立一种。
⑸将顾客登录名称、密码等数据加密保存。
加密顾客输入数据,然后再将它与数据库中保存数据比较,这相称于对顾客输入数据进行了"消毒"解决,顾客输入数据不再对数据库有任何特殊意义,从而也就防止了袭击者注入SQL命令。
System.Web.Security.FormsAuthentication类有一种HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒解决。
⑹检查提取数据查询所返回记录数量。
如果程序只规定返回一种记录,但实际返回记录却超过一行,那就当作出错解决
Sql常用题目
为管理岗位业务培训信息,建立3个表:
S(S#,SN,SD,SA)S#,SN,SD,SA分别代表学号、学员姓名、所属单位、学员年龄
C(C#,CN)C#,CN分别代表课程编号、课程名称
SC(S#,C#,G)S#,C#,G分别代表学号、所选修课程编号、学习成绩
1.使用原则SQL嵌套语句查询选修课程名称为’税收基本’学员学号和姓名
--实当代码:
SelectSN,SDFROMSWhere[S#]IN(Select[S#]FROMC,SCWhereC.[C#]=SC.[C#]ANDCN=N'税收基本')
2.使用原则SQL嵌套语句查询选修课程编号为’C2’学员姓名和所属单位
--实当代码:
SelectS.SN,S.SDFROMS,SCWhereS.[S#]=SC.[S#]ANDSC.[C#]='C2'
3.使用原则SQL嵌套语句查询不选修课程编号为’C5’学员姓名和所属单位
--实当代码:
SelectSN,SDFROMSWhere[S#]NOTIN(Select[S#]FROMSCWhere[C#]='C5')
4.使用原则SQL嵌套语句查询选修所有课程学员姓名和所属单位
--实当代码:
SelectSN,SDFROMSWhere[S#]IN(Select[S#]FROMSCRIGHTJOINCONSC.[C#]=C.[C#]GROUPBY[S#]HAVINGCOUNT(*)=COUNT([S#]))
5.查询选修了课程学员人数
--实当代码:
Select学员人数=COUNT(DISTINCT[S#])FROMSC
6.查询选修课程超过5门学员学号和所属单位
--实当代码:
SelectSN,SDFROMSWhere[S#]IN(Select[S#]FROMSCGROUPBY[S#]HAVINGCOUNT(DISTINCT[C#])>5)
题目2:
问题描述:
S(SNO,SNAME)学生关系。
SNO为学号,SNAME为姓名
C(CNO,CNAME,CTEACHER)课程关系。
CNO为课程号,CNAME为课程名,CTEACHER为任课教师
SC(SNO,CNO,SCGRADE)选课关系。
SCGRADE为成绩
1.找出没有选修过“李明”教师讲授课程所有学生姓名
--实当代码:
SelectSNAMEFROMSWhereNOTEXISTS(Select*FROMSC,CWhereSC.CNO=C.CNOANDCNAME='李明'ANDSC.SNO=S.SNO)
2.列出有二门以上(含两门)不及格课程学生姓名及其平均成绩
--实当代码:
SelectS.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)FROMS,SC,(SelectSNOFROMSCWhereSCGRADE<60GROUPBYSNOHAVINGCOUNT(DISTINCTCNO)>=2)AWhereS.SNO=A.SNOANDSC.SNO=A.SNOGROUPBYS.SNO,S.SNAME
3.列出既学过“1”号课程,又学过“2”号课程所有学生姓名
--实当代码:
SelectS.SNO,S.SNAMEFROMS,(SelectSC.SNOFROMSC,CWhereSC.CNO=C.CNOANDC.CNAMEIN('1','2')GROUPBYSNOHAVINGCOUNT(DISTINCTCNO)=2)SCWhereS.SNO=SC.SNO
4.列出“1”号课成绩比“2”号同窗该门课成绩高所有学生学号
--实当代码:
SelectS.SNO,S.SNAMEFROMS,(SelectSC1.SNOFROMSCSC1,CC1,SCSC2,CC2WhereSC1.CNO=C1.CNOANDC1.NAME='1'ANDSC2.CNO=C2.CNOANDC2.NAME='2'ANDSC1.SCGRADE>SC2.SCGRADE)SCWhereS.SNO=SC.SNO
5.列出“1”号课成绩比“2”号课成绩高所有学生学号及其“1”号课和“2”号课成绩
--实当代码:
SelectS.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]FROMS,(SelectSC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADEFROMSCSC1,CC1,SCSC2,CC2WhereSC1.CNO=C1.CNOANDC1.NAME='1'ANDSC2.CNO=C2.CNOANDC2.NAME='2'ANDSC1.SCGRADE>SC2.SCGRADE)SCWhereS.SNO=SC.SNO
求其中同一种号码两次通话之间间隔不不大于10秒通话记录ID
例如:
6,7,8,9,10条记录均符合
ID主叫号码被叫号码 通话起始时间 通话结束时间 通话时长
1 9829000002-02-0109:
49:
53.000-02-01