SQL Server常见面试题
Tags: MSSQLSQL Server面试笔试
SQL Server数据库也是一种比较重要的数据库,在面试笔试中也会经常涉及到,因此,有必要对这种数据库有一些基本的了解。SQL Server部分内容较少,也比MySQL和Oracle简单,最核心的内容还是公共部分的SQL查询,应该以此为重点。
SqlServer2012系统数据类型有哪些?
数据类型 | 符号标识 |
---|---|
数据类型 | bigint、int、smallint、tinyint |
整数型精确数值型 | decimal、numeric |
浮点型 | float、real |
货币型 | money、smallmoney |
位型 | bit |
字符型 | char、varchar、varchar(MAX) |
Unicode字符型 | nchar、nvarchar、nvarchar(MAX) |
文本型 | text、ntext |
日期时间类型 | datetime、smalldatetime、date、time、datetime2、datetimeoffset |
时间截型 | timestamp |
图像型 | image |
其他 | cursor、sql_variant、table、uniqueidentifier、xml、hierarchyi |
WHERE子句与HAVING子句有何不同?
Where是一个约束声明,是在查询结果集返回之前约束来自数据库的数据,且Where中不能使用聚合函数。
Having是一个过滤声明,是在查询结果集返回以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。
试说明游标的种类和用途。
种类:前端(客户端)游标、后端(服务器端)游标
用途:游标提供了对一个结果集进行逐行处理的能力,游标可看做一种特殊的指针,它与某个查询结果相联系,可以指向结果集的任意位置,以便对指定位置的数据进行处理。
举例说明游标的使用方法和步骤。
- 声明游标
- 打开游标
- 读取数据
- 关闭游标
- 删除游标
在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和IDValues,类型都是int型,并解释下两者的区别?
用户临时表:create table #xx(ID int, IDValues int)
系统临时表:create table ##xx(ID int, IDValues int)
区别:
用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.
当创建它的进程消失时这个临时表就自动删除.
全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.
sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方式实现这种无限容量机制的。
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL Server的存储容量是可以扩大的.
SQL Server 2000 数据库有三种类型的文件:
主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。
次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。
日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。
SQL Server简答题
真题1、请写出四条最基本SQL语句。
答案:SELECT * FROM 表名;
INSERT INTO表名(字段,字段,…);
UPDATE表名SET (字段=值,字段=值,…) WHERE (条件);
DELETE FROM 表名 WHERE (条件);
真题2、学生信息管理系统中有张表STUDENT,其中,有字段ID、NAME、SEX、BIRTH,请回答如下问题:
(1)找出NAME相同的学生(用一句SQL语句)。
(2)用一句SQL语句把学生SEX为男的改为女,女的改为男。
答案:(1)SELECT * FROM STUDENT WHERE NAME IN (SELECT NAME FROM STUDENT GROUP BY NAME HAVING COUNT(NAME)>1);
(2)UPDATE STUDENT SET SEX = CASE SEX WHEN '男' THEN '女' ELSE '男' END;
真题3、SQL Server、Access、Oracle三种数据库之间的区别是什么?
答案:Access是一种桌面数据库,只适合于数据量少的应用系统,在处理少量数据和单机访问的数据时是很好的,效率也很高。但是Access数据库有一定的极限,如果数据达到100M左右,那么很容易造成Access假死,或者消耗掉服务器的内存导致服务器崩溃。
SQL Server是基于服务器端的中型的数据库,可以适合大容量数据的应用。在处理海量数据的效率,后台开发的灵活性,可扩展性等方面强大。因为现在数据库都使用标准的SQL语言对数据库进行管理,所以,如果是标准SQL语言,那么两者基本上都可以通用的。SQL Server还有更多的扩展,可以用存储过程、函数等。
Oracle是基于服务器的大型数据库,主要应用于银行、证券类业务等。
真题4、SQL Server的两种存储结构是什么?
答案:SQL Server的两种存储结构是页与区间。
(1)页:用于数据存储的连续的磁盘空间块,SQL Server中数据存储的基本单位是页,磁盘I/O操作在页级执行,页的大小为8KB,每页的开头是96字节的页头,用于存储有关页的系统信息,包括页码、页类型、页的可用空间以及拥有该页的对象的分配单元ID。
(2)区间:区是管理空间的基本单位,一个区是8个物理上连续的页(即64KB)的集合,所有页都存储在区中。SQL Server有两种类型的区:统一区和混合区。
l 统一区:由单个对象所有,区中的所有8页只能由一个对象使用。
l 混合区:最多可由8个对象共享。区中8页中的每页可以由不同对象所有,但是一页总是只能属于一个对象。
\&*** *说明:****
有关SQL Server页和区间的更多内容可以参考我的博客:http://blog.itpub.net/26736162/viewspace-2142922/。
真题5、描述下ASP.NET中使用DataReader对象和DataSet对象的区别?
答案:ASP.NET是一个统一的Web开发模型,它包括使用尽可能少的代码生成企业级Web应用程序所必需的各种服务。ASP.NET作为.NET Framework的一部分提供。当编写ASP.NET应用程序的代码时,可以访问.NET Framework中的类。可以使用与公共语言运行库(CLR)兼容的任何语言来编写应用程序的代码,这些语言包括Microsoft Visual Basic、C#、JScript.NET和J#。使用这些语言,可以开发利用公共语言运行库、类型安全、继承等方面的优点的ASP.NET应用程序。
DataReader对象是只向前的连接数据读取器,使用它可以快速有效地访问数据。DataSet对象提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系.DataReader对象会使得SQL Server的连接处于忙碌桩,以便只有在关闭DataReader之后才可以在这个连接上执行其他操作。DataSet对象可以看作是DATATABLE对象的容器,可以在数据库操作时将多个表的所有数据都放在DataSet中,用在单独一次调用中将其返回,避免了重复调用的过程。DataSet对象的调用将在内存开辟一个虚拟的表,因此将占有相当的内存空间。
真题6、SQL Server如何查询阻塞?
答案:SQL Server的阻塞查询主要来自sys.sysprocesses。通常在处理时需要加入其它相关的视图或表,例如如sys.dm_exec_connections,sys.dm_exec_sql_text。通过如下几个语句的查询,可以找到阻塞的语句。
SELECT BL.SPID BLOCKING_SESSION,
BL.BLOCKED BLOCKED_SESSION,
ST.TEXT BLOCKEDTEXT
FROM (SELECT SPID, BLOCKED
FROM SYS.SYSPROCESSES A
WHERE BLOCKED > 0
AND NOT EXISTS (SELECT 1
FROM SYS.SYSPROCESSES B
WHERE BLOCKED > 0
AND A.BLOCKED = B.SPID)
UNION
SELECT SPID, BLOCKED
FROM SYS.SYSPROCESSES
WHERE BLOCKED > 0) BL,
(SELECT T.TEXT, C.SESSION_ID
FROM SYS.DM_EXEC_CONNECTIONS C
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(C.MOST_RECENT_SQL_HANDLE) T) ST
WHERE BL.BLOCKED = ST.SESSION_ID;
或:
SELECT A.BLOCKING_SESSION_ID, A.WAIT_DURATION_MS, A.SESSION_ID, B.TEXT
FROM SYS.DM_OS_WAITING_TASKS A,
(SELECT T.TEXT, C.SESSION_ID
FROM SYS.DM_EXEC_CONNECTIONS C
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(C.MOST_RECENT_SQL_HANDLE) T) B
WHERE A.SESSION_ID = B.SESSION_ID
AND A.BLOCKING_SESSION_ID IS NOT NULL;
包含阻塞与被阻塞的SQL脚本:
SELECT BL.SPID BLOCKING_SESSION,
BL.BLOCKED BLOCKED_SESSION,
ST.TEXT BLOCKEDTEXT,
SB.TEXT BLOCKINGTEXT
FROM (SELECT SPID, BLOCKED
FROM SYS.SYSPROCESSES A
WHERE BLOCKED > 0
AND NOT EXISTS (SELECT 1
FROM SYS.SYSPROCESSES B
WHERE BLOCKED > 0
AND A.BLOCKED = B.SPID)
UNION
SELECT SPID, BLOCKED
FROM SYS.SYSPROCESSES
WHERE BLOCKED > 0) BL,
(SELECT T.TEXT, C.SESSION_ID
FROM SYS.DM_EXEC_CONNECTIONS C
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(C.MOST_RECENT_SQL_HANDLE) T) ST,
(SELECT T.TEXT, C.SESSION_ID
FROM SYS.DM_EXEC_CONNECTIONS C
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(C.MOST_RECENT_SQL_HANDLE) T) SB
WHERE BL.BLOCKED = ST.SESSION_ID
AND BL.SPID = SB.SESSION_ID;
查询死锁:
SELECT *
FROM MASTER ..SYSPROCESSES
WHERE DB_NAME(DBID) = '数据库名'
AND SPID <> @@SPID
AND DBID <> 0
AND BLOCKED > 0;
真题7、在SQL Server中,请用SQL创建一张本地临时表和全局临时表,里面包含两个字段ID和IDVALUES,类型都是INT型,并解释下两者的区别?
答案:在SQL Server中,临时表有两种类型:本地临时表和全局临时表。临时表与永久表相似,但临时表存储在Tempdb中,当不再使用时会自动删除。本地临时表只对创建这个表的用户的SESSION可见,对其它进程是不可见的。当创建它的进程消失时这个临时表就自动删除。本地临时表的名称以单个数字符号(#)打头。全局临时表对整个SQL Server实例都可见,但是所有访问它的SESSION都消失的时候,它也自动删除。全局临时表的名称以两个数字符号(##)打头。它们的创建语句如下所示:
本地临时表:CREATE TABLE #XX(ID INT, IDVALUES INT);
全局临时表:CREATE TABLE ##XX(ID INT, IDVALUES INT);
\&*** *说明:****
有关SQL Server中的临时表的更多内容可以参考我的博客:http://blog.itpub.net/26736162/viewspace-2143061/
SQL Server如何获取系统时间?
利用函数GETDATE可以获取系统时间,查询语句为SELECT GETDATE()。实际运行过程如下图所示:
图 5-1 SQL Server获取系统时间
SQL Server有Linux版本吗?
微软在2016年推出了Linux系统的SQL Server预览版,并将于2017年全面发布这款产品。微软云计算和企业业务负责人斯科特●格里斯(Scott Guthrie)表示,该公司将会推出本地版和云计算版两个版本。格里斯称,Linux版SQL Server将包含SQL Server 2016中的Stretch Database功能,但该公司并未明确披露其它新技术是否也会整合到Linux版中,而微软发言人证实,不会将SQL Server 2016的所有功能都引入Linux,只会提供“核心关系型数据库功能”。
红帽产品和技术总裁保罗·康美尔(Paul Cormier)表示,该公司将在红帽企业版Linux中提供SQL Server。Canonical创始人马克·沙特沃斯(Mark Shuttleworth)也表示,Ubuntu开发者也将可以使用SQL Server数据库。微软还在预览版页面上披露,Linux版SQL Server已经可以在Ubuntu中使用。微软发言人表示,预览版已经支持Ubuntu,该公司今后还将支持红帽企业版Linux和其它平台。微软为了在Linux上使用SQL Server,创建了SQL平台抽象层(SQLPAL,SQL Platform Abstraction Layer)。正因为有了这个SQL平台抽象层更加加快了SQL Server的移植速度。
2017和2019的linux版本已发布,可以参考:https://www.xmmup.com/wsl2zhonganzhuangdockerbingkuaisugoujianduozhongshujukuceshihuanjing.html#SQL_Server
SQL Server如何查看版本?
方法一:图形界面查询:
图 5-2 查看SQL Server版本
图 5-3 查看SQL Server版本
方法二:可以通过SQL语句查询来获取数据库的版本,SQL语句为:SELECT @@VERSION,如下所示:
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition on Windows NT 5.1
下图为SQL语句查看SQL Server版本的截图:
图 5-4 SQL语句查看SQL Server版本
SQL Server 数据库如何启动?
在Windows服务控制台里手动启动,这个也是最常用的方式。键入“Win+R”键打开运行窗口,然后输入services.msc打开服务窗口,如下所示:
图 5-5 使用服务控制台启动
另外,SQL Server自己提供的启动方式可以手动启动。
图 5-6 启动SQL Server
在SQL Server的SSMS里面手动启动它,利用这种方式可以进行手动重启数据库。
另外,通过Windows命令窗口,可以使用“net start mssqlserver”命令手动启动SQL Server数据库。
SQL Server有哪些默认的系统数据库?
总体而言,SQL Server有如下4个默认的数据库:Master、Model、Tempdb和Msdb。
(1)Master
Master数据库(主数据库)保存放在SQL Server实体上的所有数据库元数据的详细信息,它还是将引擎固定起来的粘合剂。由于如果不使用Master数据库,那么SQL Server就不能启动,所以,必须要小心地管理好这个数据库。因此,对这个数据库进行常规备份是十分必要的。这个数据库还包括了诸如系统登录、配置设置、已连接的Server信息、扩展存储过程等。
(2)Model
Model数据库(模型数据库)是一个用来在实体上创建新用户数据库的模版数据库,可以把任何存储过程、视图、用户等放在模型数据库里,这样在创建新数据库的时候,新数据库就会包含存放在模型数据库里的所有对象了。
(3)Tempdb
Tempdb数据库存有临时对象,例如全局和本地临时表和存储过程。这个数据库在SQL Server每次重启的时候都会被重新创建,而其中包含的对象是依据模型数据库里定义的对象被创建的。除了这些对象,Tempdb还存有其它对象,例如表变量、来自表值函数的结果集,以及临时表变量。由于Tempdb会保留SQL Server实体上所有数据库的对象类型,所以,对数据库进行优化配置是非常重要的。
(4)Msdb
Msdb数据库用来保存数据库备份、SQL Agent信息、DTS程序包和SQL Server任务等信息,以及诸如日志转移这样的复制信息。
从SQL Server Studio中可以查看所有的数据库,如下图所示:
真题1、在SQL Server中,()保存所有的临时表和临时存储过程
A、master数据库 B、tempdb数据库 C、model数据库 D、msdb数据库
答案:B。
SQL Server物理有哪几种类型的文件?
SQL Server数据库文件组成如下所示:
(1)主数据文件:默认扩展名为.mdf。
(2)辅助数据文件:默认扩展名为.ndf(一个数据库可以创建多个.ndf文件)。
(3)事务日志文件:默认扩展名为.ldf(记录对数据库的所有操作,但不包含所操作的数据)。
所有的数据文件和日志文件默认位置在C:/Program Files/Microsoft SQL Server/MSSQL.n/MSSQL/Data(其中,n是标识已安装的SQL Server实例名称_实例名)。需要注意的是,应当将所有的数据和对象存储在.ndf文件中,而.mdf文件只负责存储数据目录,这样可以有效地避免访问时的磁盘争用。
物理文件组成也可以参考下图:
SQL Server哪类视图是可以更新的?
SQL Server 2000有两种方法增强可更新视图的类别:
(1)INSTEAD OF触发器
可以在视图上创建INSTEAD OF触发器,从而使视图可更新。当对一个定义了INSTEAD OF触发器的视图执行操作的时候,实际上执行的是触发器中定义的操作,而不是触发了触发器的数据修改语句。因此,如果在视图上存在INSTEAD OF触发器,那么通过该语句可更新相应的视图。
(2)分区视图
如果视图属于“分区视图”的指定格式,那么该视图的可更新性将受到限制。如果视图没有INSTEAD OF触发器,或者视图不是分区视图,那么视图只有满足下列条件才可更新:
l SELECT_statement在选择列表中没有聚合函数,也不包含TOP、GROUP BY、UNION或DISTINCT子句。
l SELECT_statement的选择列表中没有派生列。派生列是由任何非简单列表达式(使用函数、加法或减法运算符等)所构成的结果集列。
l SELECT_statement中的FROM子句至少引用一个表。SELECT_statement必须不能只包含非表格格式的表达式(即不是从表派生出的表达式)。例如,以下视图是不可更新的:
CREATE VIEW NoTable AS
SELECT GETDATE() AS CurrentDate,
@@LANGUAGE AS CurrentLanguage,
CURRENT_USER AS CurrentUser;
SQL Server标准的SQL与T-SQL的区别是什么?
SQL是Structrued Query Language的缩写,即结构化查询语言,它是负责与数据库交互的标准。作为关系型数据库的标准语言,它已被众多商用DBMS产品所采用,使得它已成为关系型数据库领域中一个主流语言,不仅包含数据查询功能,还包括插入、删除、更新和数据定义功能。
T-SQL是SQL语言的一种版本,且只能在SQL Server上使用。它是ANSI SQL的加强版语言,提供了标准的SQL命令。另外,T-SQL还对SQL做了许多补充,提供了类似C、Basic和Pascal的基本功能,例如变量说明、流控制语言、功能函数等。
SQL部分永远是数据库操作的核心部分,所以,这方面的知识点非常重要。
真题1、假设有表数据:TABLE
ID NAME NUM
A a 9
A b 11
B f 7
B g 8
所要结果:
A b 11
B g 8
请写出获得此结果的SQL语句。
答案:本题考察的是聚合函数和子查询,先按照ID列进行分组找出NUM最大的值,然后回表查询即可得最终结果,最终SQL语句如下所示:
SELECT * FROM TABLE WHERE NUM IN (SELECT MAX(NUM) FROM TABLE GROUP BY ID);
真题2、设教学数据库中有三个基本表:
学生表S(S#,SNAME,AGE,SEX),其属性表示学生的学号、姓名、年龄和性别;选课表SC(S#,C#,GRADE),其属性表示学生的学号、所学课程的课程号和成绩;课程表C(C#,CNAME,TEACHER),其属性表示课程号、课程名称和任课教师姓名。
下面的题目都是针对上述三个基本表操作的。
(1)试写出下列插入操作的SQL语句:
把SC表中每门课程的平均成绩插入到另一个已存在的表SC_C(C#,CNAME,AVG_GRADE)中,其中,AVG_GRADE为每门课程的平均成绩。
答案:
INSERT INTO SC_C(C#,CNAME,AVG_GRADE) SELECT SC.C#,C.CNAME,AVG(GRADE) FROM SC,C WHERE SC.C#=C.C# GROUP BY SC.C#, C.CNAME;
(2)试写出下列删除操作的SQL语句:
从SC表中把WU老师的女学生选课元组删去。
答案:
DELETE FROM SC WHERE S# IN (SELECT S# FROM S WHERE SEX='女') AND C# IN (SELECT C# FROM C WHERE TEACHER='WU');
真题3、设有如下关系表
供应者:SUPPLIER(SNO,SNAME,CITY),其中,SNO供应者编号,SNAME为供应者姓名,CITY所在城市
零件:PART(PNO,PNAME,WEIGHT),其中,PNO零件号,PNAME零件名称,WEIGHT重量
工程:JOB(JNO,JNAME,CITY),其中,JNO工程号,JNAME工程名,CITY所在城市
联系关系:SPJ(SNO,PNO,JNO,QTY),其中,QTY为数量
答案:(1)查找给工程J1提供零件P1的供应者号SNO
SELECT SNO FROM SPJ,PART,JOB WHERE SPJ.PNO = PART.PNO AND SPJ.JNO = JOB.JNO AND PART.PNAME = 'P1' AND JOB.JNAME = 'J1';
(2)查找在北京的供应者给武汉的工程提供零件的零件号
SELECT PNO FROM SPJ,PART,JOB WHERE SPJ.PNO = PART.PNO AND SPJ.JNO = JOB.JNO AND JOB.CITY = '武汉' AND SUPPLIER.CITY = '北京';
(3)查找由供应者S1提供的零件名PNAME
SELECT PNAME FROM PART WHERE PNO IN (SELECT PNO FROM SPJ, SUPPLIER WHERE SPJ.SNO = SUPPLIER.SNO AND SUPPLIER.SNAME = 'S1');
(4)查找CITY值为上海的工程号和名称
SELECT JNO,JNAME FROM JOB WHERE CITY = '上海';
(5)将工程J3的城市改为广州
UPDATE JOB SET CITY = '广州' WHERE JNAME = 'J3';
(6)将所有重20公斤的零件改为重10公斤
UPDATE PART SET WEIGHT='10公斤' WHERE WEIGHT='20公斤';
(7)将给工程J1提供零件P1的供应者S1改为S2
UPDATE SUPPLIER SET SNAME = 'S2' WHERE SNAME = 'S1' AND SNO IN
(SELECT SNO FROM SPJ,JOB,PART WHERE SPJ.JNO = JOB.JNO AND JOB.JNAME = 'J1' AND SPJ.PNO = PART.PNO AND PART.PNAME = 'P1');
(8)将值(S3,麦苗,上海)加到SUPPLIER中
INSERT INTO SUPPLIER VALUES('S3', '麦苗', '上海');
(9)删除所有上海工程的数据
DELETE FROM SPJ WHERE JNO IN (SELECT JNO FROM JOB WHERE CITY = '上海');
DELETE FROM JOB WHERE CITY = '上海';
需要注意的是,上述语句的顺序不能弄反。
答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | (1)SELECT SNO FROM SPJ,PART,JOB WHERE SPJ.PNO = PART.PNO AND SPJ.JNO = JOB.JNO AND PART.PNAME = 'P1' AND JOB.JNAME = 'J1'; (2)SELECT PNO FROM SPJ,PART,JOB WHERE SPJ.PNO = PART.PNO AND SPJ.JNO = JOB.JNO AND JOB.CITY = '武汉' AND SUPPLIER.CITY = '北京'; (3)SELECT PNAME FROM PART WHERE PNO IN (SELECT PNO FROM SPJ, SUPPLIER WHERE SPJ.SNO = SUPPLIER.SNO AND SUPPLIER.SNAME = 'S1'); (4)SELECT JNO,JNAME FROM JOB WHERE CITY = '上海'; (5)UPDATE JOB SET CITY = '广州' WHERE JNAME = 'J3'; (6)UPDATE PART SET WEIGHT='10公斤' WHERE WEIGHT='20公斤'; (7)UPDATE SUPPLIER SET SNAME = 'S2' WHERE SNAME = 'S1' AND SNO IN (SELECT SNO FROM SPJ,JOB,PART WHERE SPJ.JNO = JOB.JNO AND JOB.JNAME = 'J1' AND SPJ.PNO = PART.PNO AND PART.PNAME = 'P1'); (8)INSERT INTO SUPPLIER VALUES('S3', '麦苗', '上海'); (9)DELETE FROM SPJ WHERE JNO IN (SELECT JNO FROM JOB WHERE CITY = '上海'); DELETE FROM JOB WHERE CITY = '上海'; --需要注意的是,上述语句的顺序不能弄反。 |
SQL Server采用什么方法可以保证数据的完整性?
可以采用如下的规则来保证数据的完整性:
(1)实体完整性
实体完整性表示每张表的主键唯一且不能为空。可以通过索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性来实现实体完整性。
(2)域完整性
域完整性是指给定列的输入有效性。强制域有效性的方法有:限制类型(通过数据类型)、格式(通过CHECK约束和规则)或可能值的范围(通过Foreign Key约束、CHECK约束、DEFAULT定义、NOT NULL定义和规则)。
(3)引用完整性
在插入或删除记录时,引用完整性保持表之间已定义的关系。在SQL Server 2000中,引用完整性基于外键与主键之间或外键与唯一键之间的关系(通过Foreign Key和CHECK约束)。引用完整性确保键值在所有表中一致。这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。
(4)用户定义完整性
用户定义完整性能够定义不属于其它任何完整性分类的特定业务规则。所有的完整性类型都支持用户定义完整性(CREATE TABLE 中的所有列级和表级约束、存储过程和触发器)。
登录名、服务器角色、用户名和数据库角色
登录名就是可以登录该服务器的名称;服务器角色就是该登录名对该服务器具有的权限,一个服务器可以有多个角色,一个角色可以有多个登录名,就好像操作系统可以有多个登录用户。
表 5-1 固定服务器角色
固定服务器角色 | 描述 |
---|---|
sysadmin | 可以在SQL Server中执行任何操作。 |
serveradmin | 可以设置服务器范围的配置选项,可以关闭服务器。 |
setupadmin | 可以管理链接服务器和启动过程。 |
securityadmin | 可以管理登录和CREATE DATABASE权限,还可以读取错误日志和更改密码。 |
processadmin | 可以管理在SQL Server中运行的进程。 |
dbcreator | 可以创建、更改和删除数据库。 |
diskadmin | 可以管理磁盘文件。 |
bulkadmin | 可以执行BULK INSERT语句。 |
db_owner | 在数据库中有全部权限。 |
db_accessadmin | 可以添加或删除用户ID。 |
db_securityadmin | 可以管理全部权限、对象所有权、角色和角色成员资格。 |
db_ddladmin | 可以发出ALL DDL,但不能发出GRANT、REVOKE或DENY语句。 |
db_backupoperator | 可以发出 DBCC、CHECKPOINT和BACKUP语句。 |
db_datareader | 可以选择数据库内任何用户表中的所有数据。 |
db_datawriter | 可以更改数据库内任何用户表中的所有数据。 |
db_denydatareader | 不能选择数据库内任何用户表中的任何数据。 |
db_denydatawriter | 不能更改数据库内任何用户表中的任何数据。 |
在使用的过程中,一般使用sa(登录名)或Windows Administration(Windows集成验证登陆方式)登陆数据库,这种登录方式登录成功以后具有最高的服务器角色,也就是可以对服务器进行任何一种操作,而这种登录名具有的用户名是DBO(数据库默认用户,具有所有权限),但是,在使用的过程中,一般感觉不到DBO的存在,但它确实存在。一般通常创建用户名与登录名相同(如果不改变用户名称的话,那么系统会自动创建与登录名相同的用户名,这个不是强制相同的),例如创建了一个登录名称为“ds”,那么可以为该登录名“ds”在指定的数据库中添加一个同名用户,使登录名“ds”能够访问该数据库中的数据。
SQL Server中的完全备份、差异备份和日志备份的区别是什么?
完全备份可对整个数据库进行备份。这包括对部分事务日志进行备份,以便在还原完整数据库备份之后,能够恢复完整数据库。
差异备份基于的是最近一次的完全备份。差异备份仅捕获自上次完全备份后发生更改的数据。差异备份基于的完全备份称为差异的“基准”。完全备份可以用作一系列差异备份的基准,包括数据库备份、部分备份和文件备份。文件差异备份的基准备份可以包含在完全备份、文件备份或部分备份中。
日志备份分为事务日志备份和结尾日志备份。在创建任何日志备份之前,必须至少创建一个完全备份。然后,可以随时备份事务日志。建议经常执行日志备份,这样既可尽量减少丢失工作的风险,也可以截断事务日志。通常,数据库管理员偶尔(例如每周)会创建完全备份,还可以选择以较短间隔(例如每天)创建一系列差异备份。数据库管理员可以比较频繁地(例如每隔10分钟)创建事务日志备份。对于给定的备份类型,最恰当的备份间隔取决于一系列因素,例如数据的重要性、数据库的大小和服务器的工作负载。结尾日志备份捕获尚未备份的任何日志记录(“结尾日志”),以防丢失所做的工作并确保日志链完好无损。在将SQL Server数据库恢复到其最近一个时间点之前,必须先备份数据库的事务日志。结尾日志备份将是数据库还原计划中相关的最后一个备份。
真题102、SQL Server 2000提供了完全备份、差异备份和日志备份等几种备份方法,其中差异备份备份的内容是()
A、上次差异备份之后修改的数据库全部内容 B、上次完全备份之后修改的数据库全部内容
C、上次日志备份之后修改的数据库全部内容 D、上次完全备份之后修改的数据库内容,但不包括日志等其他内容
答案:B。
SQL Server提供的3种恢复模型都是什么?有什么区别?
SQL Server提供了3种恢复模型,分别是:
① 简单恢复,允许将数据库恢复到最新的备份。
② 完全恢复,允许将数据库恢复到故障点状态。
③ 大容量日志记录恢复,允许大容量日志记录操作。
这些模型都是针对不同的性能、磁盘和磁带空间以及保护数据丢失的需要。例如,当选择恢复模型时,必须考虑下列业务要求之间的权衡:
① 大规模操作的性能(如创建索引或大容量装载)。
② 数据丢失表现(如已提交的事务丢失)。
③ 事务日志空间损耗。
④ 备份和恢复过程的简化。
根据正在执行的操作,可以有多个适合的模型。选择了恢复模型后,设计所需的备份和恢复过程。下表提供了三种恢复模型的优点和含义的概述。
恢复模型 优点 工作损失表现 能否恢复到即时点?
简单恢复 1.允许高性能大容量复制操作。
2.收回日志空间以使空间要求最小。 必须重做自最新的数据库或差异备份后所发生的更改。 可以恢复到任何备份的结尾处。随后必须重做更改。
完全恢复 1.数据文件丢失或损坏不会导致工作损失。
2.可以恢复到任意即时点(例如,应用程序或用户错误之前)。 1.正常情况下没有。
2.如果日志损坏,那么必须重做自最新的日志备份后所发生的更改。 可以恢复到任何即时点。
大容量日志记录恢复 允许高性能大容量复制操作。大容量操作使用最少的日志空间。 如果日志损坏,或者自最新的日志备份后发生了大容量操作,那么必须重做自上次备份后所做的更改。否则不丢失任何工作。 可以恢复到任何备份的结尾处。随后必须重做更改。
简单恢复所需的管理最少。在简单恢复模型中,数据只能恢复到最新的完整数据库备份或差异备份的状态。不使用事务日志备份,而使用最小事务日志空间。一旦不再需要日志空间从服务器故障中恢复,日志空间便可重新使用。与完整模型或大容量日志记录模型相比,简单恢复模型更容易管理,但如果数据文件损坏,那么数据损失表现会更高。
完全恢复和大容量日志记录恢复模型为数据提供了最大的保护性。这些模型依靠事务日志提供完全的可恢复性,并防止最大范围的故障情形所造成的工作损失。完全恢复模型提供最大的灵活性,可将数据库恢复到更早的即时点。
大容量日志记录模型为某些大规模操作(如创建索引或大容量复制)提供了更高的性能和更低的日志空间损耗。不过这将牺牲时间点恢复的某些灵活性。很多数据库都要经历大容量装载或索引创建的阶段,因此可能希望在大容量日志记录模型和完全恢复模型之间进行切换。
SQL Server数据库有哪3类触发器?
SQL Server包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。
1、DML触发器
当数据库中表中的数据发生变化时,包括INSERT、UPDATE、DELETE等任意操作,如果对该表编写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业务规则,以及扩展数据库的约束,默认值等。因为约束只能约束同一个表中的数据,而触发器中则可以执行任意SQL命令。
2、DDL触发器
DDL触发器主要用于审核与规范对数据库中表、触发器和视图等结构上的操作。例如修改表、修改列、新增表和新增列等操作,它在数据库结构发生变化时执行,主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,例如不允许删除某些指定表等。
3、登录触发器
登陆触发器是在用户与数据库实例建立会话时触发LOGIN事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前触发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自PRINT语句的消息)会传送到数据库的错误日志。如果身份验证失败,那么将不触发登录触发器。
SQL Server中的锁
SQL Server中的锁分为以下几种:
名称 | 简介 | 何时使用 | 读 | 写 |
---|---|---|---|---|
共享锁(Share Lock,S锁,读锁) | S锁是可以查看但无法修改和删除的一种数据锁。若事务T对数据对象A加上S锁,则事务T只能读A;其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其它事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 | 当执行SELECT时,数据库会自动使用S锁 | Y | N |
排它锁(eXclusive Lock,X锁,独占锁,写锁,互斥锁) | 如果事务T对数据A加上X锁后,则其它事务不能再对A加任任何类型的锁。获得X锁的事务既能读数据,又能修改数据。 | 执行INSERT、UPDATE、DELETE时数据库会自动使用X锁 | Y | Y |
更新锁(Update Lock,U锁) | U锁意味着事务即将要使用X锁,它目前正在扫描数据,以确定要使用X锁锁定的那些行。它用于可更新的资源中,防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。使用U锁可以提高处理并发查询的吞吐量。 | 读阶段操作阶段更新阶段 | YYN | NNN |
意向锁(Intent Lock,I锁) | I锁是一种用于警示的锁,用于建立锁的层次结构。I锁包含三种类型:意向共享(IS)、意向排它(IX)和意向排它共享(SIX)。 | 锁的标记 | ||
架构锁(Schema Lock,Sch锁,模式锁) | Sch锁分为架构修改(Schema Modify,简记为Sch-M)锁和架构稳定性(Schema Stability,简记为Sch-S)锁。拥有Sch-M锁期间,Sch-M锁将阻止对表进行并发访问。这意味着Sch-M锁在释放前将阻止所有外围操作。某些DML操作使用Sch-M锁阻止并发操作访问受影响的表。Sch-S锁不会阻止某些事务锁,其中包括X锁。因此,在编译查询的过程中,其它事务(包括那些针对表使用X锁的事务)将继续运行。但是,无法针对表执行获取Sch-M锁的并发DDL操作和并发DML操作。 | 当修改表结构时使用,即数据库引擎在执行DDL操作(例如,添加列或删除表)的过程中使用Sch-M锁。当数据库引擎在编译和执行查询时使用Sch-S锁 | N | N |
大容量更新锁(Bulk Update Lock,BU锁) | 数据库引擎在将数据大规模复制到表中时,指定TABLOCK提示或使用sp_tableoption选项(将数据表设置为table lock on bulk load),则是使用BU锁。BU锁允许多个线程将数据并发地大容量加载到同一表,以降低数据表的锁定竞争,同时防止其它不进行大容量加载数据的进程访问该表。 | 在向表进行大容量数据复制且指定了TABLOCK提示时使用 | N | N |
在以上表格中需要注意的是,同一资源可以加多个S锁,但是只能加一个X锁。有关架构锁的更多内容可以参考http://blog.itpub.net/26736162/viewspace-2125949/。
SQL Server选择题
真题9、在SQL Server .Net中()命名空间提供了访问数据库的接口
A、System.Data.SqlCommand B、System.Data.Sql
C、System.Data.SqlClient D、System.Data.SqlServer
答案:C。
System.Data命名空间提供对表示ADO.NET结构的类的访问。通过ADO.NET可以生成一些组件,用于有效管理多个数据源的数据。在断开连接的情形中(如Internet),ADO.NET提供在多层系统中请求、更新和协调数据的工具。ADO.NET结构也在客户端应用程序(如ASP.NET创建的Windows窗体或HTML页)中实现。ADO.NET结构的中心构件是DataSet类。每个DataSet都可以包含多个DataTable对象,每个DataTable都包含来自单个数据源(如SQL Server)的数据。
使用System.Data.SqlClient命名空间(用于SQL Server的.NET Framework数据提供程序)、System.Data.Odbc命名空间(用于ODBC的.NET Framework数据提供程序)、System.Data.OleDb命名空间(用于OLE DB的.NET Framework数据提供程序)或System.Data.OracleClient命名空间(用于Oracle的.NET Framework数据提供程序),可访问要与DataSet结合使用的数据源。每个.NET Framework数据提供程序都有相应的DataAdapter,可以将它用作数据源和DataSet之间的桥梁。
所以,本题的答案为C。
真题10、您的公司有一个DB Server,名为AllWin,其上装了MS SQLSERVER 2000。现在需要您写一个数据库连接字符串,用以连接AllWin上SQL SERVER中的一个名为PubBase实例的Test库。请问,应该选择下面哪一个字符串?
A、“Server=AllWin;Data Source=PubBase;Initial Catalog=Test;Integrated Security=SSPI”
B、“Server= AllWin;Data Source=PubBase;Database=Test;Integrated Security= SSPI”
C、“Data Source= AllWin \PubBase;Initial Category=PubBase;Integrated Security= SSPI”
D、“Data Source= AllWin \ PubBase;Database=Test;Integrated Security= SSPI”
答案:B。
使用服务器名\实例名作为连接指定SQL Server实例的数据源。如果使用的是SQL Server 2008 Express版,那么实例名为SQLEXPRESS。
1.标准安全连接
Data Source = myServerAddress;Initial Catalog = myDataBase;User Id = myUsername;Password = myPassword;
2.可替代的标准安全连接
Server = myServerAddress;Database = myDataBase;User ID = myUsername;Password = myPassword;Trusted_Connection = False;
3.信任连接
Data Source = myServerAddress;Initial Catalog = myDataBase;Integrated Security = SSPI;
可替代的信任连接
Server = myServerAddress;Database = myDataBase;Trusted_Connection = True;
所以,本题的答案为B。
真题11、Python可以访问Microsoft SQL Server数据库吗?
A、可以,但只能通过ODBC访问 B、不行
C、可以,通过标准Python数据库API访问 D、可以,但数据库大小必须小于512MB
答案:A。
Python访问Microsoft SQL Server数据库只能通过ODBC去访问。所以,本题的答案为A。
真题12、ADO.NET使用___命名空间的类访问SQL Server数据库中的数据。()
A、System.Xml.Serialization B、System.Data.OleDb
C、System.Data.SqlClient D、System.IO
答案:C。
ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问数据。之所以使用ADO.NET名称,是因为Microsoft希望表明,这是在NET编程环境中优先使用的数据访问接口。ADO.NET类别(Class)位于System.Data.dll 中,而且会与System.Xml.dll中的XML类别整合。System.Data.SqlClient(对SQL Server进行操作的数据访问类),包括以下几个方面:
l SqlConnection:数据库连接器
l SqlCommand:数据库命名对象
l SqlCommandBuilder:生存SQL命令
l SqlDataReader:数据读取器
l SqlDataAdapter:数据适配器,填充DataSet
l SqlParameter:为存储过程定义参数
l SqlTransaction:数据库事务
所以,本题的答案为C。
真题13、在SQL Server 2005中运行如下T-SQL语句,假定SALES表中有多行数据,执行查询之后的结果是()
BEGIN TRANSACTION A
Update SALES Set qty=30 WHERE qty<30;
BEGIN TRANSACTION B
Update SALES Set qty=40 WHERE qty<40;
Update SALES Set qty=50 WHERE qty<50;
Update SALES Set qty=60 WHERE qty<60
COMMIT TRANSACTION B
COMMIT TRANSACTION A
A、SALES表中qty列最小值大于等于60 B、SALES表中qty列的数据全部为50
C、SALES表中qty列最小值大于等于30 D、SALES表中qty列最小值大于等于40
答案:A。
真题14、下列ASP.NET语句()正确地创建了一个与SQL Server 2000数据库的连接。()
A、SqlConnection con1 = new SqlConnection(Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB)
B、SqlConnection con1 = new Connection("Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB")
C、SqlConnection con1 = new SqlConnection("Data Source = localhost; Integrated Security = SSPI; Initial Catalog = myDB")
答案:C。
连接语法为:
Data Source = myServerAddress;Initial Catalog = myDataBase;User Id = myUsername;Password = myPassword;
方法为:SqlConnection con1 = new SqlConnection("")。
所以,本题的答案为C。
真题15、在.NET framework class library中提供了()技术,以使托管应用程序可以以不连接的方式访问各种数据库)()
A、ADO.NET B、ADO C、ODBC.NET D、SQL Server
答案:A。
真题16、在SQL Server 2012中,创建存储过程的片断如下:Create produre proc_score@passed int=60,@count int outputASSelect @ count=count(*)from score where score<@passed]创建成功后,以下()调用方式是正确的()
A、execute proc_score @passed=70,@count output
B、execute proc_score@count int output
C、declare @count int output execute proc_score 70,@count t
D、declare @count int execute proc_score 70, @count output
答案:D。
真题17、在使用ADO.NET 编写连接到SQL Server 2012 数据库的应用程序时,从提高性能角度考虑,应创建__类的对象,并调用其Open方法连接到数据库。()
A、Connection B、OdbcConnection C、SqlConnection D、OleDbConnection
答案:C。
SQL Server有哪些高可用方案
在Linux中安装MSSQL 2017 Always On Availability Group
在Windows域环境中安装MSSQL 2016 Always On Availability Group
在Windows非域环境中安装使用MSSQL 2016 Always On Availability Group