第一篇:sql試題大全
INNER JOIN操作
INNER JOIN操作用于組合兩個表中的記錄,只要在公共字段之中有相符的值??梢栽谌魏蔚?FROM 子句中使用 INNER JOIN 運算。這是最普通的聯(lián)接類型。只要在這兩個表的公共字段之中有相符值,內(nèi)部聯(lián)接將組合兩個表中的記錄。語法:FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2 說明:table1, table2參數(shù)用于指定從其中組合記錄的表的名稱。
field1, field2參數(shù)指定被聯(lián)接字段的名稱。如果這些字段不是數(shù)值的,被聯(lián)接的字段必須是相同的數(shù)據(jù)類型,并且包含相同類型的數(shù)據(jù),但是它們不必名稱相同。
compopr參數(shù)用于指定關(guān)系比較運算符,如:“=”,“<”,“>”,“<=”,“>=”,或 “<>”。
如果在INNER JOIN操作中要聯(lián)接包含Memo 數(shù)據(jù)類型或 OLE Object 數(shù)據(jù)類型數(shù)據(jù)的字段,將會發(fā)生錯誤。在一個 INNER JOIN 之中,可以嵌套 LEFT JOIN 或 RIGHT JOIN,但是在 LEFT JOIN 或 RIGHT JOIN 中不能嵌套 INNER JOIN。
LEFT JOIN操作
LEFT JOIN操作用于在任何的 FROM 子句中,組合來源表的記錄。使用 LEFT JOIN 運算來創(chuàng)建一個左邊外部聯(lián)接。左邊外部聯(lián)接將包含了從第一個(左邊)開始的兩個表中的全部記錄,即使在第二個(右邊)表中并沒有相符值的記錄。語法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2 說明:table1, table2參數(shù)用于指定要將記錄組合的表的名稱。
field1, field2參數(shù)指定被聯(lián)接的字段的名稱。且這些字段必須有相同的數(shù)據(jù)類型及包含相同類型的數(shù)據(jù),但它們不需要有相同的名稱。
compopr參數(shù)指定關(guān)系比較運算符:“=”,“<”,“>”,“<=”,“>=” 或 “<>”。如果在INNER JOIN操作中要聯(lián)接包含Memo 數(shù)據(jù)類型或 OLE Object 數(shù)據(jù)類型數(shù)據(jù)的字段,將會發(fā)生錯誤。
RIGHT JOIN操作
RIGHT JOIN操作用于在任何的 FROM 子句中,組合來源表的記錄。使用 RIGHT JOIN 運算創(chuàng)建一個右邊外部聯(lián)接。右邊外部聯(lián)接將包含了從第二個(右邊)開始的兩個表中的全部記錄,即使在第一個(左邊)表中并沒有匹配值的記錄。語法:FROM table1 RIGHT JOIN table2 ON table1.field1 compopr table2.field2 說明:table1, table2參數(shù)用于指定要將記錄組合的表的名稱。
field1, field2參數(shù)指定被聯(lián)接的字段的名稱。且這些字段必須有相同的數(shù)據(jù)類型及包含相同類型的數(shù)據(jù),但它們不需要有相同的名稱。
compopr參數(shù)指定關(guān)系比較運算符:“=”,“<”,“>”,“<=”,“>=” 或 “<>”。如果在INNER JOIN操作中要聯(lián)接包含Memo 數(shù)據(jù)類型或 OLE Object 數(shù)據(jù)類型數(shù)據(jù)的字段,將會發(fā)生錯誤。
你可以把存儲過程當做:把一系列語句合并到一起的這么一個整體
我覺得舉例說明比較好,給你個例子:
先將【表1】中ID號為50—2000的記錄刪除、再將【表2】中的這些記錄的狀態(tài)(STATUS)改為“已解除”:
delete 表1 where ID > 50 and ID < 2000
update 表2 set STATUS = '已解除' where ID > 50 and ID < 2000
正常情況下,以上兩條語句分步執(zhí)行就可以了,如果要用存儲過程呢?
先建立存儲過程(以下的語法為Sybase數(shù)據(jù)庫的,其他數(shù)據(jù)庫類同):
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
好了,執(zhí)行這個語句,就將存儲過程PRC_TEST提交到數(shù)據(jù)庫里了,它有兩個參數(shù):start_ID int 和 end_ID,代表起始和終止ID號,類型為整數(shù)型int
怎么用這個存儲過程呢? 這樣執(zhí)行:exc PRC_TEST 50, 2000
執(zhí)行時,它先得到了兩個參數(shù),50、2000,分別賦值給start_ID int 和 end_ID,然后按照這兩個參數(shù)分步執(zhí)行封裝在存儲過程里的那兩條語句了。
如果你這樣執(zhí)行:exc PRC_TEST 220, 8660
就是處理兩個表中ID介于220—8660之間的記錄了。
--------------
你也許會問了,既然可以分步執(zhí)行的幾句SQL,為什么要費力的寫成存儲過程???
主要是(我的經(jīng)驗和認識):
1、使數(shù)據(jù)處理參數(shù)化,對經(jīng)常使用的一系列SQL進行封裝,使其成為一個存儲過程的整體,在每次執(zhí)行時只要更換執(zhí)行參數(shù)即可,不用去改里面每句SQL的where子句
2、★★這個很重要★★,假設(shè)你要循環(huán)處理某些數(shù)據(jù),例如需要使用“游標”、“Do...while...語句”…………時,就要用到存儲過程(或觸發(fā)器)
=======================
最后給你轉(zhuǎn)一個短文吧,這是書面上的概念:
將常用的或很復(fù)雜的工作,預(yù)先用SQL語句寫好并用一個指定的名稱存儲起來, 那么以后要叫數(shù)據(jù)庫提供與已定義好的存儲過程的功能相同的服務(wù)時,只需調(diào)用execute,即可自動完成命令。
那么存儲過程與一般的SQL語句有什么區(qū)別呢? 存儲過程的優(yōu)點:
1.存儲過程只在創(chuàng)造時進行編譯,以后每次執(zhí)行存儲過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。
2.當對數(shù)據(jù)庫進行復(fù)雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復(fù)雜操作用存儲過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用。
3.存儲過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量
4.安全性高,可設(shè)定只有某此用戶才具有對指定存儲過程的使用權(quán)
存儲過程的種類:
1.系統(tǒng)存儲過程:以prc_(或sp_)開頭,用來進行系統(tǒng)的各項設(shè)定.取得信息.相關(guān)管理工作, 如 sp_help就是取得指定對象的相關(guān)信息
2.擴展存儲過程 以XP_開頭,用來調(diào)用操作系統(tǒng)提供的功能
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的數(shù)據(jù)
方法1:使用union all,但是有256條數(shù)據(jù)的限制 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)
*以上兩種方法適合在數(shù)據(jù)量非常小的情況下使用
方法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--構(gòu)造臨時表的結(jié)構(gòu) OPEN c_test FETCH NEXT FROM c_test INTO @id WHILE @@FETCH_STATUS = 0 BEGIN--按t1中的id順序插數(shù)據(jù)到臨時表
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:分割字符串參數(shù)
select * into #tmp from table1 where 1=2--構(gòu)造臨時表的結(jié)構(gòu) 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 *該方法比較有通用性
測試結(jié)果
id name---------------2 r 1 q 4 5 3 3
本文較長,包含了如下幾部分
1.2.3.4.5.使用不帶參數(shù)的存儲過程 使用帶有輸入?yún)?shù)的存儲過程
使用帶有輸出參數(shù)的存儲過程
使用帶有返回狀態(tài)的存儲過程
使用帶有更新計數(shù)的存儲過程
1使用不帶參數(shù)的存儲過程
使用 JDBC 驅(qū)動程序調(diào)用不帶參數(shù)的存儲過程時,必須使用 call SQL 轉(zhuǎn)義序列。不帶參數(shù)的 call 轉(zhuǎn)義序列的語法如下所示: {call procedure-name} 作為實例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫中創(chuàng)建以下存儲過程:
CREATE PROCEDURE GetContactFormalNames AS BEGIN
SELECT TOP 10 Title + ' ' + FirstName + ' ' + LastName AS FormalName FROM Person.Contact END
此存儲過程返回單個結(jié)果集,其中包含一列數(shù)據(jù)(由 Person.Contact 表中前十個聯(lián)系人的稱呼、名稱和姓氏組成)。
在下面的實例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫的打開連接,然后使用 executeQuery 方法調(diào)用 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使用帶有輸入?yún)?shù)的存儲過程
使用 JDBC 驅(qū)動程序調(diào)用帶參數(shù)的存儲過程時,必須結(jié)合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。帶有 IN 參數(shù)的 call 轉(zhuǎn)義序列的語法如下所示:
{call procedure-name[([parameter][,[parameter]]...)]}
構(gòu)造 call 轉(zhuǎn)義序列時,請使用 ?(問號)字符來指定 IN 參數(shù)。此字符充當要傳遞給該存儲過程的參數(shù)值的占位符??梢允褂?SQLServerPreparedStatement 類的 setter 方法之一為參數(shù)指定值??墒褂玫?setter 方法由 IN 參數(shù)的數(shù)據(jù)類型決定。向 setter 方法傳遞值時,不僅需要指定要在參數(shù)中使用的實際值,還必須指定參數(shù)在存儲過程中的序數(shù)位置。例如,如果存儲過程包含單個 IN 參數(shù),則其序數(shù)值為 1。如果存儲過程包含兩個參數(shù),則第一個序數(shù)值為 1,第二個序數(shù)值為 2。作為如何調(diào)用包含 IN 參數(shù)的存儲過程的實例,使用 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫中的 uspGetEmployeeManagers 存儲過程。此存儲過程接受名為 EmployeeID 的單個輸入?yún)?shù)(它是一個整數(shù)值),然后基于指定的 EmployeeID 返回雇員及其經(jīng)理的遞歸列表。下面是調(diào)用此存儲過程的 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使用帶有輸出參數(shù)的存儲過程
使用 JDBC 驅(qū)動程序調(diào)用此類存儲過程時,必須結(jié)合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。帶有 OUT 參數(shù)的 call 轉(zhuǎn)義序列的語法如下所示:
{call procedure-name[([parameter][,[parameter]]...)]}
構(gòu)造 call 轉(zhuǎn)義序列時,請使用 ?(問號)字符來指定 OUT 參數(shù)。此字符充當要從該存儲過程返回的參數(shù)值的占位符。要為 OUT 參數(shù)指定值,必須在運行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定各參數(shù)的數(shù)據(jù)類型。
使用 registerOutParameter 方法為 OUT 參數(shù)指定的值必須是 java.sql.Types 所包含的 JDBC 數(shù)據(jù)類型之一,而它又被映射成本地 SQL Server 數(shù)據(jù)類型之一。有關(guān) JDBC 和 SQL Server 數(shù)據(jù)類型的詳細信息,請參閱了解 JDBC 驅(qū)動程序數(shù)據(jù)類型。
當您對于 OUT 參數(shù)向 registerOutParameter 方法傳遞一個值時,不僅必須指定要用于此參數(shù)的數(shù)據(jù)類型,而且必須在存儲過程中指定此參數(shù)的序號位置或此參數(shù)的名稱。例如,如果存儲過程包含單個 OUT 參數(shù),則其序數(shù)值為 1;如果存儲過程包含兩個參數(shù),則第一個序數(shù)值為 1,第二個序數(shù)值為 2。
作為實例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫中創(chuàng)建以下存儲過程: 根據(jù)指定的整數(shù) IN 參數(shù)(employeeID),該存儲過程也返回單個整數(shù) OUT 參數(shù)(managerID)。根據(jù) HumanResources.Employee 表中包含的 EmployeeID,OUT 參數(shù)中返回的值為 ManagerID。
在下面的實例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫的打開連接,然后使用 execute 方法調(diào)用 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();} } 本示例使用序號位置來標識參數(shù)。或者,也可以使用參數(shù)的名稱(而非其序號位置)來標識此參數(shù)。下面的代碼示例修改了上一個示例,以說明如何在 Java 應(yīng)用程序中使用命名參數(shù)。請注意,這些參數(shù)名稱對應(yīng)于存儲過程的定義中的參數(shù)名稱:
CREATE PROCEDURE GetImmediateManager @employeeID INT, @managerID INT OUTPUT AS BEGIN
SELECT @managerID = ManagerID FROM HumanResources.Employee WHERE EmployeeID = @employeeID END
存儲過程可能返回更新計數(shù)和多個結(jié)果集。Microsoft SQL Server 2005 JDBC Driver 遵循 JDBC 3.0 規(guī)范,此規(guī)范規(guī)定在檢索 OUT 參數(shù)之前應(yīng)檢索多個結(jié)果集和更新計數(shù)。也就是說,應(yīng)用程序應(yīng)先檢索所有 ResultSet 對象和更新計數(shù),然后使用 CallableStatement.getter 方法檢索 OUT 參數(shù)。否則,當檢索 OUT 參數(shù)時,尚未檢索的 ResultSet 對象和更新計數(shù)將丟失。使用帶有返回狀態(tài)的存儲過程
使用 JDBC 驅(qū)動程序調(diào)用這種存儲過程時,必須結(jié)合 SQLServerConnection 類的 prepareCall 方法使用 call SQL 轉(zhuǎn)義序列。返回狀態(tài)參數(shù)的 call 轉(zhuǎn)義序列的語法如下所示:
{[?=]call procedure-name[([parameter][,[parameter]]...)]}
構(gòu)造 call 轉(zhuǎn)義序列時,請使用 ?(問號)字符來指定返回狀態(tài)參數(shù)。此字符充當要從該存儲過程返回的參數(shù)值的占位符。要為返回狀態(tài)參數(shù)指定值,必須在執(zhí)行存儲過程前使用 SQLServerCallableStatement 類的 registerOutParameter 方法指定參數(shù)的數(shù)據(jù)類型。
此外,向 registerOutParameter 方法傳遞返回狀態(tài)參數(shù)值時,不僅需要指定要使用的參數(shù)的數(shù)據(jù)類型,還必須指定參數(shù)在存儲過程中的序數(shù)位置。對于返回狀態(tài)參數(shù),其序數(shù)位置始終為 1,這是因為它始終是調(diào)用存儲過程時的第一個參數(shù)。盡管 SQLServerCallableStatement 類支持使用參數(shù)的名稱來指示特定參數(shù),但您只能對返回狀態(tài)參數(shù)使用參數(shù)的序號位置編號。
作為實例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫中創(chuàng)建以下存儲過程:
CREATE PROCEDURE CheckContactCity(@cityName CHAR(50))AS BEGIN
IF((SELECT COUNT(*)FROM Person.Address WHERE City = @cityName)> 1)RETURN 1 ELSE
RETURN 0 END
該存儲過程返回狀態(tài)值 1 或 0,這取決于是否能在表 Person.Address 中找到 cityName 參數(shù)指定的城市。
在下面的實例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫的打開連接,然后使用 execute 方法調(diào)用 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 使用帶有更新計數(shù)的存儲過程 使用 SQLServerCallableStatement 類構(gòu)建對存儲過程的調(diào)用之后,可以使用 execute 或 executeUpdate 方法中的任意一個來調(diào)用此存儲過程。executeUpdate 方法將返回一個 int 值,該值包含受此存儲過程影響的行數(shù),但 execute 方法不返回此值。如果使用 execute 方法,并且希望獲得受影響的行數(shù)計數(shù),則可以在運行存儲過程后調(diào)用 getUpdateCount 方法。
作為實例,在 SQL Server 2005 AdventureWorks 示例數(shù)據(jù)庫中創(chuàng)建以下表和存儲過程:
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;在下面的實例中,將向此函數(shù)傳遞 AdventureWorks 示例數(shù)據(jù)庫的打開連接,并使用 execute 方法調(diào)用 UpdateTestTable 存儲過程,然后使用 getUpdateCount 方法返回受存儲過程影響的行計數(shù)。
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存儲過程概述
在大型數(shù)據(jù)庫系統(tǒng)中,存儲過程和觸發(fā)器具有很重要的作用。無論是存儲過程還是觸發(fā)器,都是SQL 語句和流程控制語句的集合。就本質(zhì)而言,觸發(fā)器也是一種存儲過程。存儲過程在運算時生成執(zhí)行方式,所以,以后對其再運行時其執(zhí)行速度很快。SQL Server 2000 不僅提供了用戶自定義存儲過程的功能,而且也提供了許多可作為工具使用的系統(tǒng)存儲過程。
存儲過程的概念
存儲過程(Stored Procedure)是一組為了完成特定功能的SQL 語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫。中用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。
在SQL Server 的系列版本中存儲過程分為兩類:系統(tǒng)提供的存儲過程和用戶自定義存儲過程。系統(tǒng)過程主要存儲在master 數(shù)據(jù)庫中并以sp_為前綴,并且系統(tǒng)存儲過程主要是從系統(tǒng)表中獲取信息,從而為系統(tǒng)管理員管理SQL Server 提供支持。通過系統(tǒng)存儲過程,MS SQL Server 中的許多管理性或信息性的活動(如了解數(shù)據(jù)庫對象、數(shù)據(jù)庫信息)都可以被順利有效地完成。盡管這些系統(tǒng)存儲過程被放在master 數(shù)據(jù)庫中,但是仍可以在其它數(shù)據(jù)庫中對其進行調(diào)用,在調(diào)用時不必在存儲過程名前加上數(shù)據(jù)庫名。而且當創(chuàng)建一個新數(shù)據(jù)庫時,一些系統(tǒng)存儲過程會在新數(shù)據(jù)庫中被自動創(chuàng)建。用戶自定義存儲過程是由用戶創(chuàng)建并能完成某一特定功能(如查詢用戶所需數(shù)據(jù)信息)的存儲過程。在本章中所涉及到的存儲過程主要是指用戶自定義存儲過程。
存儲過程的優(yōu)點
當利用MS SQL Server 創(chuàng)建一個應(yīng)用程序時,Transaction-SQL 是一種主要的編程語言。若運用Transaction-SQL 來進行編程,有兩種方法。其一是,在本地存儲Transaction-SQL 程序,并創(chuàng)建應(yīng)用程序向SQL Server 發(fā)送命令來對結(jié)果進行處理。其二是,可以把部分用Transaction-SQL 編寫的程序作為存儲過程存儲在SQL Server 中,并創(chuàng)建應(yīng)用程序來調(diào)用存儲過程,對數(shù)據(jù)結(jié)果進行處理存儲過程能夠通過接收參數(shù)向調(diào)用者返回結(jié)果集,結(jié)果集的格式由調(diào)用者確定;返回狀態(tài)值給調(diào)用者,指明調(diào)用是成功或是失??;包括針對數(shù)據(jù)庫的操作語句,并且可以在一個存儲過程中調(diào)用另一存儲過程。
我們通常更偏愛于使用第二種方法,即在SQL Server 中使用存儲過程而不是在客戶計算機上調(diào)用Transaction-SQL 編寫的一段程序,原因在于存儲過程具有以下優(yōu)點:
(1)存儲過程允許標準組件式編程
存儲過程在被創(chuàng)建以后可以在程序中被多次調(diào)用,而不必重新編寫該存儲過程的SQL 語句。而且數(shù)據(jù)庫專業(yè)人員可隨時對存儲過程進行修改,但對應(yīng)用程序源代碼毫無影響(因為應(yīng)用程序源代碼只包含存儲過程的調(diào)用語句),從而極大地提高了程序的可移植性。
(2)存儲過程能夠?qū)崿F(xiàn)較快的執(zhí)行速度
如果某一操作包含大量的Transaction-SQL 代碼或分別被多次執(zhí)行,那么存儲過程要比批處理的執(zhí)行速度快很多。因為存儲過程是預(yù)編譯的,在首次運行一個存儲過程時,查詢優(yōu)化器對其進行分析、優(yōu)化,并給出最終被存在系統(tǒng)表中的執(zhí)行計劃。而批處理的Transaction-SQL 語句在每次運行時都要進行編譯和優(yōu)化,因此速度相對要慢一些。
(3)存儲過程能夠減少網(wǎng)絡(luò)流量
對于同一個針對數(shù)據(jù)數(shù)據(jù)庫對象的操作(如查詢、修改),如果這一操作所涉及到的 Transaction-SQL 語句被組織成一存儲過程,那么當在客戶計算機上調(diào)用該存儲過程時,網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,否則將是多條SQL 語句,從而大大增加了網(wǎng)絡(luò)流量,降低網(wǎng)絡(luò)負載。
(4)存儲過程可被作為一種安全機制來充分利用
系統(tǒng)管理員通過對執(zhí)行某一存儲過程的權(quán)限進行限制,從而能夠?qū)崿F(xiàn)對相應(yīng)的數(shù)據(jù)訪問權(quán)限的限制,避免非授權(quán)用戶對數(shù)據(jù)的訪問,保證數(shù)據(jù)的安全。(我們將在14 章“SQLServer 的用戶和安全性管理”中對存儲過程的這一應(yīng)用作更為清晰的介紹)
注意:存儲過程雖然既有參數(shù)又有返回值,但是它與函數(shù)不同。存儲過程的返回值只是指明執(zhí)行是否成功,并且它不能像函數(shù)那樣被直接調(diào)用,也就是在調(diào)用存儲過程時,在存儲過程名字前一定要有EXEC保留字。
2.SQL存儲過程創(chuàng)建
創(chuàng)建存儲過程,存儲過程是保存起來的可以接受和返回用戶提供的參數(shù)的 Transact-SQL 語句的集合。
可以創(chuàng)建一個過程供永久使用,或在一個會話中臨時使用(局部臨時過程),或在所有會話中臨時使用(全局臨時過程)。
也可以創(chuàng)建在 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 ]
參數(shù)
procedure_name
新存儲過程的名稱。過程名必須符合標識符規(guī)則,且對于數(shù)據(jù)庫及其所有者必須唯一。
要創(chuàng)建局部臨時過程,可以在 procedure_name 前面加一個編號符(#procedure_name),要創(chuàng)建全局臨時過程,可以在 procedure_name 前面加兩個編號符
(##procedure_name)。完整的名稱(包括 # 或 ##)不能超過 128 個字符。指定過程所有者的名稱是可選的。
;number
是可選的整數(shù),用來對同名的過程分組,以便用一條 DROP PROCEDURE 語句即可將同組的過程一起除去。例如,名為 orders 的應(yīng)用程序使用的過程可以命名為
orderproc;
1、orderproc;2 等。DROP PROCEDURE orderproc 語句將除去整個組。如果名稱中包含定界標識符,則數(shù)字不應(yīng)包含在標識符中,只應(yīng)在 procedure_name 前后使用適當?shù)亩ń绶?/p>
@parameter
過程中的參數(shù)。在 CREATE PROCEDURE 語句中可以聲明一個或多個參數(shù)。用戶必須在執(zhí)行過程時提供每個所聲明參數(shù)的值(除非定義了該參數(shù)的默認值)。存儲過程最多可以有 2.100 個參數(shù)。
使用 @ 符號作為第一個字符來指定參數(shù)名稱。參數(shù)名稱必須符合標識符的規(guī)則。每個過程的參數(shù)僅用于該過程本身;相同的參數(shù)名稱可以用在其它過程中。默認情況下,參數(shù)只能代替常量,而不能用于代替表名、列名或其它數(shù)據(jù)庫對象的名稱。
data_type
參數(shù)的數(shù)據(jù)類型。所有數(shù)據(jù)類型(包括 text、ntext 和 image)均可以用作存儲過程的參數(shù)。不過,cursor 數(shù)據(jù)類型只能用于 OUTPUT 參數(shù)。如果指定的數(shù)據(jù)類型為 cursor,也必須同時指定 VARYING 和 OUTPUT 關(guān)鍵字。
說明 對于可以是 cursor 數(shù)據(jù)類型的輸出參數(shù),沒有最大數(shù)目的限制。
VARYING
指定作為輸出參數(shù)支持的結(jié)果集(由存儲過程動態(tài)構(gòu)造,內(nèi)容可以變化)。僅適用于游標參數(shù)。
default
參數(shù)的默認值。如果定義了默認值,不必指定該參數(shù)的值即可執(zhí)行過程。默認值必須是常量或 NULL。如果過程將對該參數(shù)使用 LIKE 關(guān)鍵字,那么默認值中可以包含通配符(%、_、[] 和 [^])。
OUTPUT
表明參數(shù)是返回參數(shù)。該選項的值可以返回給 EXEC[UTE]。使用 OUTPUT 參數(shù)可將信息返回給調(diào)用過程。Text、ntext 和 image 參數(shù)可用作 OUTPUT 參數(shù)。使用 OUTPUT 關(guān)鍵字的輸出參數(shù)可以是游標占位符。
n
表示最多可以指定 2.100 個參數(shù)的占位符。
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
RECOMPILE 表明 SQL Server 不會緩存該過程的計劃,該過程將在運行時重新編譯。在使用非典型值或臨時值而不希望覆蓋緩存在內(nèi)存中的執(zhí)行計劃時,請使用 RECOMPILE 選項。
ENCRYPTION 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 語句文本的條目。使用 ENCRYPTION 可防止將過程作為 SQL Server 復(fù)制的一部分發(fā)布。
說明 在升級過程中,SQL Server 利用存儲在 syscomments 中的加密注釋來重新創(chuàng)建加密過程。
FOR REPLICATION
指定不能在訂閱服務(wù)器上執(zhí)行為復(fù)制創(chuàng)建的存儲過程。.使用 FOR REPLICATION 選項創(chuàng)建的存儲過程可用作存儲過程篩選,且只能在復(fù)制過程中執(zhí)行。本選項不能和 WITH RECOMPILE 選項一起使用。
AS
指定過程要執(zhí)行的操作。
sql_statement
過程中要包含的任意數(shù)目和類型的 Transact-SQL 語句。但有一些限制。
n
是表示此過程可以包含多條 Transact-SQL 語句的占位符。
注釋
存儲過程的最大大小為 128 MB。
用戶定義的存儲過程只能在當前數(shù)據(jù)庫中創(chuàng)建(臨時過程除外,臨時過程總是在 tempdb 中創(chuàng)建)。在單個批處理中,CREATE PROCEDURE 語句不能與其它 Transact-SQL 語句組合使用。
默認情況下,參數(shù)可為空。如果傳遞 NULL 參數(shù)值并且該參數(shù)在 CREATE 或 ALTER TABLE 語句中使用,而該語句中引用的列又不允許使用 NULL,則 SQL Server 會產(chǎn)生一條錯誤信息。為了防止向不允許使用 NULL 的列傳遞 NULL 參數(shù)值,應(yīng)向過程中添加編程邏輯或為該列使用默認值(使用 CREATE 或 ALTER TABLE 的 DEFAULT 關(guān)鍵字)。
建議在存儲過程的任何 CREATE TABLE 或 ALTER TABLE 語句中都為每列顯式指定 NULL 或 NOT NULL,例如在創(chuàng)建臨時表時。ANSI_DFLT_ON 和 ANSI_DFLT_OFF 選項控制 SQL Server 為列指派 NULL 或 NOT NULL 特性的方式(如果在 CREATE TABLE 或 ALTER TABLE 語句中沒有指定的話)。如果某個連接執(zhí)行的存儲過程對這些選項的設(shè)置與創(chuàng)建該過程的連接的設(shè)置不同,則為第二個連接創(chuàng)建的表列可能會有不同的為空性,并且表現(xiàn)出不同的行為方式。如果為每個列顯式聲明了 NULL 或 NOT NULL,那么將對所有執(zhí)行該存儲過程的連接使用相同的為空性創(chuàng)建臨時表。
在創(chuàng)建或更改存儲過程時,SQL Server 將保存 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 的設(shè)置。執(zhí)行存儲過程時,將使用這些原始設(shè)置。因此,所有客戶端會話的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 設(shè)置在執(zhí)行存儲過程時都將被忽略。在存儲過程中出現(xiàn)的 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 語句不影響存儲過程的功能。
其它 SET 選項(例如 SET ARITHABORT、SET ANSI_WARNINGS 或 SET ANSI_PADDINGS)在創(chuàng)建或更改存儲過程時不保存。如果存儲過程的邏輯取決于特定的設(shè)置,應(yīng)在過程開頭添加一條 SET 語句,以確保設(shè)置正確。從存儲過程中執(zhí)行 SET 語句時,該設(shè)置只在存儲過程完成之前有效。之后,設(shè)置將恢復(fù)為調(diào)用存儲過程時的值。這使個別的客戶端可以設(shè)置所需的選項,而不會影響存儲過程的邏輯。
第二篇:VF上機試題 SQL語言
VFP關(guān)系數(shù)據(jù)庫標準語言SQL
【機試】
[1] 在練習文件夾中有一個數(shù)據(jù)庫sdb,其中有數(shù)據(jù)庫表student2、sc和course2。3個表結(jié)構(gòu)如下所示:
STUDENT2(學號,姓名,年齡,性別,院系編號)
SC(學號,課程號,成績,備注)
COURSE2(課程號,課程名,選修課號,學分)
用SQL語句查詢“計算機軟件基礎(chǔ)”課程的考試成績在85分以下(含85分)的學生的全部信息并將結(jié)果按學號升序存入noex.dbf文件中(表的結(jié)構(gòu)同student2,并在其后加入成績字段)。答案: SELECT STUDENT2.*,成績 FROM STUDENT2,SC,COURSE2 WHERE
STUDENT2.學號=SC.學號
AND SC.課程號=COURSE2.課程號 AND 課程名=“計算機軟件
基礎(chǔ)” AND 成績<=85 ORDER BY STUDENT2.學號 INTO TABLE
NOEX。
[2] 將order_list1表中的全部記錄追加到order_list表中,然后用SQL SELECT語句完成查詢:按總金額降序列出所有客戶的客戶號、客戶名及其訂單號和總金額,并將結(jié)果存儲到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語句完成查詢:列出目前有訂購單的客戶信息(即有對應(yīng)的order_list記錄的customer表中的記錄),同時要求按客戶號升序排序,并將結(jié)果存儲到results表中(表結(jié)構(gòu)與customer表結(jié)構(gòu)相同)。
答案:SELECT * FROM CUSTOMER1 INTO TABLE CUSTOMER
SELECT * FROM CUSTOMER WHERE 客戶號 IN(SELECT 客戶號
FROM ORDER_LIST)ORDER BY 客戶號 INTO TABLE RESULTS
[4]列出總金額大于所有訂購單總金額平均值的訂購單(order_list)清單(按客戶號升序排列),并將結(jié)果存儲到results表中(表結(jié)構(gòu)與order_list表結(jié)構(gòu)相同)。
答案:SELECT * FROM ORDER_LIST WHERE 總金額>(SELECT AVG(總金額)FROM ORDER_LIST)ORDER BY 客戶號 INTO TABLE RESULTS.
第三篇:SQL數(shù)據(jù)庫期末復(fù)習試題 - 填空
三、填空題(每空1分,共20分)1.數(shù)據(jù)庫系統(tǒng)具有數(shù)據(jù)的___外模式____、__模式_____和內(nèi)模式三級模式結(jié)構(gòu)。2.SQL Server 2000局部變量名字必須以____@、_____開頭,而全局變量名字必須以______@@___開頭。
3.語句 select ascii('D'), char(67)的執(zhí)行結(jié)果是:___68______和__C_______。68、C“,2 4.語句 select lower('Beautiful'), rtrim('我心中的太陽 ')的執(zhí)行結(jié)果是: _beautiful____和___我心中的太陽_____。
5.選擇運算是根據(jù)某些條件對關(guān)系做_ 水平__分割;投影是根據(jù)某些條件對關(guān)系做____垂直”__分割。“ 6.關(guān)系運算主要有___選擇___、__投影__和連接。
7.完整性約束包括__實體__完整性、_域____性、參照完整性和用戶定義完整性。8.在SQL Server 2000中,數(shù)據(jù)庫對象包括__表__、___視圖__、觸發(fā)器、過程、列、索引、約束、規(guī)則、默認和用戶自定義的數(shù)據(jù)類型等。
9.語句 select day('2004-4-6'), len('我們快放假了.')的執(zhí)行結(jié)果是:___6______和____7____。
10.語句 select round(13.4321,2), round(13.4567,3)的執(zhí)行結(jié)果是:__13.4300_______和____13.4570_____。
11.完整性約束包括____域___完整性、__實體____完整性、參照完整性和用戶定義完整性。
12.T-SQL 語言中,有__算術(shù)__運算、字符串連接運算、比較運算和__邏輯__運算。
13.語句 select upper('beautiful'), ltrim(' 我心中的太陽')的執(zhí)行結(jié)果是: ______ BEAUTIFUL __和__我心中的太陽___。
14.索引的類型主要有______聚集索引_______和____非聚集索引______。15.在SQL Server 2000中,數(shù)據(jù)庫對象包括數(shù)據(jù)表、_視圖___、__存儲過程_、觸發(fā)器、規(guī)則、默認和用戶自定義的數(shù)據(jù)類型等。
16.數(shù)據(jù)庫的數(shù)據(jù)模型包含__數(shù)據(jù)結(jié)構(gòu)__、_數(shù)據(jù)操作_和__完整性約束_三個要素。
17.___ 域完整性___是指保證指定列的數(shù)據(jù)具有正確的數(shù)據(jù)類型、格式和有效的數(shù)據(jù)范圍。
18.___ 觸發(fā)器____是特殊類型的存儲過程,它能在任何試圖改變表中由觸發(fā)器保護的數(shù)據(jù)時執(zhí)行。
19.事務(wù)(Transaction)可以看成是由對數(shù)據(jù)庫的若干操作組成的一個單元,這些操作要么__都完成__,要么__都取消___(如果在操作執(zhí)行過程中不能完成其中任一操作)。
20.SQL Server 2000 采用的身份驗證模式有_ Windows身份驗證__模式和_混合_模式。
21.用戶訪問SQL Server數(shù)據(jù)庫時,經(jīng)過了兩個_身份__驗證和__權(quán)限__驗證安全驗證階段。
22.SQL Server 2000提供的數(shù)據(jù)庫備份方法有____完整___數(shù)據(jù)庫備份和_差異__數(shù)據(jù)庫備份、___事務(wù)日志____備份和_____文件和文件組_______備份。23.SQL Server代理主要由__作業(yè)____、___操作員___和警報來組成。24.SQL Server復(fù)制把服務(wù)器分為__發(fā)布____服務(wù)器、____分發(fā)__服務(wù)器和訂閱服務(wù)器三種。
25.SQL語言主要由____數(shù)據(jù)定義語言(DDL)______、___數(shù)據(jù)操作語言(DML)____和數(shù)據(jù)控制語言(DCL)組成。
26.語句 SELECT(7+3)*4-17/(4-(8-6))+99%4 的執(zhí)行結(jié)果是____35______ 27.____ 視圖____是由一個或多個數(shù)據(jù)表(基本表)或視圖導(dǎo)出的虛擬表。28._實體完整性_用于保證數(shù)據(jù)庫中數(shù)據(jù)表的每一個特定實體的記錄都是惟一的。
29.索引的類型有_____聚集索引_______和非聚集索引。
30.___ 存儲過程______是已經(jīng)存儲在SQL Server服務(wù)器中的一組預(yù)編譯過的Transact-SQL語句。
31.觸發(fā)器定義在一個表中,當在表中執(zhí)行___ insert _____、____ update ____或delete操作時被觸發(fā)自動執(zhí)行。
32.事務(wù)的ACID屬性是指___原子__性、__一致__性、__獨立__性和___持久__性。
33.數(shù)據(jù)庫管理系統(tǒng)的安全性通常包括兩個方面,一是指數(shù)據(jù)__訪問_____的安全性,二是指數(shù)據(jù)___運行____的安全性。
34.SQL Server代理主要由___作業(yè)_____、操作員和____警報____來組成。35.SQL Server復(fù)制有快照復(fù)制、____事務(wù)__復(fù)制和___合并_____復(fù)制3種類型。36.從最終用戶角度來看,數(shù)據(jù)庫應(yīng)用系統(tǒng)分為單用戶結(jié)構(gòu)、主從式結(jié)構(gòu)、分布式結(jié)構(gòu)、____客戶服務(wù)器___結(jié)構(gòu)和_____瀏覽器服務(wù)器____結(jié)構(gòu)。
37.用SELECT進行模糊查詢時,可以使用like或not like匹配符,但要在條件值中使用_ %_或__等通配符來配合查詢。并且,模糊查詢只能針__字符_類型字段查詢。%、_、字符”,3 38.SQL Server中數(shù)據(jù)操作語句包括___ insert _____、__ update ______、___ delete _____和select語句。
39.游標的操作步驟包括聲明、__打開___、處理(提取、刪除或修改)、__關(guān)閉____和___釋放___游標。
40.SQL Server 2000以____#___開頭的標識符,表示臨時表或過程; 41.left join 運算是____左連接______。
42.SELECT DATEADD(day, 10, '2005-12-22')結(jié)果是____2006-01-01____。43.ROUND()函數(shù)的是______四舍五入___函數(shù)。
44.SQL Server復(fù)制把服務(wù)器分為___發(fā)布___服務(wù)器、___分發(fā)___服務(wù)器和___訂閱___服務(wù)器三種。
45.MS SQL Server提供多個圖形化工具,其中用來啟動、停止和暫停SQL Serve的圖形化工具稱為_____服務(wù)管理器_____。
46.____ 存儲過程_____是已經(jīng)存儲在SQL Server服務(wù)器中的一組預(yù)編譯過的Transact-SQL語句。
47.HAVING子句與WHERE子句很相似,其區(qū)別在于:
WHERE子句作用的對象是__表和視圖__,HAVING子句作用的對象是__分組____。48.實體—聯(lián)系模型的三要素是_____實體_____、___屬性____和實體之間的聯(lián)系。
49.SQL Server的數(shù)據(jù)類型可分為_系統(tǒng)___數(shù)據(jù)類型和__用戶自定義__數(shù)據(jù)類型。
50.SQL Server聚合函數(shù)有最大、最小、求和、平均和計數(shù)等,它們分別是max、_______、_______、avg和count。min、sum",2 51.IBM公司的研究人員E.F.Codd連續(xù)發(fā)表了論文,提出了關(guān)系模型,奠定了__關(guān)系數(shù)據(jù)庫_____管理系統(tǒng)的基礎(chǔ)。
52.SQL Server的數(shù)據(jù)庫文件的擴展名為_ mdf_、事務(wù)日志文件的擴展名為_ ldf_。
53.建立和使用____約束____的目的是為了保證數(shù)據(jù)的完整性。
54.BACKUP命令是對數(shù)據(jù)庫進行_ ___備份______, RESTORE命令是對數(shù)據(jù)庫進行______恢復(fù)____。
55.SQL Server 2000的安全性分為兩類_數(shù)據(jù)訪問_安全性和__數(shù)據(jù)運行_安全性。
56.關(guān)系模型用___二維表_____結(jié)構(gòu)表示實體集,用鍵來表示實體間聯(lián)系。3.數(shù)據(jù)庫是被長期存放在計算機內(nèi)的、有組織的、統(tǒng)一管理的相關(guān)___數(shù)據(jù)___的集合。57.SQL Server數(shù)據(jù)庫的體系結(jié)構(gòu)也是三級模式結(jié)構(gòu),在SQL Server中,___外模式___對應(yīng)于視圖、__模式____對應(yīng)于基本表、__內(nèi)模式____對應(yīng)于存儲文件。58.___ 關(guān)系完整性_____是為保證數(shù)據(jù)庫中數(shù)據(jù)的正確性和相容性,對關(guān)系模型提出的某種約束條件或規(guī)則。
59.視圖是由一個或多個___數(shù)據(jù)表___或視圖導(dǎo)出的___虛擬表___或查詢表。60.__ 角色___是指服務(wù)器管理、數(shù)據(jù)庫管理和數(shù)據(jù)庫訪問特定的權(quán)限的集合。61.當___表___被刪除時與它關(guān)聯(lián)的觸發(fā)器也一同被刪除。
第四篇:SQL Server數(shù)據(jù)庫試題七及答案
SQL Server數(shù)據(jù)庫試題七及答案
一.單項選擇題(每題2分,計30分)
1._______是數(shù)據(jù)庫系統(tǒng)的核心,它負責數(shù)據(jù)庫的配置、存取、管理和維護等工作。(c)A、操作系統(tǒng) B、關(guān)系模型 C、數(shù)據(jù)庫管理系統(tǒng) D、數(shù)據(jù)庫
2.SQL Server2000是一款基于_________體系的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。(A)A、客戶機/服務(wù)器 B、主機 C、N層 D、單機
3.下面哪一個不是SQL Server2000的基本數(shù)據(jù)類型(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中,數(shù)據(jù)存儲的基本單位是頁,頁的大小是(D)A、1K B、2K C、4K D、8K 7.在使用CREATE DATABASE命令創(chuàng)建數(shù)據(jù)庫時,F(xiàn)ILENAME選項定義的是(D)A、文件增長量 B、文件大小 C、邏輯文件名 D、物理文件名 8.關(guān)于表結(jié)構(gòu)的定義,下面說法中錯誤的是(C)A、表名在同一個數(shù)據(jù)庫內(nèi)應(yīng)是唯一的 B、創(chuàng)建表使用CREATE TABLE命令 C、刪除表使用DELETE TABLE命令 D、修改表使用ALTER TABLE命令 9.下面哪一個約束用來禁止輸入重復(fù)值?(A)A、UNIQUE B、NULL C、DEFAULT D、FOREIGN KEY 10.下面關(guān)于登錄賬戶、用戶和角色的說法錯誤的是(C)A、登錄賬戶是服務(wù)器級的 B、用戶是登錄賬戶在某個數(shù)據(jù)庫中的映射 C、用戶不一定要和登錄賬戶相關(guān)聯(lián) D、角色其實就是用戶組 11.在SELECT語句中,用于去除重復(fù)行的關(guān)鍵字是(B)A、TOP B、DISTINCT C、PERCENT D、HAVING 12.若想查詢出所有姓張的、且出生日期為空的學生信息,則WHERE條件應(yīng)為(C)A、姓名 LIKE ‘張%’ AND 出生日期 = NULL B、姓名 LIKE ‘張*’ AND 出生日期 = NULL C、姓名 LIKE ‘張%’ AND 出生日期 IS NULL D、姓名 LIKE ‘張_’ AND 出生日期 IS NULL 13.下面關(guān)于視圖的說法中,錯誤的是(C)A、視圖是個虛擬表 B、可以使用視圖更新數(shù)據(jù),但每次更新只能影響一個表 C、不能為視圖定義觸發(fā)器 D、可以創(chuàng)建基于視圖的視圖 14.下面關(guān)于觸發(fā)器的描述,錯誤的是(A)A、觸發(fā)器是一種特殊的存儲過程,用戶可以直接調(diào)用 B、觸發(fā)器表和DELETED表沒有共同記錄
C、觸發(fā)器可以用來定義比CHECK約束更復(fù)雜的規(guī)則
D、刪除觸發(fā)器可以使用DROP TRIGGER命令,也可以使用企業(yè)管理器 15.下面關(guān)于事務(wù)的描述,錯誤的是(D)A、事務(wù)可用于保持數(shù)據(jù)的一致性 B、事務(wù)應(yīng)該晝小且應(yīng)盡快提交
C、應(yīng)避免人工輸入操作出在在事務(wù)中 D、在事務(wù)中可以使用ALTER DATEABSE
二.填空題(每空1分,計20分)
1.SQL Server是作為Windows NT或2000的一個__服務(wù)________運行的,用戶可以啟動、暫?;蛲V顾?。
2.SQL Server服務(wù)包括有__ SQL Server服務(wù)________、___ SQL Server Agent服務(wù)_______、Microsoft Search和MS DTC服務(wù)。
3.SQL Server有兩類數(shù)據(jù)庫,__系統(tǒng)數(shù)據(jù)庫________和用戶數(shù)據(jù)庫。其中為新的用戶數(shù)據(jù)庫提供模板的系統(tǒng)數(shù)據(jù)庫是____ model ______。
4.所有的數(shù)據(jù)庫都有一個____主數(shù)據(jù)文件______和一個或多個事務(wù)日志文件,此外,還可能有_____次要數(shù)據(jù)文件_____。
5.向表中添加數(shù)據(jù)應(yīng)使用___ INSERT(或填I(lǐng)NSERT INTO)_______命令,更新數(shù)據(jù)應(yīng)使用___ UPDATE _______命令。
6.在SQL Server2000中,約束有非空約束、缺省約束、_主鍵約束_________、____外鍵約束______、檢查約束和唯一約束等6種類型。
7.對象權(quán)限是指用戶基于數(shù)據(jù)庫對象層次上的訪問和操作權(quán)限,共有5種:SELECT、INSERT、DELETE、___ UPDATE_______和____ EXECUTE ______。(或填更新、執(zhí)行)
8._____ UNION _____可以把兩個或多個SELECT語句的查詢結(jié)果組合成一個結(jié)果集,使用時要求所有SELECT語句的列數(shù)應(yīng)_______相同___,對應(yīng)列的數(shù)據(jù)類型相容。
9.索引表的順序與數(shù)據(jù)行的物理順序相同的索引稱為___聚集(或聚簇 或簇)_______索引。
10.使用游標的一般步驟應(yīng)為:__創(chuàng)建游標
________、_____打開游標_____、從游標的結(jié)果集中讀取數(shù)據(jù)、對游標中的數(shù)據(jù)逐行操作、關(guān)閉游標和釋放游標。
11.___事務(wù)_______是指一個操作序列,這些操作序列要么都被執(zhí)行,要么都不被執(zhí)行。
12.___差異備份_______只記錄自上次完整數(shù)據(jù)庫備份后發(fā)生更改的數(shù)據(jù)。
三.判斷題(每題1分,計10分)
1.外鍵是指一個表中含有與另外一個表的主鍵相同的列或列組,外鍵不要求惟一。(√)2.SQL Server2000支持Unicode字符集,相應(yīng)數(shù)據(jù)類型為text、char和varchar。(×)
3.企業(yè)管理器是SQL Server提供的最主要的數(shù)據(jù)庫管理工具,它以樹形結(jié)構(gòu)的形式來管理數(shù)據(jù)庫服務(wù)器、數(shù)據(jù)庫和數(shù)據(jù)庫中的對象。(√)
4.全局變量與局部變量一樣,用戶必須進行聲明后才能使用。(×)5.在SQL Server2000中,由于不能跨頁存儲數(shù)據(jù)行,所以頁中每一行最多包含的數(shù)據(jù)量是8060B。(√)
6.數(shù)據(jù)完整性就是指數(shù)據(jù)的正確性、完備性和一致性。(√)
7.若使用REVOKE命令撤消某用戶創(chuàng)建表的權(quán)限,則該用戶將肯定無權(quán)創(chuàng)建表。(×)
8.WITH CHECK OPTION表示使用視圖更新數(shù)據(jù)時應(yīng)滿足視圖定義中設(shè)置的條件(√)9.表的每個觸發(fā)動作只能有一個INSTEAD OF觸發(fā)器。(√)
10.在使用差異數(shù)據(jù)庫備份還原數(shù)據(jù)庫時,應(yīng)先還原最新的完整數(shù)據(jù)庫備份。(√)
四.查詢設(shè)計(每題5分,計25分)某個學籍數(shù)據(jù)庫有如下表結(jié)構(gòu):
學生(學號,姓名,性別,出生日期,班級)課程(課程號,課程名稱,課程類別,課時)選課(學號,課程號,成績)請完成下列查詢要求。
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.查詢出各班級學生人數(shù)。SELECT 班級, COUNT(*)AS 人數(shù) FROM 學生 GROUP BY班級
5.查詢出“計算機應(yīng)用基礎(chǔ)”課程成績高于張三同學此門課程成績的學生的學號和姓名。
SELECT學生.學號, 姓名
FROM 學生JOIN 選課 ON 學生.學號 = 選課.學號 JOIN 課程 ON課程.課程號 = 選課.課程號
WHERE課程名稱 = ‘計算機應(yīng)用基礎(chǔ)’ AND 成績 >(SELECT成績
FROM 學生JOIN 選課 ON 學生.學號 = 選課.學號 JOIN 課程 ON課程.課程號 = 選課.課程號
WHERE課程名稱 = ‘計算機應(yīng)用基礎(chǔ)’ AND姓名 = ‘張三’)
五.綜合題(每空3分,計15分)
根據(jù)下面某教學管理數(shù)據(jù)庫的表結(jié)構(gòu),完成下面的程序填空題。教師(職工號,姓名,學歷,職稱)課程(課程號,課程名稱,課程類別)任課(職工號,課程號,周課時)
1.補填下面的存儲過程的定義,使其被調(diào)用時,能根據(jù)調(diào)用程序提供的教師姓名使用輸出參數(shù)返回該教師任課的課程數(shù)。CREATE PROCEDURE 按教師姓名查詢?nèi)握n課程數(shù) @姓名 VARCHAR(10), @課程數(shù) INT __ OUTPUT ___________________ AS SELECT __@課程數(shù) = COUNT(*)___________________ FROM 教師 JOIN 任課 ON 教師.職工號 = 任課.職工號 WHERE ____姓名 = @姓名_________________
2.完成下面的觸發(fā)器的定義,當向任課表中插入記錄時,觸發(fā)器能判斷若插入的記錄使該教師的任課周課時總計超過20,則回滾插入操作。CREATE TRIGGER 添加教學任務(wù) 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.服務(wù)
2.SQL Server服務(wù) SQL Server Agent服務(wù)(或填主服務(wù)、代理服務(wù))3.系統(tǒng)數(shù)據(jù)庫 model 4.主數(shù)據(jù)文件 次要數(shù)據(jù)文件
5.INSERT(或填I(lǐng)NSERT INTO)UPDATE 6.主鍵約束 外鍵約束
7.UPDATE EXECUTE(或填更新、執(zhí)行)8.UNION 相同
9.聚集(或聚簇 或簇)10.創(chuàng)建游標 打開游標 11.事務(wù)
12.差異備份
三.判斷題(每題1分,計10分)1.√ 2.× 3.√ 4.× 5.√ 6.√ 7.× 8.√ 9.√ 10.√
四.查詢設(shè)計(每題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.查詢出各班級學生人數(shù)。SELECT 班級, COUNT(*)AS 人數(shù) FROM 學生 GROUP BY班級
5.查詢出“計算機應(yīng)用基礎(chǔ)”課程成績高于張三同學此門課程成績的學生的學號和姓名。
SELECT學生.學號, 姓名
FROM 學生JOIN 選課 ON 學生.學號 = 選課.學號 JOIN 課程 ON課程.課程號 = 選課.課程號
WHERE課程名稱 = ‘計算機應(yīng)用基礎(chǔ)’ AND 成績 >(SELECT成績
FROM 學生JOIN 選課 ON 學生.學號 = 選課.學號 JOIN 課程 ON課程.課程號 = 選課.課程號
WHERE課程名稱 = ‘計算機應(yīng)用基礎(chǔ)’ AND姓名 = ‘張三’)五.綜合題(每空3分,計15分)
1.OUTPUT @課程數(shù) = COUNT(*)姓名 = @姓名 2.INSERTED ON任課.職工號 = INSERTED.職工號 ROLLBACK TRANSACTION
第五篇:SQL Server數(shù)據(jù)庫試題九及答案
一、選擇題(每題2分,共30分)
1、下面不屬于數(shù)據(jù)定義功能的SQL語句是:()
A.CREAT TABLE B.CREAT CURSOR C.UPDATE D.ALTER TABLE
2、SQL數(shù)據(jù)庫中的視圖與下列哪項是對應(yīng)的()。A.關(guān)系模式 B.存儲模式 C.子模式 D.以上都不是
3、下列選項中不是數(shù)據(jù)庫復(fù)制類型的是()。A.快照復(fù)制 B.差異復(fù)制 C.事務(wù)復(fù)制 D.合并復(fù)制
4、下列說法錯誤的是:()。
A.一個基本表可以跨一個或多個存儲文件 B.一個存儲文件可以跨一個或多個基本表
C.每個存儲文件與外部存儲器上一個物理文件對應(yīng) D.每個基本表與外部存儲器上一個物理文件對應(yīng)
5.顯示包含警告信息或其他信息的消息框,應(yīng)該使用的操作是()。A.Echo B.Message C.Warn D.MsgBox
6、在SQL Server 2000中,索引的順序和數(shù)據(jù)表的物理順序相同的索引是()。A.聚集索引 B.非聚集索引 C.主鍵索引 D.唯一索引 7.SQL Server的字符型系統(tǒng)數(shù)據(jù)類型主要包括()。A.Int、money、char B.char、varchar、text C.datetime、binary、int D.char、varchar、int
8、以下選項中哪一項不是訪問數(shù)據(jù)庫系統(tǒng)的接口()。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題使用如下數(shù)據(jù): 當前盤當前目錄下有數(shù)據(jù)庫db_stock,其中有表stock的內(nèi)容是: 股票代碼 股票名稱 單價 交易所 600600 青島啤酒 7.48 上海 600601 方正科技 15.20 上海 600602 廣電電子 10.40 上海 600603 興業(yè)房產(chǎn) 12.76 上海 600604 二紡機 9.96 上海 600605 輕工機械 14.59 上海 000001 深發(fā)展 7.48 深圳 000002 深萬科 12.50 深圳
11、有如下SQL語句
create view stock_view as select * from stock where 交易所=”深圳” 執(zhí)行該語句后產(chǎn)生的視圖包含的記錄個數(shù)是()A.1 B.2 C.3 D.4
12、有如下SQL語句
create view view_stock as select 股票名稱 as 名稱,單價 from stock 執(zhí)行該語句后產(chǎn)生的視圖含有的字段名是()
A.股票、名稱、單價 B.名稱、單價
C 名稱、單價、交易所 D 股票名稱、單價、交易所
13、執(zhí)行如下SQL語句后
select distinct 單價 from stock where 單價=(select min(單價)from stock)into dbf stock_x 表stock_x中的記錄個數(shù)是()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種類型的存儲過程:系統(tǒng)存儲過程、、臨時存儲過程、和擴展存儲過程。
2、在Microsoft SQL Server系統(tǒng)中,數(shù)據(jù)庫備份的類型包括:數(shù)據(jù)庫備份、、和。
3、觸發(fā)器有3種類型,即INSERT類型、和。
4、Transact-SQL語言有4部分元素組成,分別是:、數(shù)據(jù)定義語言、和一些附加的語言元素。
5、事務(wù)的4個屬性:原子性、一致性、和。
6、ADO的對象模型為層次結(jié)構(gòu),主要的ADO對象有3個:、、和。
7、函數(shù)datediff(year,’1998-10-12’, ’2005-1-17’)的執(zhí)行結(jié)果是 ;函數(shù)str(1234.56,3,1)的執(zhí)行結(jié)果是。
三、簡答題(共3題,20分)
1、為什么要創(chuàng)建索引(4分)
2、簡述INSERT觸發(fā)器的工作原理(6分)
3、根據(jù)所給的商品庫和教學庫,按照下列所給的每條SQL查詢語句寫出相應(yīng)的功能,或者按照下列所給的每種功能寫出相應(yīng)的SQL查詢語句。(每小題2分,共10分)
在名稱為商品庫的數(shù)據(jù)庫中包含有商品表1和商品表2,它們的定義分別為: 商品表1(商品代號 char(8),分類名 char(8),單價 float,數(shù)量 int)商品表2(商品代號 char(8),產(chǎn)地 char(6),品牌 char(6),)在名稱為教學庫的數(shù)據(jù)庫中包含有學生、課程和選課三個表,它們的定義分別為: 學生(學生號 char(7),姓名 char(6),性別 char(2),出生日期 datetime, 專業(yè) char(10),年級 int)課程(課程號 char(4),課程名 char(10),課程學分 int 選課(學生號 char(7),課程號 char(4),成績 int)1.select distinct 產(chǎn)地 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學生所選課程中一門課的全部學生。
四、設(shè)計題(每題4分,共20分)有一個“學生-課程”數(shù)據(jù)庫,數(shù)據(jù)庫中包括三個表:(1)“學生”表Student由學號(Sno)、姓名(Sname)、性別(Ssex)、年齡(Sage)、所在系(Sdept)五個屬性組成,可記為: Student(Sno,Sname,Ssex,Sage,Sdept)Sno 為關(guān)鍵字。(2)“課程”表Course由課程號(Cno)、課程名(Cname)、先修課號(Cpno)、學分(Ccredit)四個屬性組成,可記為: Course(Cno,Cname,Cpno,Ccredit)Cno為關(guān)鍵字。(3)“學生選課”表SC由學號(Sno)、課程號(Cno)、成績(Grade)三個屬性組成,可記為: SC(Sno,Cno,Grade)(SNO, CNO)為關(guān)鍵字。完成下列操作:
1、建立一個“學生”表Student,它由學號Sno、姓名Sname、性別Ssex、年齡Sage、所在系Sdept五個屬性組成,其中學號屬性不能為空,并且其值是唯一的。
2、查考試成績有不及格的學生的學號
3、將學生95001的年齡改為22歲
4、計算1號課程的學生平均成績
5、創(chuàng)建一存儲過程getDetailByName,通過輸入?yún)?shù)學生姓名(如“章山“),篩選出該學生的基本信息,對不存在此學生姓名的輸入值,必須作一檢測,打印信息“不存在此學生”。參考答案
一、選擇題(每題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、事務(wù)日志備份、差異備份、文件和文件組備份
3、UPDATE類型、DELETE類型
4、數(shù)據(jù)控制語言(或DCL)、數(shù)據(jù)操作語言(或DML)
5、隔離性、持久性
6、Connection Command和Recordset7、7 ***
三、簡答題(每題5分,共20分)
1、什么要創(chuàng)建索引?(4分)
答:創(chuàng)建索引可以大大提高系統(tǒng)的性能。第一,通過創(chuàng)建唯一性索引,可以保證每一行數(shù)據(jù)的唯一性。第二,可以大大加快數(shù)據(jù)的檢索速度,這也是所以的最主要原因。第三,可以加速表與表之間的連接,特別是實現(xiàn)數(shù)據(jù)的參考完整性方面特有意義。第四,在使用ORDER BY和GROUP BY子句進行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間。第五,通過使用索引,可以在查詢過程中,使用優(yōu)化隱藏器,提高系統(tǒng)性能。
2、簡述INSERT觸發(fā)器的工作原理(6分)
答:當向表中插入數(shù)據(jù)時,INSERT觸發(fā)器觸發(fā)執(zhí)行。當INSERT觸發(fā)器觸發(fā)時,新的記錄增加到觸發(fā)器表中和inserted表中。該inserted表是邏輯表,保存了所插入記錄的拷貝,允許用戶參考INSERT語句中的數(shù)據(jù)。觸發(fā)器可以檢查inserted表,來確定該觸發(fā)器的操作是否應(yīng)該執(zhí)行和如何執(zhí)行。在inserted表中的哪些記錄,總是觸發(fā)表中一行或多行記錄的冗余。
3、根據(jù)商品庫和教學庫,按照下列所給的每條SQL查詢語句寫出相應(yīng)的功能,或者按照下列所給的每種功能寫出相應(yīng)的SQL查詢語句。(每小題2分,共10分)
1.從商品庫中查詢出所有商品的不同產(chǎn)地。
2.從教學庫中查詢出只選修了一門課程的全部學生。
3.從教學庫中查詢出最多選修了2門課程(含未選任何課程)的全部學生。4.select 分類名,max(單價)as 最高單價 from 商品表1 group by 分類名
5.select distinct 學生.* from 學生,選課
where 學生.學生號=選課.學生號 and 課程號=any(select 課程號 from 學生,選課
where 學生.學生號=選課.學生號 and 姓名=@m1)
四、設(shè)計題(每題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、創(chuàng)建一存儲過程getDetailByName,通過輸入?yún)?shù)學生姓名(如“章山”),篩選出該學生的基本信息,對不存在此學生姓名的輸入值,必須作一檢測,打印信息“不存在此學生”。
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 + ' 的學生資料'