第一篇:sql试题大全
INNER JOIN操作
INNER JOIN操作用于组合两个表中的记录,只要在公共字段之中有相符的值。可以在任何的 FROM 子句中使用 INNER JOIN 运算。这是最普通的联接类型。只要在这两个表的公共字段之中有相符值,内部联接将组合两个表中的记录。语法:FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2 说明:table1, table2参数用于指定从其中组合记录的表的名称。
field1, field2参数指定被联接字段的名称。如果这些字段不是数值的,被联接的字段必须是相同的数据类型,并且包含相同类型的数据,但是它们不必名称相同。
compopr参数用于指定关系比较运算符,如:“=”,“<”,“>”,“<=”,“>=”,或 “<>”。
如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。在一个 INNER JOIN 之中,可以嵌套 LEFT JOIN 或 RIGHT JOIN,但是在 LEFT JOIN 或 RIGHT JOIN 中不能嵌套 INNER JOIN。
LEFT JOIN操作
LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2 说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:“=”,“<”,“>”,“<=”,“>=” 或 “<>”。如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。
RIGHT JOIN操作
RIGHT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 RIGHT JOIN 运算创建一个右边外部联接。右边外部联接将包含了从第二个(右边)开始的两个表中的全部记录,即使在第一个(左边)表中并没有匹配值的记录。语法:FROM table1 RIGHT JOIN table2 ON table1.field1 compopr table2.field2 说明:table1, table2参数用于指定要将记录组合的表的名称。
field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
compopr参数指定关系比较运算符:“=”,“<”,“>”,“<=”,“>=” 或 “<>”。如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误。
你可以把存储过程当做:把一系列语句合并到一起的这么一个整体
我觉得举例说明比较好,给你个例子:
先将【表1】中ID号为50—2000的记录删除、再将【表2】中的这些记录的状态(STATUS)改为“已解除”:
delete 表1 where ID > 50 and ID < 2000
update 表2 set STATUS = '已解除' where ID > 50 and ID < 2000
正常情况下,以上两条语句分步执行就可以了,如果要用存储过程呢?
先建立存储过程(以下的语法为Sybase数据库的,其他数据库类同):
create procedure PRC_TEST(@start_ID int, @end_ID int)as
begin
delete 表1 where ID > @start_ID and ID < @end_ID
update 表2 set STATUS = '已解除' where ID > @start_ID and ID < @end_ID end
好了,执行这个语句,就将存储过程PRC_TEST提交到数据库里了,它有两个参数:start_ID int 和 end_ID,代表起始和终止ID号,类型为整数型int
怎么用这个存储过程呢? 这样执行:exc PRC_TEST 50, 2000
执行时,它先得到了两个参数,50、2000,分别赋值给start_ID int 和 end_ID,然后按照这两个参数分步执行封装在存储过程里的那两条语句了。
如果你这样执行:exc PRC_TEST 220, 8660
就是处理两个表中ID介于220—8660之间的记录了。
--------------
你也许会问了,既然可以分步执行的几句SQL,为什么要费力的写成存储过程啊?
主要是(我的经验和认识):
1、使数据处理参数化,对经常使用的一系列SQL进行封装,使其成为一个存储过程的整体,在每次执行时只要更换执行参数即可,不用去改里面每句SQL的where子句
2、★★这个很重要★★,假设你要循环处理某些数据,例如需要使用“游标”、“Do...while...语句”…………时,就要用到存储过程(或触发器)
=======================
最后给你转一个短文吧,这是书面上的概念:
将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
那么存储过程与一般的SQL语句有什么区别呢? 存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
存储过程的种类:
1.系统存储过程:以prc_(或sp_)开头,用来进行系统的各项设定.取得信息.相关管理工作, 如 sp_help就是取得指定对象的相关信息
2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用户自定义的存储过程,这是我们所指的存储过程
测试table create table table1(id int,name char)insert into table1 select 1,'q' union all select 2,'r' union all select 3,'3' union all select 4,'5'
要求按指定的id顺序(比如2,1,4,3)排列获取table1的数据
方法1:使用union all,但是有256条数据的限制 select id,name from table1 where id=2 union all select id,name from table1 where id=1 union all select id,name from table1 where id=4 union all select id,name from table1 where id=3
方法2:在order by中使用case when select id ,name from t where id in(2,1,4,3)order by(case id when 2 then 'A' when 1 then 'B' when 4 then 'C' when 3 then 'D' end)
*以上两种方法适合在数据量非常小的情况下使用
方法3:使用游标和临时表
先建一个辅助表,里面你需要的顺序插入,比如2,1,4,3 create table t1(id int)insert into t1 select 2 union all select 1 union all select 4 union all select 3 declare @id int--定义游标 declare c_test cursor for select id from t1
select * into #tmp from table1 where 1=2--构造临时表的结构 OPEN c_test FETCH NEXT FROM c_test INTO @id WHILE @@FETCH_STATUS = 0 BEGIN--按t1中的id顺序插数据到临时表
insert into #tmp select id,name from table1 where id=@id FETCH NEXT FROM c_test INTO @id End Close c_test deallocate c_test
*该方法适合需要按照辅助表的顺序重排table的顺序时使用 方法4:分割字符串参数
select * into #tmp from table1 where 1=2--构造临时表的结构 declare @str varchar(300),@id varchar(300),@m int,@n int set @str='2,1,4,3,'---注意后面有个逗号 set @m=CHARINDEX(',',@str)set @n=1 WHILE @m>0 BEGIN set @id=substring(@str,@n,@m-@n)--print @id insert into #tmp select id,name from table1 where id=convert(int,@id)set @n=@m+1 set @m=CHARINDEX(',',@str,@n)END *该方法比较有通用性
测试结果
id name---------------2 r 1 q 4 5 3 3
本文较长,包含了如下几部分
1.2.3.4.5.使用不带参数的存储过程 使用带有输入参数的存储过程
使用带有输出参数的存储过程
使用带有返回状态的存储过程
使用带有更新计数的存储过程
1使用不带参数的存储过程
使用 JDBC 驱动程序调用不带参数的存储过程时,必须使用 call SQL 转义序列。不带参数的 call 转义序列的语法如下所示: {call procedure-name} 作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:
CREATE PROCEDURE GetContactFormalNames AS BEGIN
SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName FROM Person.Contact END
此存储过程返回单个结果集,其中包含一列数据(由 Person.Contact 表中前十个联系人的称呼、名称和姓氏组成)。
在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 executeQuery 方法调用 GetContactFormalNames 存储过程。
public static void executeSprocNoParams(Connection con){ try { Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(“{call dbo.GetContactFormalNames}”);
while(rs.next()){ System.out.println(rs.getString(“FormalName”));} rs.close();stmt.close();} catch(Exception e){ e.printStackTrace();} } 2使用带有输入参数的存储过程
使用 JDBC 驱动程序调用带参数的存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。带有 IN 参数的 call 转义序列的语法如下所示:
{call procedure-name[([parameter][,[parameter]]...)]}
构造 call 转义序列时,请使用 ?(问号)字符来指定 IN 参数。此字符充当要传递给该存储过程的参数值的占位符。可以使用 SQLServerPreparedStatement 类的 setter 方法之一为参数指定值。可使用的 setter 方法由 IN 参数的数据类型决定。向 setter 方法传递值时,不仅需要指定要在参数中使用的实际值,还必须指定参数在存储过程中的序数位置。例如,如果存储过程包含单个 IN 参数,则其序数值为 1。如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。作为如何调用包含 IN 参数的存储过程的实例,使用 SQL Server 2005 AdventureWorks 示例数据库中的 uspGetEmployeeManagers 存储过程。此存储过程接受名为 EmployeeID 的单个输入参数(它是一个整数值),然后基于指定的 EmployeeID 返回雇员及其经理的递归列表。下面是调用此存储过程的 Java 代码:
public static void executeSprocInParams(Connection con){ try { PreparedStatement pstmt = con.prepareStatement(“{call dbo.uspGetEmployeeManagers(?)}”);pstmt.setInt(1, 50);ResultSet rs = pstmt.executeQuery();while(rs.next()){ System.out.println(“EMPLOYEE:”);System.out.println(rs.getString(“LastName”)+ “, ” + rs.getString(“FirstName”));System.out.println(“MANAGER:”);System.out.println(rs.getString(“ManagerLastName”)+ “, ” + rs.getString(“ManagerFirstName”));System.out.println();} rs.close();pstmt.close();} catch(Exception e){ e.printStackTrace();} } 3使用带有输出参数的存储过程
使用 JDBC 驱动程序调用此类存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。带有 OUT 参数的 call 转义序列的语法如下所示:
{call procedure-name[([parameter][,[parameter]]...)]}
构造 call 转义序列时,请使用 ?(问号)字符来指定 OUT 参数。此字符充当要从该存储过程返回的参数值的占位符。要为 OUT 参数指定值,必须在运行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定各参数的数据类型。
使用 registerOutParameter 方法为 OUT 参数指定的值必须是 java.sql.Types 所包含的 JDBC 数据类型之一,而它又被映射成本地 SQL Server 数据类型之一。有关 JDBC 和 SQL Server 数据类型的详细信息,请参阅了解 JDBC 驱动程序数据类型。
当您对于 OUT 参数向 registerOutParameter 方法传递一个值时,不仅必须指定要用于此参数的数据类型,而且必须在存储过程中指定此参数的序号位置或此参数的名称。例如,如果存储过程包含单个 OUT 参数,则其序数值为 1;如果存储过程包含两个参数,则第一个序数值为 1,第二个序数值为 2。
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程: 根据指定的整数 IN 参数(employeeID),该存储过程也返回单个整数 OUT 参数(managerID)。根据 HumanResources.Employee 表中包含的 EmployeeID,OUT 参数中返回的值为 ManagerID。
在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 execute 方法调用 GetImmediateManager 存储过程:
public static void executeStoredProcedure(Connection con){ try { CallableStatement cstmt = con.prepareCall(“{call dbo.GetImmediateManager(?, ?)}”);cstmt.setInt(1, 5);cstmt.registerOutParameter(2, java.sql.Types.INTEGER);cstmt.execute();System.out.println(“MANAGER ID: ” + cstmt.getInt(2));} catch(Exception e){ e.printStackTrace();} } 本示例使用序号位置来标识参数。或者,也可以使用参数的名称(而非其序号位置)来标识此参数。下面的代码示例修改了上一个示例,以说明如何在 Java 应用程序中使用命名参数。请注意,这些参数名称对应于存储过程的定义中的参数名称:
CREATE PROCEDURE GetImmediateManager @employeeID INT, @managerID INT OUTPUT AS BEGIN
SELECT @managerID = ManagerID FROM HumanResources.Employee WHERE EmployeeID = @employeeID END
存储过程可能返回更新计数和多个结果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 规范,此规范规定在检索 OUT 参数之前应检索多个结果集和更新计数。也就是说,应用程序应先检索所有 ResultSet 对象和更新计数,然后使用 CallableStatement.getter 方法检索 OUT 参数。否则,当检索 OUT 参数时,尚未检索的 ResultSet 对象和更新计数将丢失。使用带有返回状态的存储过程
使用 JDBC 驱动程序调用这种存储过程时,必须结合 SQLServerConnection 类的 prepareCall 方法使用 call SQL 转义序列。返回状态参数的 call 转义序列的语法如下所示:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
构造 call 转义序列时,请使用 ?(问号)字符来指定返回状态参数。此字符充当要从该存储过程返回的参数值的占位符。要为返回状态参数指定值,必须在执行存储过程前使用 SQLServerCallableStatement 类的 registerOutParameter 方法指定参数的数据类型。
此外,向 registerOutParameter 方法传递返回状态参数值时,不仅需要指定要使用的参数的数据类型,还必须指定参数在存储过程中的序数位置。对于返回状态参数,其序数位置始终为 1,这是因为它始终是调用存储过程时的第一个参数。尽管 SQLServerCallableStatement 类支持使用参数的名称来指示特定参数,但您只能对返回状态参数使用参数的序号位置编号。
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下存储过程:
CREATE PROCEDURE CheckContactCity(@cityName CHAR(50))AS BEGIN
IF((SELECT COUNT(*)FROM Person.Address WHERE City = @cityName)> 1)RETURN 1 ELSE
RETURN 0 END
该存储过程返回状态值 1 或 0,这取决于是否能在表 Person.Address 中找到 cityName 参数指定的城市。
在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,然后使用 execute 方法调用 CheckContactCity 存储过程:
public static void executeStoredProcedure(Connection con){ try { CallableStatement cstmt = con.prepareCall(“{? = call dbo.CheckContactCity(?)}”);cstmt.registerOutParameter(1, java.sql.Types.INTEGER);cstmt.setString(2, “Atlanta”);cstmt.execute();System.out.println(“RETURN STATUS: ” + cstmt.getInt(1));} cstmt.close();catch(Exception e){ e.printStackTrace();} } 5 使用带有更新计数的存储过程 使用 SQLServerCallableStatement 类构建对存储过程的调用之后,可以使用 execute 或 executeUpdate 方法中的任意一个来调用此存储过程。executeUpdate 方法将返回一个 int 值,该值包含受此存储过程影响的行数,但 execute 方法不返回此值。如果使用 execute 方法,并且希望获得受影响的行数计数,则可以在运行存储过程后调用 getUpdateCount 方法。
作为实例,在 SQL Server 2005 AdventureWorks 示例数据库中创建以下表和存储过程:
CREATE TABLE TestTable(Col1 int IDENTITY, Col2 varchar(50), Col3 int);
CREATE PROCEDURE UpdateTestTable @Col2 varchar(50), @Col3 int AS BEGIN
UPDATE TestTable SET Col2 = @Col2, Col3 = @Col3 END;在下面的实例中,将向此函数传递 AdventureWorks 示例数据库的打开连接,并使用 execute 方法调用 UpdateTestTable 存储过程,然后使用 getUpdateCount 方法返回受存储过程影响的行计数。
public static void executeUpdateStoredProcedure(Connection con){ try { CallableStatement cstmt = con.prepareCall(“{call dbo.UpdateTestTable(?, ?)}”);cstmt.setString(1, “A”);cstmt.setInt(2, 100);cstmt.execute();int count = cstmt.getUpdateCount();cstmt.close();
System.out.println(“ROWS AFFECTED: ” + count);} catch(Exception e){ e.printStackTrace();} }
1.sql存储过程概述
在大型数据库系统中,存储过程和触发器具有很重要的作用。无论是存储过程还是触发器,都是SQL 语句和流程控制语句的集合。就本质而言,触发器也是一种存储过程。存储过程在运算时生成执行方式,所以,以后对其再运行时其执行速度很快。SQL Server 2000 不仅提供了用户自定义存储过程的功能,而且也提供了许多可作为工具使用的系统存储过程。
存储过程的概念
存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库。中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
在SQL Server 的系列版本中存储过程分为两类:系统提供的存储过程和用户自定义存储过程。系统过程主要存储在master 数据库中并以sp_为前缀,并且系统存储过程主要是从系统表中获取信息,从而为系统管理员管理SQL Server 提供支持。通过系统存储过程,MS SQL Server 中的许多管理性或信息性的活动(如了解数据库对象、数据库信息)都可以被顺利有效地完成。尽管这些系统存储过程被放在master 数据库中,但是仍可以在其它数据库中对其进行调用,在调用时不必在存储过程名前加上数据库名。而且当创建一个新数据库时,一些系统存储过程会在新数据库中被自动创建。用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用户所需数据信息)的存储过程。在本章中所涉及到的存储过程主要是指用户自定义存储过程。
存储过程的优点
当利用MS SQL Server 创建一个应用程序时,Transaction-SQL 是一种主要的编程语言。若运用Transaction-SQL 来进行编程,有两种方法。其一是,在本地存储Transaction-SQL 程序,并创建应用程序向SQL Server 发送命令来对结果进行处理。其二是,可以把部分用Transaction-SQL 编写的程序作为存储过程存储在SQL Server 中,并创建应用程序来调用存储过程,对数据结果进行处理存储过程能够通过接收参数向调用者返回结果集,结果集的格式由调用者确定;返回状态值给调用者,指明调用是成功或是失败;包括针对数据库的操作语句,并且可以在一个存储过程中调用另一存储过程。
我们通常更偏爱于使用第二种方法,即在SQL Server 中使用存储过程而不是在客户计算机上调用Transaction-SQL 编写的一段程序,原因在于存储过程具有以下优点:
(1)存储过程允许标准组件式编程
存储过程在被创建以后可以在程序中被多次调用,而不必重新编写该存储过程的SQL 语句。而且数据库专业人员可随时对存储过程进行修改,但对应用程序源代码毫无影响(因为应用程序源代码只包含存储过程的调用语句),从而极大地提高了程序的可移植性。
(2)存储过程能够实现较快的执行速度
如果某一操作包含大量的Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的执行计划。而批处理的Transaction-SQL 语句在每次运行时都要进行编译和优化,因此速度相对要慢一些。
(3)存储过程能够减少网络流量
对于同一个针对数据数据库对象的操作(如查询、修改),如果这一操作所涉及到的 Transaction-SQL 语句被组织成一存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,否则将是多条SQL 语句,从而大大增加了网络流量,降低网络负载。
(4)存储过程可被作为一种安全机制来充分利用
系统管理员通过对执行某一存储过程的权限进行限制,从而能够实现对相应的数据访问权限的限制,避免非授权用户对数据的访问,保证数据的安全。(我们将在14 章“SQLServer 的用户和安全性管理”中对存储过程的这一应用作更为清晰的介绍)
注意:存储过程虽然既有参数又有返回值,但是它与函数不同。存储过程的返回值只是指明执行是否成功,并且它不能像函数那样被直接调用,也就是在调用存储过程时,在存储过程名字前一定要有EXEC保留字。
2.SQL存储过程创建
创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。
可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。
也可以创建在 Microsoft? SQL Server? 启动时自动运行的存储过程。
语法
CREATE PROC [ EDURE ] procedure_name [;number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [...n ]
参数
procedure_name
新存储过程的名称。过程名必须符合标识符规则,且对于数据库及其所有者必须唯一。
要创建局部临时过程,可以在 procedure_name 前面加一个编号符(#procedure_name),要创建全局临时过程,可以在 procedure_name 前面加两个编号符
(##procedure_name)。完整的名称(包括 # 或 ##)不能超过 128 个字符。指定过程所有者的名称是可选的。
;number
是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为
orderproc;
1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符。
@parameter
过程中的参数。在 CREATE PROCEDURE 语句中可以声明一个或多个参数。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。
使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。
data_type
参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。
说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制。
VARYING
指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数。
default
参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT
表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符。
n
表示最多可以指定 2.100 个参数的占位符。
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
RECOMPILE 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项。
ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。
说明 在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程。
FOR REPLICATION
指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用。
AS
指定过程要执行的操作。
sql_statement
过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制。
n
是表示此过程可以包含多条 Transact-SQL 语句的占位符。
注释
存储过程的最大大小为 128 MB。
用户定义的存储过程只能在当前数据库中创建(临时过程除外,临时过程总是在 tempdb 中创建)。在单个批处理中,CREATE PROCEDURE 语句不能与其它 Transact-SQL 语句组合使用。
默认情况下,参数可为空。如果传递 NULL 参数值并且该参数在 CREATE 或 ALTER TABLE 语句中使用,而该语句中引用的列又不允许使用 NULL,则 SQL Server 会产生一条错误信息。为了防止向不允许使用 NULL 的列传递 NULL 参数值,应向过程中添加编程逻辑或为该列使用默认值(使用 CREATE 或 ALTER TABLE 的 DEFAULT 关键字)。
建议在存储过程的任何 CREATE TABLE 或 ALTER TABLE 语句中都为每列显式指定 NULL 或 NOT NULL,例如在创建临时表时。ANSI_DFLT_ON 和 ANSI_DFLT_OFF 选项控制 SQL Server 为列指派 NULL 或 NOT NULL 特性的方式(如果在 CREATE TABLE 或 ALTER TABLE 语句中没有指定的话)。如果某个连接执行的存储过程对这些选项的设置与创建该过程的连接的设置不同,则为第二个连接创建的表列可能会有不同的为空性,并且表现出不同的行为方式。如果为每个列显式声明了 NULL 或 NOT NULL,那么将对所有执行该存储过程的连接使用相同的为空性创建临时表。
在创建或更改存储过程时,SQL Server 将保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的设置。执行存储过程时,将使用这些原始设置。因此,所有客户端会话的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置在执行存储过程时都将被忽略。在存储过程中出现的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 语句不影响存储过程的功能。
其它 SET 选项(例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS)在创建或更改存储过程时不保存。如果存储过程的逻辑取决于特定的设置,应在过程开头添加一条 SET 语句,以确保设置正确。从存储过程中执行 SET 语句时,该设置只在存储过程完成之前有效。之后,设置将恢复为调用存储过程时的值。这使个别的客户端可以设置所需的选项,而不会影响存储过程的逻辑。
第二篇:VF上机试题 SQL语言
VFP关系数据库标准语言SQL
【机试】
[1] 在练习文件夹中有一个数据库sdb,其中有数据库表student2、sc和course2。3个表结构如下所示:
STUDENT2(学号,姓名,年龄,性别,院系编号)
SC(学号,课程号,成绩,备注)
COURSE2(课程号,课程名,选修课号,学分)
用SQL语句查询“计算机软件基础”课程的考试成绩在85分以下(含85分)的学生的全部信息并将结果按学号升序存入noex.dbf文件中(表的结构同student2,并在其后加入成绩字段)。答案: SELECT STUDENT2.*,成绩 FROM STUDENT2,SC,COURSE2 WHERE
STUDENT2.学号=SC.学号
AND SC.课程号=COURSE2.课程号 AND 课程名=“计算机软件
基础” AND 成绩<=85 ORDER BY STUDENT2.学号 INTO TABLE
NOEX。
[2] 将order_list1表中的全部记录追加到order_list表中,然后用SQL SELECT语句完成查询:按总金额降序列出所有客户的客户号、客户名及其订单号和总金额,并将结果存储到results表中(其中客户号、客户名取自customer表,订单号、总金额取自order_list表)答案:(1)SELECT * FROM ORDER_LIST1 INTO TABLE ORDER_LIST
(2)SELECT CUSTOMER.客户号, ORDER_LIST.客户名,订单号,总金额 FROM CUSTOMER, ORDER_LIST WHERE CUSTOMER.客户
号=ORDER_LIST.客户号 ORDER BY 总金额DESC INTO TABLE
RESULTS.[3]将customer1表中的全部记录追加到customer表中,然后用SQL SELECT语句完成查询:列出目前有订购单的客户信息(即有对应的order_list记录的customer表中的记录),同时要求按客户号升序排序,并将结果存储到results表中(表结构与customer表结构相同)。
答案:SELECT * FROM CUSTOMER1 INTO TABLE CUSTOMER
SELECT * FROM CUSTOMER WHERE 客户号 IN(SELECT 客户号
FROM ORDER_LIST)ORDER BY 客户号 INTO TABLE RESULTS
[4]列出总金额大于所有订购单总金额平均值的订购单(order_list)清单(按客户号升序排列),并将结果存储到results表中(表结构与order_list表结构相同)。
答案:SELECT * FROM ORDER_LIST WHERE 总金额>(SELECT AVG(总金额)FROM ORDER_LIST)ORDER BY 客户号 INTO TABLE RESULTS.
第三篇:SQL数据库期末复习试题 - 填空
三、填空题(每空1分,共20分)1.数据库系统具有数据的___外模式____、__模式_____和内模式三级模式结构。2.SQL Server 2000局部变量名字必须以____@、_____开头,而全局变量名字必须以______@@___开头。
3.语句 select ascii('D'), char(67)的执行结果是:___68______和__C_______。68、C“,2 4.语句 select lower('Beautiful'), rtrim('我心中的太阳 ')的执行结果是: _beautiful____和___我心中的太阳_____。
5.选择运算是根据某些条件对关系做_ 水平__分割;投影是根据某些条件对关系做____垂直”__分割。“ 6.关系运算主要有___选择___、__投影__和连接。
7.完整性约束包括__实体__完整性、_域____性、参照完整性和用户定义完整性。8.在SQL Server 2000中,数据库对象包括__表__、___视图__、触发器、过程、列、索引、约束、规则、默认和用户自定义的数据类型等。
9.语句 select day('2004-4-6'), len('我们快放假了.')的执行结果是:___6______和____7____。
10.语句 select round(13.4321,2), round(13.4567,3)的执行结果是:__13.4300_______和____13.4570_____。
11.完整性约束包括____域___完整性、__实体____完整性、参照完整性和用户定义完整性。
12.T-SQL 语言中,有__算术__运算、字符串连接运算、比较运算和__逻辑__运算。
13.语句 select upper('beautiful'), ltrim(' 我心中的太阳')的执行结果是: ______ BEAUTIFUL __和__我心中的太阳___。
14.索引的类型主要有______聚集索引_______和____非聚集索引______。15.在SQL Server 2000中,数据库对象包括数据表、_视图___、__存储过程_、触发器、规则、默认和用户自定义的数据类型等。
16.数据库的数据模型包含__数据结构__、_数据操作_和__完整性约束_三个要素。
17.___ 域完整性___是指保证指定列的数据具有正确的数据类型、格式和有效的数据范围。
18.___ 触发器____是特殊类型的存储过程,它能在任何试图改变表中由触发器保护的数据时执行。
19.事务(Transaction)可以看成是由对数据库的若干操作组成的一个单元,这些操作要么__都完成__,要么__都取消___(如果在操作执行过程中不能完成其中任一操作)。
20.SQL Server 2000 采用的身份验证模式有_ Windows身份验证__模式和_混合_模式。
21.用户访问SQL Server数据库时,经过了两个_身份__验证和__权限__验证安全验证阶段。
22.SQL Server 2000提供的数据库备份方法有____完整___数据库备份和_差异__数据库备份、___事务日志____备份和_____文件和文件组_______备份。23.SQL Server代理主要由__作业____、___操作员___和警报来组成。24.SQL Server复制把服务器分为__发布____服务器、____分发__服务器和订阅服务器三种。
25.SQL语言主要由____数据定义语言(DDL)______、___数据操作语言(DML)____和数据控制语言(DCL)组成。
26.语句 SELECT(7+3)*4-17/(4-(8-6))+99%4 的执行结果是____35______ 27.____ 视图____是由一个或多个数据表(基本表)或视图导出的虚拟表。28._实体完整性_用于保证数据库中数据表的每一个特定实体的记录都是惟一的。
29.索引的类型有_____聚集索引_______和非聚集索引。
30.___ 存储过程______是已经存储在SQL Server服务器中的一组预编译过的Transact-SQL语句。
31.触发器定义在一个表中,当在表中执行___ insert _____、____ update ____或delete操作时被触发自动执行。
32.事务的ACID属性是指___原子__性、__一致__性、__独立__性和___持久__性。
33.数据库管理系统的安全性通常包括两个方面,一是指数据__访问_____的安全性,二是指数据___运行____的安全性。
34.SQL Server代理主要由___作业_____、操作员和____警报____来组成。35.SQL Server复制有快照复制、____事务__复制和___合并_____复制3种类型。36.从最终用户角度来看,数据库应用系统分为单用户结构、主从式结构、分布式结构、____客户服务器___结构和_____浏览器服务器____结构。
37.用SELECT进行模糊查询时,可以使用like或not like匹配符,但要在条件值中使用_ %_或__等通配符来配合查询。并且,模糊查询只能针__字符_类型字段查询。%、_、字符”,3 38.SQL Server中数据操作语句包括___ insert _____、__ update ______、___ delete _____和select语句。
39.游标的操作步骤包括声明、__打开___、处理(提取、删除或修改)、__关闭____和___释放___游标。
40.SQL Server 2000以____#___开头的标识符,表示临时表或过程; 41.left join 运算是____左连接______。
42.SELECT DATEADD(day, 10, '2005-12-22')结果是____2006-01-01____。43.ROUND()函数的是______四舍五入___函数。
44.SQL Server复制把服务器分为___发布___服务器、___分发___服务器和___订阅___服务器三种。
45.MS SQL Server提供多个图形化工具,其中用来启动、停止和暂停SQL Serve的图形化工具称为_____服务管理器_____。
46.____ 存储过程_____是已经存储在SQL Server服务器中的一组预编译过的Transact-SQL语句。
47.HAVING子句与WHERE子句很相似,其区别在于:
WHERE子句作用的对象是__表和视图__,HAVING子句作用的对象是__分组____。48.实体—联系模型的三要素是_____实体_____、___属性____和实体之间的联系。
49.SQL Server的数据类型可分为_系统___数据类型和__用户自定义__数据类型。
50.SQL Server聚合函数有最大、最小、求和、平均和计数等,它们分别是max、_______、_______、avg和count。min、sum",2 51.IBM公司的研究人员E.F.Codd连续发表了论文,提出了关系模型,奠定了__关系数据库_____管理系统的基础。
52.SQL Server的数据库文件的扩展名为_ mdf_、事务日志文件的扩展名为_ ldf_。
53.建立和使用____约束____的目的是为了保证数据的完整性。
54.BACKUP命令是对数据库进行_ ___备份______, RESTORE命令是对数据库进行______恢复____。
55.SQL Server 2000的安全性分为两类_数据访问_安全性和__数据运行_安全性。
56.关系模型用___二维表_____结构表示实体集,用键来表示实体间联系。3.数据库是被长期存放在计算机内的、有组织的、统一管理的相关___数据___的集合。57.SQL Server数据库的体系结构也是三级模式结构,在SQL Server中,___外模式___对应于视图、__模式____对应于基本表、__内模式____对应于存储文件。58.___ 关系完整性_____是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。
59.视图是由一个或多个___数据表___或视图导出的___虚拟表___或查询表。60.__ 角色___是指服务器管理、数据库管理和数据库访问特定的权限的集合。61.当___表___被删除时与它关联的触发器也一同被删除。
第四篇:SQL Server数据库试题七及答案
SQL Server数据库试题七及答案
一.单项选择题(每题2分,计30分)
1._______是数据库系统的核心,它负责数据库的配置、存取、管理和维护等工作。(c)A、操作系统 B、关系模型 C、数据库管理系统 D、数据库
2.SQL Server2000是一款基于_________体系的关系型数据库管理系统。(A)A、客户机/服务器 B、主机 C、N层 D、单机
3.下面哪一个不是SQL Server2000的基本数据类型(A)A、VARIANT B、VARCHAR C、VARBINARY D、NVARCHAR 4.下面的类型中宽度最大的是(C)A、CHAR(5)B、VARCHAR(5)C、NCHAR(5)D、BIGINT 5.表达式LEN('电子学院')+ DATALENGTH(GETDATE())的值为(C)A、8 B、10 C、12 D、16 6.在SQL Server2000中,数据存储的基本单位是页,页的大小是(D)A、1K B、2K C、4K D、8K 7.在使用CREATE DATABASE命令创建数据库时,FILENAME选项定义的是(D)A、文件增长量 B、文件大小 C、逻辑文件名 D、物理文件名 8.关于表结构的定义,下面说法中错误的是(C)A、表名在同一个数据库内应是唯一的 B、创建表使用CREATE TABLE命令 C、删除表使用DELETE TABLE命令 D、修改表使用ALTER TABLE命令 9.下面哪一个约束用来禁止输入重复值?(A)A、UNIQUE B、NULL C、DEFAULT D、FOREIGN KEY 10.下面关于登录账户、用户和角色的说法错误的是(C)A、登录账户是服务器级的 B、用户是登录账户在某个数据库中的映射 C、用户不一定要和登录账户相关联 D、角色其实就是用户组 11.在SELECT语句中,用于去除重复行的关键字是(B)A、TOP B、DISTINCT C、PERCENT D、HAVING 12.若想查询出所有姓张的、且出生日期为空的学生信息,则WHERE条件应为(C)A、姓名 LIKE ‘张%’ AND 出生日期 = NULL B、姓名 LIKE ‘张*’ AND 出生日期 = NULL C、姓名 LIKE ‘张%’ AND 出生日期 IS NULL D、姓名 LIKE ‘张_’ AND 出生日期 IS NULL 13.下面关于视图的说法中,错误的是(C)A、视图是个虚拟表 B、可以使用视图更新数据,但每次更新只能影响一个表 C、不能为视图定义触发器 D、可以创建基于视图的视图 14.下面关于触发器的描述,错误的是(A)A、触发器是一种特殊的存储过程,用户可以直接调用 B、触发器表和DELETED表没有共同记录
C、触发器可以用来定义比CHECK约束更复杂的规则
D、删除触发器可以使用DROP TRIGGER命令,也可以使用企业管理器 15.下面关于事务的描述,错误的是(D)A、事务可用于保持数据的一致性 B、事务应该昼小且应尽快提交
C、应避免人工输入操作出在在事务中 D、在事务中可以使用ALTER DATEABSE
二.填空题(每空1分,计20分)
1.SQL Server是作为Windows NT或2000的一个__服务________运行的,用户可以启动、暂停或停止它。
2.SQL Server服务包括有__ SQL Server服务________、___ SQL Server Agent服务_______、Microsoft Search和MS DTC服务。
3.SQL Server有两类数据库,__系统数据库________和用户数据库。其中为新的用户数据库提供模板的系统数据库是____ model ______。
4.所有的数据库都有一个____主数据文件______和一个或多个事务日志文件,此外,还可能有_____次要数据文件_____。
5.向表中添加数据应使用___ INSERT(或填INSERT INTO)_______命令,更新数据应使用___ UPDATE _______命令。
6.在SQL Server2000中,约束有非空约束、缺省约束、_主键约束_________、____外键约束______、检查约束和唯一约束等6种类型。
7.对象权限是指用户基于数据库对象层次上的访问和操作权限,共有5种:SELECT、INSERT、DELETE、___ UPDATE_______和____ EXECUTE ______。(或填更新、执行)
8._____ UNION _____可以把两个或多个SELECT语句的查询结果组合成一个结果集,使用时要求所有SELECT语句的列数应_______相同___,对应列的数据类型相容。
9.索引表的顺序与数据行的物理顺序相同的索引称为___聚集(或聚簇 或簇)_______索引。
10.使用游标的一般步骤应为:__创建游标
________、_____打开游标_____、从游标的结果集中读取数据、对游标中的数据逐行操作、关闭游标和释放游标。
11.___事务_______是指一个操作序列,这些操作序列要么都被执行,要么都不被执行。
12.___差异备份_______只记录自上次完整数据库备份后发生更改的数据。
三.判断题(每题1分,计10分)
1.外键是指一个表中含有与另外一个表的主键相同的列或列组,外键不要求惟一。(√)2.SQL Server2000支持Unicode字符集,相应数据类型为text、char和varchar。(×)
3.企业管理器是SQL Server提供的最主要的数据库管理工具,它以树形结构的形式来管理数据库服务器、数据库和数据库中的对象。(√)
4.全局变量与局部变量一样,用户必须进行声明后才能使用。(×)5.在SQL Server2000中,由于不能跨页存储数据行,所以页中每一行最多包含的数据量是8060B。(√)
6.数据完整性就是指数据的正确性、完备性和一致性。(√)
7.若使用REVOKE命令撤消某用户创建表的权限,则该用户将肯定无权创建表。(×)
8.WITH CHECK OPTION表示使用视图更新数据时应满足视图定义中设置的条件(√)9.表的每个触发动作只能有一个INSTEAD OF触发器。(√)
10.在使用差异数据库备份还原数据库时,应先还原最新的完整数据库备份。(√)
四.查询设计(每题5分,计25分)某个学籍数据库有如下表结构:
学生(学号,姓名,性别,出生日期,班级)课程(课程号,课程名称,课程类别,课时)选课(学号,课程号,成绩)请完成下列查询要求。
1.查询出“软件041”班的所有男生的学号和姓名。
SELECT 学号, 姓名 FROM学生
WHERE班级 = ‘软件041’ AND性别 = ‘男’ 2.查询出所有姓张的同学的姓名和班级。SELECT * FROM课程
WHERE课程名称 LIKE ‘%语言%’
3.查询出“C语言”课程成绩前5名的学生的学号、姓名和班级。SELECT TOP 5学生.学号, 姓名, 班级
FROM学生 JOIN 选课 ON 学生.学号 = 选课.学号 JOIN 课程 ON课程.课程号 = 选课.课程号
WHERE课程名称 = ‘C语言’ ORDER BY 成绩 DESC
4.查询出各班级学生人数。SELECT 班级, COUNT(*)AS 人数 FROM 学生 GROUP BY班级
5.查询出“计算机应用基础”课程成绩高于张三同学此门课程成绩的学生的学号和姓名。
SELECT学生.学号, 姓名
FROM 学生JOIN 选课 ON 学生.学号 = 选课.学号 JOIN 课程 ON课程.课程号 = 选课.课程号
WHERE课程名称 = ‘计算机应用基础’ AND 成绩 >(SELECT成绩
FROM 学生JOIN 选课 ON 学生.学号 = 选课.学号 JOIN 课程 ON课程.课程号 = 选课.课程号
WHERE课程名称 = ‘计算机应用基础’ AND姓名 = ‘张三’)
五.综合题(每空3分,计15分)
根据下面某教学管理数据库的表结构,完成下面的程序填空题。教师(职工号,姓名,学历,职称)课程(课程号,课程名称,课程类别)任课(职工号,课程号,周课时)
1.补填下面的存储过程的定义,使其被调用时,能根据调用程序提供的教师姓名使用输出参数返回该教师任课的课程数。CREATE PROCEDURE 按教师姓名查询任课课程数 @姓名 VARCHAR(10), @课程数 INT __ OUTPUT ___________________ AS SELECT __@课程数 = COUNT(*)___________________ FROM 教师 JOIN 任课 ON 教师.职工号 = 任课.职工号 WHERE ____姓名 = @姓名_________________
2.完成下面的触发器的定义,当向任课表中插入记录时,触发器能判断若插入的记录使该教师的任课周课时总计超过20,则回滚插入操作。CREATE TRIGGER 添加教学任务 ON 任课
AFTER INSERT AS DECLARE @总课时 INT SELECT @总课时 = SUM(任课.周课时)FROM 任课 JOIN _ INSERTED ON任课.职工号 = INSERTED.职工号 ____________________ IF @总课时 > 20 _____ ROLLBACK TRANSACTION ________________
参考答案
一.单项选择题(每题2分,计30分)1.C 2.A 3.A 4.C 5.C 6.D 7.D 8.C 9.A 10.C 11.B 12.C 13.C 14.A 15.D 二.填空题(每空1分,计20分)1.服务
2.SQL Server服务 SQL Server Agent服务(或填主服务、代理服务)3.系统数据库 model 4.主数据文件 次要数据文件
5.INSERT(或填INSERT INTO)UPDATE 6.主键约束 外键约束
7.UPDATE EXECUTE(或填更新、执行)8.UNION 相同
9.聚集(或聚簇 或簇)10.创建游标 打开游标 11.事务
12.差异备份
三.判断题(每题1分,计10分)1.√ 2.× 3.√ 4.× 5.√ 6.√ 7.× 8.√ 9.√ 10.√
四.查询设计(每题5分,计25分)
1.查询出“软件041”班的所有男生的学号和姓名。SELECT 学号, 姓名 FROM学生
WHERE班级 = ‘软件041’ AND性别 = ‘男’ 2.查询出所有姓张的同学的姓名和班级。SELECT * FROM课程
WHERE课程名称 LIKE ‘%语言%’
3.查询出“C语言”课程成绩前5名的学生的学号、姓名和班级。SELECT TOP 5学生.学号, 姓名, 班级
FROM学生 JOIN 选课 ON 学生.学号 = 选课.学号 JOIN 课程 ON课程.课程号 = 选课.课程号
WHERE课程名称 = ‘C语言’ ORDER BY 成绩 DESC
4.查询出各班级学生人数。SELECT 班级, COUNT(*)AS 人数 FROM 学生 GROUP BY班级
5.查询出“计算机应用基础”课程成绩高于张三同学此门课程成绩的学生的学号和姓名。
SELECT学生.学号, 姓名
FROM 学生JOIN 选课 ON 学生.学号 = 选课.学号 JOIN 课程 ON课程.课程号 = 选课.课程号
WHERE课程名称 = ‘计算机应用基础’ AND 成绩 >(SELECT成绩
FROM 学生JOIN 选课 ON 学生.学号 = 选课.学号 JOIN 课程 ON课程.课程号 = 选课.课程号
WHERE课程名称 = ‘计算机应用基础’ AND姓名 = ‘张三’)五.综合题(每空3分,计15分)
1.OUTPUT @课程数 = COUNT(*)姓名 = @姓名 2.INSERTED ON任课.职工号 = INSERTED.职工号 ROLLBACK TRANSACTION
第五篇:SQL Server数据库试题九及答案
一、选择题(每题2分,共30分)
1、下面不属于数据定义功能的SQL语句是:()
A.CREAT TABLE B.CREAT CURSOR C.UPDATE D.ALTER TABLE
2、SQL数据库中的视图与下列哪项是对应的()。A.关系模式 B.存储模式 C.子模式 D.以上都不是
3、下列选项中不是数据库复制类型的是()。A.快照复制 B.差异复制 C.事务复制 D.合并复制
4、下列说法错误的是:()。
A.一个基本表可以跨一个或多个存储文件 B.一个存储文件可以跨一个或多个基本表
C.每个存储文件与外部存储器上一个物理文件对应 D.每个基本表与外部存储器上一个物理文件对应
5.显示包含警告信息或其他信息的消息框,应该使用的操作是()。A.Echo B.Message C.Warn D.MsgBox
6、在SQL Server 2000中,索引的顺序和数据表的物理顺序相同的索引是()。A.聚集索引 B.非聚集索引 C.主键索引 D.唯一索引 7.SQL Server的字符型系统数据类型主要包括()。A.Int、money、char B.char、varchar、text C.datetime、binary、int D.char、varchar、int
8、以下选项中哪一项不是访问数据库系统的接口()。A.ODBC B.OLE DB C.API D.ADO
9、在SELECT语句的WHERE子句的条件表达式中,可以匹配0个到多个字符的通配符是()
A.* B.% C.-D.?
10、SELECT语句中与HAVING子句同时使用的是()子句。A.ORDER BY B.WHERE C.GROUP BY D.无需配合 11~15题使用如下数据: 当前盘当前目录下有数据库db_stock,其中有表stock的内容是: 股票代码 股票名称 单价 交易所 600600 青岛啤酒 7.48 上海 600601 方正科技 15.20 上海 600602 广电电子 10.40 上海 600603 兴业房产 12.76 上海 600604 二纺机 9.96 上海 600605 轻工机械 14.59 上海 000001 深发展 7.48 深圳 000002 深万科 12.50 深圳
11、有如下SQL语句
create view stock_view as select * from stock where 交易所=”深圳” 执行该语句后产生的视图包含的记录个数是()A.1 B.2 C.3 D.4
12、有如下SQL语句
create view view_stock as select 股票名称 as 名称,单价 from stock 执行该语句后产生的视图含有的字段名是()
A.股票、名称、单价 B.名称、单价
C 名称、单价、交易所 D 股票名称、单价、交易所
13、执行如下SQL语句后
select distinct 单价 from stock where 单价=(select min(单价)from stock)into dbf stock_x 表stock_x中的记录个数是()A.1 B.2 C.3 D.4
14、求每个交易所的平均单价的SQL语句是()
A.SELECT(交易所,avg(单价)FROM stock GROUP BY 单价 B.SELECT(交易所,avg(单价)FROM stock ORDER BY 单价 C.SELECT(交易所,avg(单价)FROM stock ORDER BY 交易所 D.SELECT(交易所,avg(单价)FROM stock GROUP BY交易所
15、在当前盘当前目录下删除表stock的命令是()A.DROP stock B.DELETE TABLE stock C.DROP TABLE stock C.DELETE stock
二、填空题(每空2分,共30分)
1、SQL Server 2000支持5种类型的存储过程:系统存储过程、、临时存储过程、和扩展存储过程。
2、在Microsoft SQL Server系统中,数据库备份的类型包括:数据库备份、、和。
3、触发器有3种类型,即INSERT类型、和。
4、Transact-SQL语言有4部分元素组成,分别是:、数据定义语言、和一些附加的语言元素。
5、事务的4个属性:原子性、一致性、和。
6、ADO的对象模型为层次结构,主要的ADO对象有3个:、、和。
7、函数datediff(year,’1998-10-12’, ’2005-1-17’)的执行结果是 ;函数str(1234.56,3,1)的执行结果是。
三、简答题(共3题,20分)
1、为什么要创建索引(4分)
2、简述INSERT触发器的工作原理(6分)
3、根据所给的商品库和教学库,按照下列所给的每条SQL查询语句写出相应的功能,或者按照下列所给的每种功能写出相应的SQL查询语句。(每小题2分,共10分)
在名称为商品库的数据库中包含有商品表1和商品表2,它们的定义分别为: 商品表1(商品代号 char(8),分类名 char(8),单价 float,数量 int)商品表2(商品代号 char(8),产地 char(6),品牌 char(6),)在名称为教学库的数据库中包含有学生、课程和选课三个表,它们的定义分别为: 学生(学生号 char(7),姓名 char(6),性别 char(2),出生日期 datetime, 专业 char(10),年级 int)课程(课程号 char(4),课程名 char(10),课程学分 int 选课(学生号 char(7),课程号 char(4),成绩 int)1.select distinct 产地 from 商品表2
2.select * from 学生
where 学生号 in(select 学生号 from 选课
group by 学生号 having count(*)=1)
3.select * from 学生
where 学生号 in(select 学生号 from 选课
group by 学生号 having count(*)<=2)or not exists(select * from 选课
where 学生.学生号=选课.学生号)
4.从商品库中查询出每类(即分类名相同)商品的最高单价。
5.从教学库中查询出至少选修了姓名为@m1学生所选课程中一门课的全部学生。
四、设计题(每题4分,共20分)有一个“学生-课程”数据库,数据库中包括三个表:(1)“学生”表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成,可记为: Student(Sno,Sname,Ssex,Sage,Sdept)Sno 为关键字。(2)“课程”表Course由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)四个属性组成,可记为: Course(Cno,Cname,Cpno,Ccredit)Cno为关键字。(3)“学生选课”表SC由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,可记为: SC(Sno,Cno,Grade)(SNO, CNO)为关键字。完成下列操作:
1、建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成,其中学号属性不能为空,并且其值是唯一的。
2、查考试成绩有不及格的学生的学号
3、将学生95001的年龄改为22岁
4、计算1号课程的学生平均成绩
5、创建一存储过程getDetailByName,通过输入参数学生姓名(如“章山“),筛选出该学生的基本信息,对不存在此学生姓名的输入值,必须作一检测,打印信息“不存在此学生”。参考答案
一、选择题(每题2分,共30分)
1、A
2、C
3、B
4、D
5、D
6、C
7、B
8、C
9、A
10、C
11、B
12、B
13、B
14、D
15、C
二、填空题(每空2分,共30分)
1、本地存储过程、远程存储过程
2、事务日志备份、差异备份、文件和文件组备份
3、UPDATE类型、DELETE类型
4、数据控制语言(或DCL)、数据操作语言(或DML)
5、隔离性、持久性
6、Connection Command和Recordset7、7 ***
三、简答题(每题5分,共20分)
1、什么要创建索引?(4分)
答:创建索引可以大大提高系统的性能。第一,通过创建唯一性索引,可以保证每一行数据的唯一性。第二,可以大大加快数据的检索速度,这也是所以的最主要原因。第三,可以加速表与表之间的连接,特别是实现数据的参考完整性方面特有意义。第四,在使用ORDER BY和GROUP BY子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。第五,通过使用索引,可以在查询过程中,使用优化隐藏器,提高系统性能。
2、简述INSERT触发器的工作原理(6分)
答:当向表中插入数据时,INSERT触发器触发执行。当INSERT触发器触发时,新的记录增加到触发器表中和inserted表中。该inserted表是逻辑表,保存了所插入记录的拷贝,允许用户参考INSERT语句中的数据。触发器可以检查inserted表,来确定该触发器的操作是否应该执行和如何执行。在inserted表中的哪些记录,总是触发表中一行或多行记录的冗余。
3、根据商品库和教学库,按照下列所给的每条SQL查询语句写出相应的功能,或者按照下列所给的每种功能写出相应的SQL查询语句。(每小题2分,共10分)
1.从商品库中查询出所有商品的不同产地。
2.从教学库中查询出只选修了一门课程的全部学生。
3.从教学库中查询出最多选修了2门课程(含未选任何课程)的全部学生。4.select 分类名,max(单价)as 最高单价 from 商品表1 group by 分类名
5.select distinct 学生.* from 学生,选课
where 学生.学生号=选课.学生号 and 课程号=any(select 课程号 from 学生,选课
where 学生.学生号=选课.学生号 and 姓名=@m1)
四、设计题(每题4分,共20分)
1、建立一个“学生”表Student,它由学号Sno、姓名Sname、性别Ssex、年龄Sage、所在系Sdept五个属性组成,其中学号属性不能为空,并且其值是唯一的。CREATETABLE Student(Sno CHAR(5)NOT NULL UNIQUE, Sname CHAR(20), Ssex CHAR(1), Sage INT, Sdept CHAR(15));
2、查考试成绩有不及格的学生的学号 SELECT DISTINCT Sno FROM Course WHERE Grade <60;
3、将学生95001的年龄改为22岁 UPDATE Student SET Sage=22 WHERE Sno='95001';
4、计算1号课程的学生平均成绩 SELECT AVG(Grade)FROM SC WHERE Cno='1';
5、创建一存储过程getDetailByName,通过输入参数学生姓名(如“章山”),筛选出该学生的基本信息,对不存在此学生姓名的输入值,必须作一检测,打印信息“不存在此学生”。
Create procedure getDetailByName @name nvarchar(10)AS IF(SELECT COUNT(*)FROM Student WHERE Sname = @Name)> 0 SELECT * FROM Student Where Sname = @Name ELSE SELECT 警示 = '不存在姓名为 ' + @Name + ' 的学生资料'