SQL Server面试题及答案Word格式.docx
《SQL Server面试题及答案Word格式.docx》由会员分享,可在线阅读,更多相关《SQL Server面试题及答案Word格式.docx(14页珍藏版)》请在冰豆网上搜索。
![SQL Server面试题及答案Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/16/08770acd-c648-454f-9b09-3ca9970054aa/08770acd-c648-454f-9b09-3ca9970054aa1.gif)
Select学员人数=COUNT(DISTINCT[S#])FROMSC
6.查询选修课程超过5门的学员学号和所属单位
GROUPBY[S#]
HAVINGCOUNT(DISTINCT[C#])>
5)
题目2
问题描述:
已知关系模式:
S(SNO,SNAME)学生关系。
SNO为学号,SNAME为姓名
C(CNO,CNAME,CTEACHER)课程关系。
CNO为课程号,CNAME为课程名,CTEACHER为任课教师
SC(SNO,CNO,SCGRADE)选课关系。
SCGRADE为成绩
1.找出没有选修过“李明”老师讲授课程的所有学生姓名
SelectSNAMEFROMS
WhereNOTEXISTS(
Select*FROMSC,C
WhereSC.CNO=C.CNO
ANDCNAME='
李明'
ANDSC.SNO=S.SNO)
2.列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩
SelectS.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE)
FROMS,SC,(
SelectSNO
FROMSC
WhereSCGRADE<
60
GROUPBYSNO
HAVINGCOUNT(DISTINCTCNO)>
=2
)AWhereS.SNO=A.SNOANDSC.SNO=A.SNO
GROUPBYS.SNO,S.SNAME
3.列出既学过“1”号课程,又学过“2”号课程的所有学生姓名
SelectS.SNO,S.SNAME
FROMS,(
SelectSC.SNO
FROMSC,C
ANDC.CNAMEIN('
1'
'
2'
HAVINGCOUNT(DISTINCTCNO)=2
)SCWhereS.SNO=SC.SNO
4.列出“1”号课成绩比“2”号同学该门课成绩高的所有学生的学号
SelectSC1.SNO
FROMSCSC1,CC1,SCSC2,CC2
WhereSC1.CNO=C1.CNOANDC1.NAME='
ANDSC2.CNO=C2.CNOANDC2.NAME='
ANDSC1.SCGRADE>
SC2.SCGRADE
)SCWhereS.SNO=SC.SNO
5.列出“1”号课成绩比“2”号课成绩高的所有学生的学号及其“1”号课和“2”号课的成绩
SelectS.SNO,S.SNAME,SC.[1号课成绩],SC.[2号课成绩]
SelectSC1.SNO,[1号课成绩]=SC1.SCGRADE,[2号课成绩]=SC2.SCGRADE
oracleCertificationProgram(OCP认证)的题目
(1)A表中有100条记录.
Select *FROMAWhereA.COLUMN1=A.COLUMN1
这个语句返回几条记录?
(简单吧,似乎1秒钟就有答案了:
(2)CreateSEQUENCEPEAK_NO
SelectPEAK_NO.NEXTVALFROMDUAL-->
假设返回1
10秒中后,再次做
返回多少?
(3)SQL>
connectsysassysdba
Connected.
SQL>
insertintodualvalues('
Y'
);
1rowcreated.
commit;
Commitcomplete.
selectcount(*)fromdual;
COUNT(*)
----------
2
deletefromdual;
commit;
-->
DUAL里还剩几条记录?
JUSTTRYIT
问:
怎样在一个Update语句中使用表B的三个列更新表A中的三个列?
答:
对这个问题,您可以使用强大的关系代数。
本页中的代码说明了如何组合使用FROM子句和JOIN操作,以达到用其他表中数据更新指定列的目的。
在设计关系表达式时,您需要决定是否需要单一行匹配多个行(一对多关系),或者需要多个行匹配被联接表中的单一行以更新所有行(多对一关系)。
在一对多关系中,SQLServer始终使用它找到的最后一行更新数据。
但是,您无法控制最后一行所在的位置。
在多处理器的计算机上,查询可能是同步进行的,相同的查询最后一行的位置可能会不同。
因此,Microsoft建议尽量不要使用一对多关系。
如果待更新的表与FROM子句中的表相同,并且FROM子句只包含对该表的一个引用,别名可能未被指定。
如果待更新的表在FROM子句中出现了多次,只有该表的一个引用可以省略表的别名,对该表的所有其他引用必须包含一个表别名。
USEtempdb
GO
CreateTABLE#t1(c1intNOTNULL,c2char(5),c3char(5),
c4char(5))
CreateTABLE#t2(c1intNOTNULL,c2char(5),c3char(5),
--数据赋值
Insert#t1values(1,'
hello'
there'
fred'
Insert#t2values(1,'
how'
are'
you?
'
--更新数据
Update#t1SET#t1.c2=#t2.c2,#t1.c3=#t2.c3,
#t1.c4=#t2.c4
FROM#t2
Where#t1.c1=#t2.c1
--检查结果
Select*FROM#t1
—MicrosoftSQLServer开发团队
---------------------------------------------------------------------------
回滚事务日志文件中的事务
更新日期:
2002年7月22日
本技巧摘自SQLServer杂志的一期。
如需了解更多的技巧,请访问SQLServer的使用技巧中心。
怎样使用Transact-SQL回滚某个位于事务日志文件中的事务(例如,ID0000:
0010a183)?
出于预防数据错误的考虑,SQLServer并不支持个别事务的回滚。
举例来说,假设两个事务T1和T2使用现金余额域。
T1添加了500美金,T2使用更新后的值进行了某个操作。
如果回滚T1,则T2可能是错误的。
但是,您可以使用时间戳或事务日志标记将日志恢复至预定义的标记或时间点。
以下两个例子说明了如何使用SQLServer2000语法。
例1:
使用时间戳将日志进行时点恢复
使用以前的完全备份恢复数据库,并使其为日志恢复做好准备。
RESTOREDATABASEpubsFROMDISK=N'
C:
\Backups\Fullbackup.bak'
WITHNORECOVERY
现在您可以将日志前滚到合适的时间点,并使数据库可供使用。
请注意,STOPAT在数据库正在执行大容量日志时禁止执行。
RESTORELOGpubsFROMDISK=N'
\Backups\Logbackup.bak'
WITHRECOVERY,STOPAT='
02/11/200217:
35:
00'
例2:
使用数据库标记将日志恢复到预定义时间点的语句
在事务日志中置入一个标记。
请注意,被标记的事务至少须提交一个更新,以标记该日志。
BEGINTRANMyMarkWITHMARK
Updatepubs.dbo.LastLogMarkSETMarkTime=GETDATE()
COMMITTRANMyMark
按照您常用的方法备份事务日志。
BACKUPLOGpubsTODISK='
WITHINIT
现在您可以将数据库恢复至日志标记点。
首先恢复数据库,并使其为接受日志恢复做好准备。
RESTOREDATABASEpubsFROMDISK=N'
现在将日志恢复至包含该标记的时间点,并使其可供使用。
WITHRECOVERY,
STOPAT='
—MicrosoftSQLServer开发团队
--------------------------------------------------------------------------
打开UDP端口1434以浏览命名实例
2003年5月12日
本地的一个ISP托管了我们的SQLServer,但是我不能看到或连接到运行在该计算机上的命名实例。
我知道SQLServer2000命名实例不使用TCP/IP1433端口,并且确定该SQLServer实例所使用的TCP/IP端口是打开的。
您有什么建议吗?
许多人知道如何使用SQLServer网络实用工具或SQLServer错误日志来确定SQLServer实例的监听端口。
但许多人似乎忘记或者根本不知道——UDP1434端口也必须是打开的,以确保您能够正确地访问和浏览命名实例。
我建议您仔细研究一下这一要求。
在SQLServer在线书籍中搜索“1434”,您将得到三个颇有研究价值的搜索结果。
在SQLServer杂志网站2001年7月刊我的SQLServer实用技巧专栏中,您还可以查找到有关访问命名实例的信息(InstantDocID21127)。
在此我也简单解释一下。
SQLServer在UDP1434端口上建立一个监听服务,让客户端从服务器上查询到命名实例及其网络配置信息的一个列表。
该监听服务始终运行在UDP1434端口上,并且用户无法更改该运行端口。
—BrianMoran
如何使用系统管理员帐户管理多个开发人员?
2002年12月16日
在我们的开发环境下,每个人都有系统管理员(sa)密码,5个组使用一个数据库。
在某个开发人员不小心删除了数据后,我没有办法确定谁删除哪一块数据。
当开发人员更新数据库中的数据时,如何审核工作站或登录ID?
因为您工作于开发环境下,使用SQL事件探查器和服务器跟踪所带来的性能损失并不会影响生产环境,所以您可以设置一个服务器跟踪,在后台将信息记录在一个表中。
然后,您可以搜索该表以确定谁删除了数据。
显然,一次为多个用户分配sa账户会带来许多问题。
以下是您应该采取的一些措施:
为每个开发团队创建该数据库的一份拷贝,为每个团队提供一个仅数据库拥有者才有访问权的账户。
这样的话,他们就不会互相影响了。
如果每个开发人员都需要sa访问权(例如运行SQL事件探查器跟踪),并且您运行的是SQLServer2000Enterprise或DeveloperEdition,您可以为每个团队提供SQLServer的一个实例及其专用的sa密码。
考虑为每个项目设置一个开发环境,并以一个集成环境的方式由一个版本数据库管理员对所有项目间冲突进行管理。
这样的话,因为架构改变脚本在进入集成环境之前已经经过了测试,生产版本的质量将有所改善。
—TheMicrosoftSQLServer开发团队
防止锁定升级
2001年9月17日
如何防止SQLServer将锁升级?
SQLServer使用锁来保持事务在数据库内部的完整性和一致性。
SQLServer支持具有不同粒度的多种锁类型。
例如,行锁是一个高级锁,而页锁是一个低级锁。
SQLServer自动将大量的高级锁升级为少量的低级锁,从而降低系统开销,但同时也可能导致应用程序内不可预测的阻塞。
升级在锁的数量超过锁升级极限时自动进行。
这一极限是一个内部设置,设计用于保护系统资源。
该极限值不能由用户设置,但在以跟踪标记1211(无文档记载)启动SQLServer时,该锁升级将被禁用。
请注意,如果禁用了锁升级,管理系统的职责将由您承担。
如果SQLServer内存不足,系统可能会崩溃。
一个更好的解决方案为,如果肯定需要行级锁,可以执行较短的事务。
--SQLServerMVPs
使用SQLServer导入和索引MicrosoftWord文档
2003年7月25日
我需要将MicrosoftWord文档导入至SQLServer并索引这些文档,以便在关系查询中使用这些文档。
怎样导入和索引文档呢?
SQLServer允许您以多种方式导入Word文档。
让我们看看几种最常用的方法。
请注意,在将文档导入至SQLServer之前,您需要创建一个image数据类型列,用于存放数据。
然后,您可以使用textcopy.exe命令行工具将image文件读入数据库,从而完成文档的导入操作。
如果需要该工具的基本说明文档,请在命令提示状态下键入textcopy/?
。
将Word文档导入SQLServer的另一个方法是使用MicrosoftActiveXDirectoryObject(ADO)Stream接口编写导入代码。
您可以在Microsoft产品支持服务(PSS)的通过使用ADOStream对象访问和修改SQLServerBLOB数据一文中找到示例代码。
此外,您也可以将二进制数据移到SQLServer中。
有关这一方法的详细说明,请参阅PSS的使用ADO检索和更新SQLServer文本域一文。
移动二进制数据允许您将数据的一部分存放在数据库中,这在需要控制数据格式时尤其有用。
例如,如果只需要数据中1,000到1,010之间的字节,导入二进制数据的速度远远高于使用ADOStream接口的速度,这是由于SQLServer从磁盘上检索数据的量大为减少。
人们通常使用这一技术来存储位掩码,用于表示应用程序的开或关标志位。
SQLServer2000自带了说明了如何移动二进制数据的示例代码。
如需查看该代码,只需在安装有SQLServer2000光盘上代码示例的驱动器上选择\ProgramFiles\MicrosoftSQLServer\80\Tools\DevTools\Samples\ado路径。
展开该可执行文件,在VisualBasic目录下查找Samples子目录。
在Employee示例下,注意一下该代码是如何使用FillDataFields()函数的。
如需索引Word文档,SQLServer7.0和SQLServer2000都提供了全文搜索组件。
该组件混合使用了多种技术,用以索引大型文本和image列。
在执行全文搜索时,您需要指定image列所含的文件类型,以及从二进制数据中析取信息所需的筛选(filter)。
有关使用全文索引的详细信息,请参阅SQLServer在线书籍中的相关主题,并阅读DavidJones2000年7月发表在SQLServer杂志网站上的名为构建更好的搜索引擎一文。
请注意,索引Word文档并不会自动生成包含文档中关键字的一组关系表。
但是,索引文件让您将这些Word文档包含在您的搜索中。
以下是从数据中析取关键字的可行方式:
使用OLE自动处理从文档中读取用户定义的关键字。
在装载该文档时将这些关键字保存在关系表中。
使用OLE自动处理打开文档并将其保存为文本(.txt)格式。
为了析取重要的词语,您可以使用自己的“词语分析器”遍历该文本文件。
文字分析器查看文档中的每个词语,去除一些无用文字,并将每个唯一的词语与其出现的次数一道存储起来。
在新的全文索引文档中搜索特定的关键字,并将这些关键字输入到关系表中。
SQLServer2000提供了多个强大的工具和接口,用于帮助用户实现二进制MicrosoftOffice文档的快速装载、搜索和检索。
Ghost记录清理和602错误
最近,在使用SQL事件探查器监视我的SQLServer数据库时,我定期收到“Error:
602,Severity:
21,State:
13”信息。
在SQLServer企业管理器的进程信息窗口中,我找到了一个名为“GhostRecordCleanup”(幻影记录清除)的后台进程,并且该命令由用户系统所引发。
我使用DBCCCHECKDB检查我的数据库,但是没有发现任何异常。
请问什么是GhostRecordCleanup进程?
什么是602错误消息?
在从数据库中删除行、页或扩展盘区时,SQLServer会将这些对象标记为“幻影”(表示删除操作有待执行),并在稍后使用后台任务清除这些对象,该进程就是GhostRecordCleanup。
GhostRecordCleanup改善了Delete命令的性能,因为SQLServer无需立即执行物理清除操作。
如需了解出现602错误的原因,您可以在SQLServer错误日志中查找提供ObjectID的一行信息。
然后,您可以使用该ObjectID跟踪到导致该错误的数据库或对象。
如果该对象仍然存在(例如,它不是诸如临时表的临时对象),您可以对其运行DBCCCHECKTABLE,并通过查询sysindexes验证该对象并未受损。
如果对象未受损,则SQLServer错误地发出了602错误消息。
多数情况下,SQLServer发布了错误的消息。
如需了解602错误所代表的意思,请访问Microsoft产品支持服务网站并搜索“错误消息”和602。
搜索将返回一系列说明如何解决602错误及其含义的文章。
—SQLServer开发团队
使用扩展属性创建数据字典工具
我正在寻找可以帮助我维护一个SQLServer数据字典的共享软件或低成本工具。
我使用过具备该功能的高级数据建模工具。
但是,我现在的公司有许多SQLServer数据库,但是没有数据字典,并且也没有购买价格不菲的工具的打算。
您知道有哪些给“穷人”用的数据字典工具吗?
尽管可能有免费或低成本的共享软件工具,但我对它们不是很熟悉。
我建议您尝试使用SQLServer2000的扩展属性。
在SQLServer2000中,Microsoft添加了扩展属性,用于帮助用户在多个数据库对象上定义和操作用户定义的属性。
您可以使用这些用户定义的属性向您的数据库添加元数据,并使用该数据库创建一个直接集成在SQLServer中的“土制”数据字典。
您可以使用系统存储过程sp_addextendedproperty、sp_updateextendedproperty及sp_dropextendedproperty来管理这些属性。
此外,您可以使用系统函数fn