第4章數據庫的查詢、視圖和遊標

4.1關係運算

1.選擇

選擇(selection)是單目運算,其運算對象是一個表。該運算按給定的條件,從表中選出滿足條件的行,形成一個新表,作爲運算結果。

2.投影

投影(projection)也是單目運算,其運算對象是一個表。該運算從表中選出指定的屬性值組成一個新表。

3.連接

連接(join)是把表中的行按照給定的條件進行拼接而形成的新表。數據庫中最常用的是“自然連接”。進行自然連接時要求兩個表有共同屬性(列),自然連接運算的結果表是在參與操作的兩個表的共同屬性上進行等值連接後,再去除重複的屬性後所得的新表。

4.2數據庫的查詢:SELECT

4.2.1 SELECT 語句:

SELECT <輸出列>                          /*指定查詢結果輸出列*/        

[INTO 新表]                              /*指定查詢結果存入新表*/

[FROM {<表源>}[,...]]                    /*指定查詢源:表或視圖*/

[WHERE <條件>]                           /*指定查詢條件*/  

[GROUP BY <分組條件>]                    /*指定查詢結果分組條件*/

[HAVING <分組統計條件>]                  /*指定查詢結果分組統計條件*/

[ORDER BY <排序順序>]                    /*指定查詢結果排序順序*/

 

a.選擇所有的列:使用*表示選擇一個表或視圖中的所有列。

USE pxscj

GO

SELECT *

FROM xsb

GO

b.選擇一個表中的指定的列

USE pxscj

GO

SELECT 學號,姓名,總學分

FROM xsb

WHERE 專業 = '計算機'

GO

c.定義列別名

USE pxscj

GO

SELECT 學號 AS number,姓名 AS name,總學分 AS mark

FROM xsb

WHERE 專業 = '計算機'

GO

USE pxscj

GO

SELECT number = 學號,name = 姓名,mark = 總學分

FROM xsb

WHERE 專業 = '計算機'

d.替換查詢結果中的數據

CASE

WHEN 條件1 THEN 表達式1

WHEN 條件2 THEN 表達式3

......

ELSE 表達式

END

示例:

USE pxscj

GO

SELECT 學號,姓名,等級 =

CASE

WHEN 總學分 IS NULL THEN '尚未選課'

WHEN 總學分<50 THEN '不及格'

WHEN 總學分>=50 and 總學分<=52 THEN '合格'

ELSE '優秀'

END

FROM xsb

WHERE 專業= '計算機'

GO

e.計算列值:使用select對列進行查詢時,在結果中可以輸出對列值計算後的值,即select子句可使用表達式作爲結果,語法格式如下:

SELECT 表達式 [,表達式]

示例:

USE pxscj

GO

SELECT 學號,課程號,成績120= 成績*1.20

FROM cjb

WHERE 學號='191301'

f.消除結果集中的重複行

對錶只選擇其某些列時,可能會出現重複行,可以使用DISTINCT關鍵字消除結果集中的重複行,使用關鍵詞ALL時,將保留結果集的所有行,省略時默認爲ALL,格式如下:

SELECT DISTINCT | ALL 列名 [,列名...]

示例:

USE pxscj

GO

SELECT DISTINCT 專業 FROM xsb

g.限制結果集返回固定行數

[TOP [PERCENT][WITH TIES]]

指示只能從查詢結果集返回指定的第一組行或指定百分比數目的行。“表達式”可以指定數目或百分比數目的行。若帶PERCENT關鍵字,則表示返回結果集的前%行

示例:

SELECT TOP 6 姓名,專業,總學分

FROM xsb

SELECT TOP (10) PERCENT 姓名,專業,總學分

FROM xsb

h.聚合函數

SELECT子句中的表達式中還可以包含所謂的聚合函數。聚合函數常用語對一組值進行計算,然後返回單個值。聚合函數通常與GROUP BY子句一起使用,如果一個SELECT子句中

有一個GROUP BY 子句,則這個聚合函數對所有的列起作用,如果沒有,則SELECT子句只產生一行作爲結果。下表爲SQL Server提供的聚合函數:

函數名

說明

AVG

求組中值的平均值

BINARY_CHECKSUM

返回對錶中的行或表達式列表計算的二進制校檢值,可用於檢測表中行的更改

CHECKSUM

返回在表的行上或在表達式列表上計算的校驗值,用於生成哈希索引

CHECKSUM_AGG

返回組中值的校驗值

COUNT

求組中的項數,返回int類型整數

COUNT_BIG

求組中的項數,返回bigint類型整數

GROUPING

產生一個附加的列

GROUPING_ID

爲聚合列列表中的每一行創建一個值以標識聚合級別

MAX

求最大值

MIN

求最小值

SUM

返回表達式中所有值的和

STDEV

返回給定表達式中所有值的統計標準偏差

STDEVP

返回給定表達式中所有值的填充統計標準偏差

VAR

返回給定表達式中所有值的統計方差

VARP

返回給定表達式中所有值填充的統計方差

常用函數:SUM和AVG,MAX和MIN,COUNT

 

SUM和AVG分別用於求表達式中所有值項的總和與平均值,語法格式如下:

SUM/AVG ([ALL|DISTINCT] 表達式)

示例:求所有課程總學分和選修101課程學生的平均成績

SELECT 總學分 =SUM (學分)

FROM kcb

GO

SELECT 平均成績 =AVG(成績)

FROM cjb

WHERE 課程號=101

GO

 

MAX和MIN

SUM/AVG ([ALL|DISTINCT] 表達式)

示例:求選修101課程學生的最高分和最低分

SELECT MAX(成績) AS '計算機基礎最高分',MIN(成績) AS '計算機基礎最低分'

FROM cjb WHERE 課程號 = '101'

 

COUNT 用於統計組中滿足條件的行數和總行數,其語法格式如下:

COUNT( { [ALL |DISTINCT ]表達式 } | * )

示例:求學生的總數、總學分在50分以上的人數和專業個數

SELECT COUNT(*) AS '學生的總數',COUNT(DISTINCT 專業) AS '專業個數'

FROM xsb GO

SELECT COUNT(總學分) AS '總學分大於50分的人數'

FROM xsb WHERE 總學分>50;

GO

使用COUNT(*)時返回檢索的行的總數目,不論其是否包含NULL值

COUNT_BIG函數的格式功能與COUNT都相同,區別僅在於COUNT_BIG返回bigint類型值。

 

4.2.2 選擇查詢條件:WHERE

1.表達式比較

表達式1 {比較雲算符} 表達式2,其中表達式是除text、ntext和image以外類型的表達式。當兩個表達式的值均不爲空時,比較運算返回邏輯值TRUE(真)或FALSE(假)。而當兩個表達式的值中有一個爲空值或都爲空值時,比較運算將返回UNKNOWN。可以將多個判定運算的結果通過邏輯雲算符(NOT、AND、OR)再組成更爲複雜的查詢條件

示例:查詢xsb中通信工程專業總學分大於等於42的同學的情況。

SELECT * FROM xsb WHERE 專業= ‘通信工程’ AND 總學分>=42

2.模式匹配

LIKE謂詞用於指出字符串是否與指定的字符串相匹配,返回邏輯值TRUE或FALSE。LIKE謂詞表達式的語法格式如下:

表達式[NOT] LIKE 模式串 [ESCAPE 轉義符]

說明:

表達式:一般爲字符串表達式,在查詢語句中可以是列名。

模式串:可以使用通配符

轉義符:應爲有效的SQL Server字符,沒有默認值,且必須爲單個字符。當模式串中含有與通配符相同的字符時,應通過該字符前的轉義符指明其爲模式串中的一個匹配字符。使用ESCAPE可以指定轉義符。

NOT LIKE:使用NOT LIKE  與LIKE 的作用相反。

使用帶“%”通配符的LIKE時,模式字符串中的所有字符都有意義,包括起始或尾隨空格。

通配符說明:

通配符

說明

%

代表倒數

_(下畫線)

代表單個字符

[]

指定範圍(如[a-f]、[0-9]或集合[abcdef]中的任何單個字符)

[^]

指定不屬於範圍(如[^a-f]、[^0-9]或集合[^abcdef]中的任何單個字符)

示例:查詢xsb表中姓“王”且單名的學生情況

SELECT *

FROM xsb

WHERE 姓名 LIKE '王_'

GO

示例:查詢xsb中學號倒數第5個數字爲9,且倒數第1個數字在1~5之間的學生學號、姓名及專業。

SELECT 學號,姓名,專業

FROM xsb

WHERE 學號 LIKE '_9___[1-5]'

GO

 

3.範圍比較 BETWEEN 和 IN

當要查詢的條件爲某個值的範圍時,可以使用BETWEEN關鍵字

表達式 [NOT] BETWEEN 表達式1 AND 表達式2     

注意:表達式1的值不能大於表達式2,包含表達式1和表達式2的值

 

示例:查詢xsb中不在1995年出生的學生情況

SELECT *

FROM xsb

WHERE 出生時間 NOT LIKE '1995______'

SELECT *

FROM xsb

WHERE 出生時間 NOT BETWEEN '1995-01-01' AND '1995-12-31'

IN關鍵字可以指定一個值表,值表中列出所有可能的值,當與值表中的任一個匹配時,即返回TRUE,否則返回FALSE,格式如下:

表達式 IN (表達式[,...])

示例:查詢xsb中專業爲軟件工程或通信工程的學生情況

SELECT *

FROM xsb

WHERE 專業 IN ('軟件工程' ,'通信工程')

SELECT *

FROM xsb

WHERE 專業 ='軟件工程' OR 專業 ='通信工程'

 

4.空值比較

當需要判斷一個表達式的值是否爲空值時,使用IS NULL 關鍵字,格式如下:

表達式 IS [NOT] NULL

示例:查詢總分尚不明確的學生情況

SELECT * FROM xsb WHERE 備註 IS NULL

 

5.子查詢

在查詢條件中,可以使用另一個的查詢的結果作爲條件的一部分。例如,判定列值是否與某個查詢的結果集中的值相等,作爲查詢條件一部分的查詢稱爲子查詢。

T-SQL允許SELECT多層嵌套使用,用來表示複雜的查詢。子查詢除了可以用在SELECT語句中,還可以用在INSERT、UPDATE、DELETE語句中。子查詢通常與IN、EXISTS謂詞及比較運算符綜合使用。

a.IN子查詢:IN子查詢用於進行一個給定值是否在子查詢結果集中的判斷,語法格式如下:

表達式 [NOT] IN (子查詢)  當表達式與子查詢的結果表中的某個值相等時,IN謂詞返回TRUE,否則返回FALSE.

示例:查詢選修了課程號爲206的課程的學生情況。

SELECT * FROM xsb,cjb WHERE xsb.學號=cjb.學號 AND 課程號 =206

SELECT * FROM xsb WHERE 學號 IN (SELECT 學號 FROM cjb WHERE 課程號 = 206)

b.比較子查詢:IN子查詢的擴展,它使表達式的值與子查詢的結果進行比較運算,語法格式如下:

表達式 {比較運算符} {ALL |ANY }(子查詢)   其中ALL、SOME、ANY說明對比較運算的限制。ALL指定表達式要與子查詢結果集中的每個值都進行比較,當表達式與每個值都滿足比較的關係時,才返回TRUE

否則返回FALSE;SOME或ANY表示表達式只要與子查詢結果集中的某個值滿足比較關係,就返回TRUE,否則返回FALSE

示例:查找選修了離散數學的學生學號

SELECT 學號 FROM cjb WHERE 課程號 =  (SELECT 課程號 FROM kcb WHERE 課程名 ='離散數學')

SELECT 學號 FROM cjb WHERE 課程號 IN (SELECT 課程號 FROM kcb WHERE 課程名 ='離散數學')

示例:查找比所有計算機系的學生年齡都大的學生

SELECT * FROM xsb WHERE 出生時間<ALL (SELECT 出生時間 FROM xsb WHERE 專業 = '計算機')

示例:查找206號課程成績不低於101號課程最低成績的學生學號。

SELECT 學號 FROM cjb WHERE 課程號 = '206' AND 成績!<ANY(SELECT 成績 FROM cjb WHERE 課程號='101')

c.EXISTS子查詢: 用於測試子查詢的結果是否爲空表,若不爲空,則EXISTS返回TRUE,否則返回FALSE

[NOT] EXISTS (子查詢)

示例:查找選修206號課程的學生姓名

SELECT 姓名 FROM xsb WHERE 學號 IN(SELECT 學號 FROM cjb WHERE 課程號 = 206)

SELECT 姓名 FROM xsb WHERE EXISTS (SELECT *FROM cjb WHERE 學號= xsb.學號 AND 課程號= '206')

示例:從xsb表中查找所有女學生的姓名、學號及其與“191301”號學生的年齡差距

SELECT 學號,姓名,YEAR(出生時間)-YEAR((SELECT 出生時間 FROM xsb WHERE 學號= '191301')) AS 年齡差距 FROM xsb WHERE 性別=0  YEAR函數用於取出日期類型數據的年份。

 

6.CONTAINS謂詞

若需要在表中搜索指定的單詞、短語或近義詞等,可以使用CONTAINS謂詞。CONTAINS謂詞用於在表中搜索指定的字符串,可以精確匹配,也可以模糊匹配,還可以是加權匹配。要使用CONTAINS謂詞,全文索引服務在運行狀態,並且應在操作的表上事先建立全文索引。

CONTAINS ({列|*},'<包含查詢條件>'[,LANGUAGE 語言項])

說明:

“列”表示在指定的列中搜索,可以指定多個列,類型爲char、varchar、nchar、nvarchar、text、ntext、image、xml和varbinary的列是可進行全文搜索的有效列。

“*”表示在所有列中搜索,“語言項”表示用戶查詢時所用的語言。

<包含查詢條件>指定要在列中搜索的文本和匹配條件,語法格式如下:

{<簡單項>|<前綴項>|<派生項>|<臨近項>|<加權項>}|{ (<包含查詢條件>) [{<AND>|<ADN NOT>|<OR>}] <包含查詢條件> [...] }

<簡單項>:用於說明搜索的單詞還是短語,格式如下:單詞|"短語" 單詞是不包含空格和標點符號的字符串;短語是含一個或多個空格的字符串

<前綴項>:給出了要搜索的單詞或短語必須匹配的前綴 格式如下:{"單詞*"|"短語*"}

<派生項>:說明搜索包含原詞的派生詞,所謂派生詞是指原詞的名詞單、複數形式或動詞的各種時態等,格式如下:FORMSOF({INFLECTIONAL|THESAURUS},<簡單項>[,...])  INFLECTIONAL選項表示指定要對指定的簡單字詞使用與語言相關的詞幹分析器。THESAURUS選項表示指定使用對應於列全文語言或指定的查詢語言的同一詞庫。

<臨近項>:表示搜索包含NEAR或“~”運算符左右兩邊的詞或短語,格式如下:{<簡單項>|<前綴項>} {NEAR|~} {<簡單項>|<前綴項>} [...]

<加權項>:指明本語句是加權搜索,即查詢的數據與給定的權重進行加權匹配,格式如下:ISABOUT({{<簡單項>|<前綴項>|<派生項>|<臨近項>} [WEIGHT(加權值) ] } [,...]) ,其中加權值是一個0-1之間的數,表示權重。

示例:使用CONTAINS謂詞搜索xsb表中包含字符“不及格”的所有行。

SELECT * FROM xsb WHERE CONTAINS(*,'不及格')

 

7.FREETEXT謂詞

與CONTAINS謂詞類似,FREETEXT謂詞也用於在一個表中搜索單詞或短語,並要求表已建立全文索引,格式如下:

FREETEXT({列|列列表|*}, '自由文本串' [,LANGUAGE語言選項]) ,  其中自由文本串是要搜索的字符串。

示例:使用FREETEXT謂詞搜索xsb表中包含字符“琳”的所有行。

SELECT * FROM xsb WHERE FREETEXT(*,'琳')        FREETEXT謂詞只能與SELECT語句一起使用。

 

8.指定查詢對象FROM

SELECT的查詢對象由FROM子句指定,查詢對象主要包括表或視圖,稱之爲表源。可以使用AS選項爲表指定別名,AS關鍵字也可以省略,直接給出別名即可。別名主要用在相關的子查詢及連接查詢中。如果FROM子句指定了表別名,則這條SELECT語句中的其他子句都必須使用表別名來代替原始表名。

示例:查找選修了與學號爲191302的同學所選修的全部課程相同的同學的學號。

SELECT DISTINCT 學號 FROM cjb AS CJ1 WHERE NOT EXISTS (SELECT * FROM cjb AS CJ2 WHERE CJ2.學號 ='191302' AND NOT EXISTS(SELECT * FROM cjb AS CJ3 WHERE CJ3.學號=CJ1.學號 AND CJ3.課程號=CJ2.課程號))

SELECT DISTINCT 學號 FROM cjb WHERE  課程號   in ( SELECT 課程號 FROM cjb WHERE 課程號 in (SELECT 課程號  FROM cjb WHERE 學號=191302))

 

a.導出表 導出表表示由子查詢中SELECT語句的執行而返回的表,但必須使用AS關鍵字爲子查詢產生的中間表定義一個別名。

示例:從xsb中查找總學分大於50的男同學的姓名和學號

SELECT 姓名,學號,總學分 FROM (SELECT 姓名,學號,性別,總學分 FROM xsb WHERE 總學分>=50) AS student WHERE 性別=1

SELECT 姓名,學號,性別,總學分 FROM xsb WHERE 總學分>=50 AND 性別=1

 

9.行集函數

行集函數通常返回一個表或視圖。主要的行集函數有CONTAINSTABLE、FREETEXTTABLE、OPENDATASOURCE、OPENQUERY、OPENROWSET和OPENXML.另外OPENROWSET函數還可以用於插入圖片文件、文本文件、word文件、excel文件等內容

示例:插入圖片文件

USE test1

GO

CREATE TABLE Test

(

TestID  int IDENTITY(1,1),

BLOBName  varchar(50),

BLOBData  varbinary(MAX)

)

INSERT INTO Test(BLOBName,BLOBData) SELECT 'picture',BulkColumn FROM OPENROWSET(Bulk 'D:\picture.jpg',SINGLE_BLOB) AS BLOB

 

10表值函數

 

11.行轉列表和列轉行表

行轉列表格式如下:<行轉列表>::= 表源 PIVOT <行轉列子句> [AS] 表別名  行轉列子句的格式:<行轉列子句>::= (聚合函數名(值列) FOR 轉換列 IN (<列列表>))

PIVOT子句將表值表達式的某一列中的唯一值轉換爲輸出中的多個列來轉換表值表達式,即實現了將行值轉化爲列,並在必要時對最終輸出中所需的任何其餘的列值執行聚合。其經常用在生成交叉表格

報表以彙總數據。其中,“表源”是輸入表或表值表達式;“表列名”爲輸出表的別名;“值列”是需要聚合的列名;“轉換列”是要轉換的列;“列列表”列出了“轉換列”列的值,這些值將成爲輸出表的表列名,可以使用AS子句定義這些值的列別名。

示例:查找xsb表中1995年1月1日以前出生的學生的姓名和總學分,並列出其屬於計算機專業還是通信工程專業的情況,1表示是,0表示否。

SELECT 姓名,總學分,計算機,通信工程 FROM xsb PIVOT (COUNT(學號) FOR 專業 IN(計算機,通信工程)) AS PVT WHERE 出生時間<'1995-01-01'

 

列轉行表格式如下:<列轉行表>::= 表源 UNPIVOT <列轉行子句> 表別名  列轉行子句的格式:<列轉行子句>::= (值列 FOR 轉換列 IN (<列列表>))

示例:將kcb表中的開課學期和學分列轉換爲行輸出

SELECT 課程號,課程名,選項,內容 FROM kcb UNPIVOT (內容 FOR 選項 IN (學分,開課學期))unpvt

 

12.連接:連接是兩元運算,可以對兩個或多個表進行查詢,結果通常是含有參加連接運算的兩個或多個表的指定列的表。

a.連接謂詞:可以在SELECT語句的WHERE子句中使用比較運算符給出連接條件對錶進行連接,將這種表示形式成爲連接謂詞表示形式。

示例:查找pxscj數據庫中每個學生的情況及選修的課程情況

SELECT xsb.*,cjb.* FROM xsb,cjb WHERE xsb.學號=cjb.學號

連接謂詞中的比較符可以是< <= = > >= != <> !< !>,當比較符爲=時,就是等值連接

a.b自然連接:它在目標列中取出相同的字段名

示例:通過自然連接進行上述查詢

SELECT xsb.*,cjb.課程號,cjb.成績 FROM xsb,cjb WHERE xsb.學號=cjb.學號

a.c多表連接:

示例:查找選修了“計算機基礎”課程且成績在80分以上的學生學號、姓名、課程名及成績

SELECT xsb.學號,姓名,課程名,成績 FROM xsb,kcb,cjb WHERE xsb.學號=cjb.學號 AND cjb.課程號=kcb.課程號 AND 課程名='計算機基礎' AND 成績>=80

 

b.以JOIN關鍵字指定的連接

T-SQL擴展了以JOIN關鍵字指定連接的表示方式,使表的連接運算能力有所增強。FROM子句的<連接表>表示將多個表連接起來。格式如下:

<連接表>::={<表源> <類型> <表源> ON <查詢條件> |<表源> CROSS JOIN <表源> |左表源 {CROSS | OUTER} APPLY 右表源| [() <連接表> [] ]}

說明:

<表源>:準備要連接的表;

<類型>表示連接類型,語法格式如下:

<類型>::=[{INNER | { {LEFT |RIGHT|FULL} [OUTER]}} [<連接提示>]] JOIN ,

其中INNER表示內連接,OUTER表示外連接

ON:用於指定連接條件,<查詢條件>爲連接的條件。

APPLY運算符:使用APPLY運算符可以實現查詢操作的外部表表達式返回的每個行調用表值函數。“左表源”爲外部表值表達式,“右表源”爲表值函數。通過對右表源求值來獲得左表源每一行的計算結果,

生成的行被組合起來作爲最終輸出。APPLY運算符生成的列的列表是左表源中的列集,後跟右表源返回的列的列表。CROSS APPLY僅返回外部表中通過表值函數生成結果集的行。OUTER APPLY既返回生成結果集的行,又返回不生成結果集的行。

b.a內連接

示例:查找pxscj數據庫每個學生的情況及選修的課程情況

SELECT * FROM xsb INNER JOIN cjb ON xsb.學號=cjb.學號

內連接是系統默認的,可以省略INNER關鍵字,使用內連接後讓可以使用WHERE子句指定條件,內連接還可用於多表的連接

示例:查找選修了“計算機基礎”課程且成績在80分以上的學生學號、姓名、課程名及成績

SELECT xsb.學號,姓名,課程名,成績 FROM xsb JOIN cjb JOIN kcb ON cjb.課程號=kcb.課程號 ON xsb.學號=cjb.學號 WHERE 課程名='計算機基礎' AND 成績>=80

示例:查找不同課程成績相同的學生的學號、課程號和成績。

SELECT a.學號,a.課程號,b.課程號,a.成績 FROM cjb a JOIN cjb b ON a.課程號 !=b.課程號 AND a.成績=b.成績 AND a.學號 =b.學號

b.b外連接:指定了OUTER關鍵字的爲外連接,外連接的結果表不但包含滿足連接條件的行,還包括相應表中的所有行,OUTER關鍵詞可以省略。外連接包括三種

左外連接:結果表中除了包括滿足連接條件的行外,還包括左表的所有的行

右外連接:結果表中除了包括滿足連接條件的行外,還包括右表的所有的行

完全外連接:結果表中除了包括滿足連接條件的行外,還包括兩個表的所有的行

示例:查找所有學生情況及他們選修的課程號,若學生未選修任何課,也要包括其情況

SELECT xsb.*,課程號 FROM xsb LEFT OUTER JOIN cjb ON xsb.學號=cjb.學號

示例:查找被選修了的課程的選修情況和所有開設的課程名

SELECT cjb.*,課程名 FROM cjb RIGHT JOIN kcb ON cjb.課程號=kcb.課程號

c.交叉連接, 交叉連接實際上是將兩個表進行笛卡爾積運算,結果表是由第一個表的每一行與第二個表的每一行進行拼接後形成的表,因此結果表的行數等於兩個表的行數之積。交叉連接也可以用WHERE子句限定。

示例:列出所有學生的所有可能的選課情況

SELECT 學號,姓名,課程號,課程名 FROM xsb CROSS JOIN kcb

 

13.指定查詢結果分組方法:GROUP BY

GROUP BY 子句主要用於根據字段進行分組。例如,根據學生所學專業對xsb中的所有行進行分組,結果是每個專業的學生成爲一組。GROUP BY子句有ISO標準和非ISO標準。以下是ISO標準語法格式:

GROUP BY {<列表達式> |ROLLUP (<複合元素列表>) |CUBE(<複合元素列表>) |GROUPING SETS(<分組集合項列表>)}

說明:

<列表達式>:指定分組的字段名錶達式

ROLLUP:生成簡單的GROUP BY聚合行、小計行或超聚合行,還生成一個總計行,返回的分組數等於<複合元素列表>中的表達式數+1,功能與非ISO標準語法中的WITH ROLLUP子句類似。

CUBE:生成簡單的GROUP BY聚合行、ROLLUP超聚合行和交叉表格行。CUBE針對<複合元素列表>中表達式的所有排列輸出一個分組。生成的分組數等於2n,其中,n爲<複合元素列表>中的表達式數,功能與WITH CUBE子句類似。

GROUPING SETS:在一個查詢中指定數據的多個分組。僅聚合指定組,而不聚合由CUBE或ROLLUP生成的整組聚合。其結果與針對指定的組執行UNION ALL運算等效。GROUPING SETS可以包含單個元素或元素列表。

由於ISO標準的GROUP BY子句只有在數據庫兼容級別時才能使用。設置數據庫的兼容級別格式如下:

ALTER DATABASE 數據庫名 SET COMPATIBILITY_LEVEL ={90|100|110} 90,100,110分別代表SQL Server 2005,SQL Server 2008,SQL Server 2012

示例:在pxscj數據庫上產生一個結果集,包括每個專業的男生人數、女生人數、總人數及學生總人數

SELECT 專業,性別,COUNT(*) AS '人數' FROM xsb GROUP BY ROLLUP(專業,性別)

示例:在pxscj數據庫上產生一個結果集,包括每個專業的男生人數、女生人數、總人數、男生總數、女生總數及學生總人數

SELECT 專業,性別,COUNT(*) AS '人數' FROM xsb GROUP BY CUBE(專業,性別)

示例:生成一個結果集,分別根據專業和性別對人數進行聚合

SELECT 專業,性別,COUNT(*) AS '人數' FROM xsb GROUP BY GROUPING SETS(專業,性別)

 

14.指定查詢結果分組後的篩選條件:HAVING

使用GROUP BY子句和聚合函數對數據進行分組後,還可以使用HAVING子句對分組數據進行進一步的篩選。

HAVING語法格式:

[HAVING <查詢條件>] ,其中查詢條件與WHERE子句的查詢條件類似,不過HAVING子句中可以使用聚合函數,而WHERE子句中不可以。

示例:查找平均成績在85分以上的協會說呢過的學號和平均成績

SELECT 學號,AVG(成績) AS '平均成績' FROM cjb GROUP BY 學號 HAVING AVG(成績)>=85

注意:在SELECT語句中,當WHERE、GROUP BY、HAVING子句都被使用時,要注意他們的作用和執行順序。WHERE用於篩選由FROM子句指定的數據對象,GROUP BY用於對WHERE 的結果進行分組,HAVING則是對GROUP BY以後的分組數據進行過濾。

示例:查詢選修課程超過兩門且成績都在80分以上的學生的學號

SELECT 學號 FROM cjb WHERE 成績>=80 GROUP BY 學號 HAVING COUNT(*)> 2

示例:查找通信工程專業平均成績在85分以上的學生的學號和平均成績

SELECT 學號,AVG(成績) AS '平均成績' FROM cjb WHERE 學號 IN (SELECT 學號 FROM xsb WHERE 專業='通信工程') GROUP BY 學號 HAVING AVG(成績)>=85

先執行WHERE查詢條件中的子查詢,得到通信工程專業所有學生的學好集,然後對cjb表中的每一條記錄,判斷其學號字段值是否在前面所求得的學號集中,若否,則跳過記錄,繼續處理下一條記錄,若是,則加入WHERE查詢的結果集

對cjb表均篩選完後,按學號進行分組,再在各分組記錄中選出平均成績值大於等於85的記錄形成最後的結果集。

 

15.指定查詢結果排序順序:ORDER BY

格式如下:[ORDER BY {排序表達式 [COLLATE 排序名] [ASC|DESC]}]

說明,“排序表達式”可以是列名、表達式或一個正整數,當它是一個正整數時,表示按表中該位置上的列排序;“排序名”是windows排序規則名稱或SQL排序規則名稱;關鍵字ASC標識升序排列;DESC表示降序排列,系統默認ASC。

a.對查詢的結果排序輸出

示例:將計算機專業學生的“計算機基礎”課程成績按降序排列

SELECT 姓名,課程名,成績 FROM xsb,kcb,cjb WHERE xsb.學號=cjb.學號 AND cjb.課程號=kcb.課程號 AND 課程名='計算機基礎' AND 專業='計算機' ORDER BY 成績 DESC

b.對結果排序附加彙總:可以與COMPUTE BY(已廢棄,不再使用)子句一起使用,在對結果排序的而同時還產生附加的分類彙總行。

示例:將學生按專業排序,並彙總各專業人數和平均學分

SELECT 學號,姓名,出生時間,總學分 FROM xsb ORDER BY 專業 COMPUTE COUNT(學號),AVG(總學分) BY 專業

 

16.其他:INTO/UNION/EXCEPT/INTERSECT/CTE

a.INTO:使用INTO子句可以將SELECT查詢所得的結果保存到一個新建的表中,語法:[INTO 新表]

示例:由xsb表創建“計算機學生表”包括學號和姓名

SELECT 學號,姓名 INTO 計算機系學生 FROM xsb WHERE 專業='計算機'

b.UNION:使用UNION子句可以將兩個或多個SELECT查詢的結果合併成一個結果集,語法格式如下:

{<查詢規範>|(<查詢表達式>)} UNION [ALL] <查詢規範>|(<查詢表達式>) [UNION [ALL] <查詢規範>|(<查詢表達式>)[...]]

規則:所有查詢的列數和列的順序必須相同;數據類型必須兼容;關鍵字ALL標示合併的結果中包括所有的行,不去重複行,不使用ALL時則在合併的結果中去除重複行。含有UNION的SELECT查詢也稱聯合查詢,若不指定INTO子句,結果將合併到第一個表中

示例:在“計算機學生”和“通信工程學生”表中查找學號爲191301和學號爲221301的兩位同學的姓名

SELECT * FROM 計算機系學生 WHERE 學號='191301' UNION ALL SELECT * FROM 通信工程學生 WHERE 學號='221301'

UNION操作常用於歸檔數據,如歸檔月報表形成年報表、歸檔各部門數據等,還可以與GROUP BY及ORDER BY一起使用,用來對合並所得的結果表進行分組或排序

c.EXCEPT/INTERSECT:用於比較兩個查詢的結果,返回非重複值,格式如下:

{<查詢規範>|(<查詢表達式>)} {EXCEPT|INTERSECT} {<查詢規範>|(<查詢表達式>)}

EXCEPT從EXCEPT關鍵字的左邊查詢中返回右邊查詢沒有找到的所有非重複值。INTERSECT返回INTERSECT關鍵字左右兩邊的兩個查詢都返回的所有非重複值。EXCEPT/INTERSECT返回的結果集的列名與關鍵字左側的查詢返回的列名相同。

示例:查找專業爲計算機但性別不爲男的學生信息。

SELECT * FROM xsb WHERE 專業='計算機' AND 性別=0

SELECT * FROM xsb WHERE 專業='計算機' EXCEPT SELECT * FROM xsb WHERE 性別=1

示例:查找總學分大於42且性別爲男的學生信息

SELECT * FROM xsb WHERE 總學分>=42 AND 性別=1

SELECT * FROM xsb WHERE 總學分>=42 INTERSECT SELECT * FROM xsb WHERE 性別=1

d.CTE:在SELECT語句的最前面可以使用一條WITH子句來指定臨時結果集,格式如下:[WITH<公用表表達式>[,...]] SELECT...

<公用表表達式>::=表達式名[(列名[,...])] AS (CTE查詢定義)

臨時命名的結果集也稱爲公用表表達式(Common Table Expression,CTE),在SELECT、INSERT、DELETE、UPDATE或CREATE VIEW語句中都可以建立一個CTE。CTE相當於一個臨時表,只不過他的生命週期在該批處理語句執行完後就結束。

“表達式名”是CTE的名稱,“列名”指定查詢語句“CTE查詢定義”返回數據字段名稱,其個數要和“CTE查詢定義”返回的字段個數相同。若不定義,則直接命名查詢語法的數據集合字段名稱爲返回數據的字段名稱。CTE下方的SELECT語句可以直接查詢CTE中的數據。

示例:使用CTE從cjb表中查詢選了101號課程的學生學號、成績,並定義新的列名爲number、point。再使用SELECT語句從CTE和xsb中查詢姓名爲“王林”的學生學號和成績情況。

WITH cte_stu(number,point) AS (SELECT 學號,成績 FROM cjb WHERE 課程號='101') SELECT number,point FROM cte_stu,xsb WHERE xsb.姓名='王林' AND xsb.學號=cte_stu.number

 

4.3視圖

視圖是從一個或多個表導出的表。視圖是數據庫的用戶使用數據庫的觀點,能夠根據用戶的觀點定義數據結構,視圖與表(有時爲與視圖區別,也稱表爲基本表)不同,視圖是一個虛表,即視圖所對應的的數據不進行實際c存儲,數據庫中只存儲視圖的定義,在對視圖的數據進行操作時,系統根據視圖的定義去操作與視圖相關聯的基本表。視圖一經定義後,就可以像表一樣被查詢、修改、刪除、更新。注意:只有當前的數據庫中才能創建視圖。視圖的命名必需遵循標識符命名規則,不能與表同名,不能把規則、默認值或觸發器與視圖相關聯。

4.3.2 創建視圖:CREATE VIEW

CREATE VIEW cxs1 AS SELECT 學號,姓名,性別,出生時間,總學分 FROM xsb WHERE 專業=  '計算機'

語法格式如下:

CREATE VIEW [架構名 .] 視圖名[(列[,...])]

[WITH<視圖屬性>[,...]]

AS SELECT 語句 [;]

[WITH CHECK OPTION ]

說明:

(1)架構名:數據庫架構名

(2)列:列名,它是視圖中包含的列,可以有多個列名。若使用與源表或視圖相同的列名,則不必給出列名

(3)WITH<視圖屬性>:指出視圖的屬性

(4)SELECT語句:用來創建視圖的SELECT語句,可在SELECT語句中查詢多個表或視圖,以表明新創建的視圖所參照的表或視圖,SELECT語句限制:有權限,不能用ORDER BY和INTO子句,不能在臨時表或表變量上創建視圖

(5)WITH CHECK OPTION 指出在視圖上所進行的修改都要符合SELECT語句所指定的限制條件,這樣可以確保數據修改後,仍可通過視圖看到修改的數據。’

<視圖屬性>::={[ENCRYPTION][SCHEMABINDING][VIEW_METADATA]}

ENCRYPTION:說明在系統表syscomments中存儲CREATE VIEW語句時進行加密

SCHEMABINDING:說明將視圖與其所依賴的表或視圖結構相關聯

VIEW_METADATA:當引用視圖的瀏覽模式的元數據時,向DBLIB、ODBC、OLEDB API返回有關視圖的元數據信息,而不返回基本表的元數據信息

示例:創建ccj視圖,包括計算機專業各學生的學號、其選修的課程號及成績。要保證對該視圖的修改都符合專業爲計算機這個條件

CREATE VIEW ccj WITH ENCRYPTION AS SELECT xsb.學號,課程號,成績 FROM xsb,cjb WHERE xsb.學號=cjb.學號 AND 專業='計算機' WITH CHECK OPTION

 

分區視圖

分區視圖在一臺或多臺服務器間水平連接一組成員表中的分區數據,使數據看起來就像來自一個表,一般情況下,如果視圖爲下列格式,則其爲分區視圖

CREATE VIEW 視圖名

AS

SELECT <選擇列表1>

FROM T1

UNION ALL

SELECT <選擇列表2>

FROM T2

UNION ALL

......

SELECT <選擇列表n>

FROM Tn

如果要創建分佈式分區視圖,則需要連接到相應的服務器,使用其他服務器的表時需要指定表所屬的服務器、數據庫、架構名等信息。

4.3.3查詢視圖:SELECT

定義完視圖後就可以像查詢基本表那樣對視圖進行查詢

4.3.4更新視圖:INSERT/UPDATE/DELETE

可更新視圖要滿足以下條件:創建視圖的SELECT語句中沒有聚合函數,且沒有TOP、GROUP BY、UNION子句及DISTINC關鍵字;創建視圖的SELECT語句中不包含從基本表列通過計算機所得的列;創建視圖的SELECT語句的FROM子句中至少要包含一個基本表。

 

可更新分區的視圖。在實現分區視圖之前,必須先實現水平分區表。原始表被分成若干個小的成員表,每個成員表包含與原始表相同數量的列,並且每一列具有與原始表中相應列同樣的特性(如數據類型、大小、排序等)設計好成員表後,每個表基於鍵值的範圍存儲原始表的一塊水平區域。鍵值範圍基於分區列中的數據值。每一成員表中的值範圍通過分區列上的CHECK約束強制,並且範圍之間不能重疊。對這樣的基本表使用UNION ALL聯合運算符所創建的分區視圖就是可更新的。

 

通過INSTEAD OF 觸發器創建的可更新視圖。對視圖進行更新操作時,要注意基本表對數據的各種約束和規則要求。

示例:向cxs視圖中插入以下記錄('191315','劉明義',1,'1996-3-2','計算機',50,NULL)

INSERT INTO cxs VALUES ('191315','劉明義',1,'1996-3-2','計算機',50,NULL)  cxs依賴表xsb,查詢xsb可以查看插入記錄,當視圖所依賴的表有多個時,不能向該視圖插入數據,因爲會影響多個基本表

示例:修改數據使用UPDATE將cxs視圖中所有學生的總學分+1

UPDATE cxs SET 總學分=總學分+1

示例:刪除數據,使用DELETE語句可以通過視圖刪除基本表的數據。但要注意,對於依賴多個基本表的視圖,不能用DELETE語句, 刪除cxs中女同學的記錄

DELETE FROM cxs WHERE 性別=0

 

4.3.5修改視圖定義:ALTER VIEW

語法格式如下:ALTER VIEW [架構名.]視圖名[(列[,...])] [WITH<視圖屬性>[,...]] AS SELECT 語句[;] [WITH CHECK OPTION] 參數大多與CREATE VIEW相同

示例:視圖cjj是加密存儲視圖,修改其定義,包括學號、姓名、選修的課程號、課程名和成績

ALTER VIEW cjj WITH ENCRYPTION

AS

SELECT xsb.學號,xsb.姓名,cjb.課程號,kcb.課程名,成績 FROM xsb,cjb,kcb WHERE xsb.學號=cjb.學號 AND cjb.課程號=kcb.課程號 AND 專業='計算機' WITH CHECK OPTION

4.3.6刪除視圖 DROP VIEW

語法:DROP VIEW [架構名.]視圖名[,...]

 

 

4.4遊標

SQL Server通過遊標(Cursor)提供了對一個結果集進行逐行處理的能力,遊標可以看做一種特殊的指針,它與某個查詢結果相聯繫,可以指向結果集的任意位置,以便對指定位置的數據進行處理。使用遊標可以在查詢數據的同時對數據進行處理。

遊標分兩類:前端(客戶端)遊標和後端(服務器端)遊標

遊標的使用遵循以下步驟:聲明遊標-打開遊標-讀取數據-關閉遊標-刪除遊標

4.4.1聲明遊標:DECLARE CURSOR

兩種標準:SQL-92標準和T-SQL擴展遊標聲明標準

(1)SQL-92標準

語法格式如下:

DECLARE 遊標名 [INSENSITIVE] [SCROLL] CURSOR

FOR SELECT語句

[FOR READ ONLY | UPDATE [OF 列名...]]

說明:

遊標名:它是與某個查詢結果集相聯繫的符號名,要符合SQL Server標識符的命名規則。

INSENSITIVE:指定系統將創建供所定義的遊標使用數據的臨時複本,對遊標的所有請求都從tempdb中的該臨時表中得到應答。因此,在對該遊標進行提取操作時返回的數據中不反映對基本表所做的修改,並且對該遊標不允許修改。如果省略INSENSITIVE,則任何用戶對基本表提交的刪除和更新都反應在後面的提取中。

SCROLL:說明所聲明的遊標可以前滾、後滾,可使用所有的提取選項(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE).如果省略SCROLL,則只能使用NEXT提取選項

SELECT語句:由該查詢產生與所聲明的遊標相關聯的結果集,該語句中不能出現INTO或FOR BROWSE

READ ONLY:說明所聲明的遊標爲只讀的。UPDATE指定遊標中可以更新的列。若有參數“OF 列名”,則只能修改給出的這些列;若在UPDATE中未指出列,則可以修改所有列。

示例:定義一個符合SQL-92標準的遊標聲明

DECLARE xs_curl CURSOR

FOR

SELECT 學號,姓名,性別,出生時間,總學分 FROM xsb WHERE 專業='計算機' FOR READ ONLY

 

(2)T-SQL擴展遊標聲明標準

語法格式如下:

DECLARE 遊標名  CURSOR

[LOCAL | GLOBAL]                                     /*遊標作用域*/

[FORWARD_ONLY | SCROLL ]                             /*遊標移動方向*/

[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]           /*遊標類型*/

[READ_ONLY|SCROLL_LOCKS | OPTIMISTIC ]               /*訪問屬性*/

[TYPE_WARNING]                                       /*類型轉換警告信息*/

FOR SELECT語句                                       /*SELECT查詢語句*/

[FOR UPDATE  [OF 列名[,...]]]                        /*可修改的列*/

說明:

LOCAL | GLOBAL:說明遊標的作用域,LOCAL聲明的是局部遊標,作用域爲創建它的批處理、存儲過程或觸發器。GLOBAL聲明全局遊標,它在由連接執行的任何存儲過程或批處理中都可以使用,在連接釋放時,遊標自動釋放。若兩者都沒指定,則默認值由default to local cursor數據庫選項的設置控制。

FORWARD_ONLY | SCROLL:說明遊標移動的方向,FORWARD_ONLY表示遊標只能從第一行滾動到最後一行,即該遊標只能支持FETCH的NEXT提取選項。SCROLL含義與SQL-92標準相同。

STATIC | KEYSET | DYNAMIC | FAST_FORWARD:

遊標的四種類型,

靜態遊標:關鍵字STATIC,與92標準的INSENSITIVE關鍵字功能相同;

動態遊標:關鍵在DYNAMIC,反映對結果集彙總所做的修改,結果集中的行數據值、順序和成員在每次提取時都會改變,所有用戶做的UPDATE、INSERT和DELETE語句均通過遊標反映出來,不支持ABSOLUTE提取;

只進遊標:關鍵在FAST_FOWRWARD,只支持遊標從頭到尾順序提取數據,對所有由當前用戶或其他用戶提交併影響結果集中的行的INSERT、UODATE和DELETE語句對數據的修改在從遊標中提取時可立即反映出來,但因只進遊標不能向後滾動,所以在行提取後對行所做的更改對遊標是不可見的;

鍵集驅動遊標:關鍵字KEYSET,這種遊標是由稱爲鍵的列或列的組合控制的,成員和順序是固定的,鍵集驅動遊標中數據行的鍵值在遊標打開時建立在tempdb數據庫中,可以通過鍵集驅動遊標修改基本表中的非關鍵字列的值,但不可插入數據。

遊標類型與移動方向之間的關係:

FAST_FORWARD不能與SCROLL一起使用,且FAST_FORWARD與FORWARD_ONLY只能選一個;若指定了移動方向爲FORWARD_ONLY,而沒有用STATIC、KETSET或DYNAMIC關鍵字,則默認爲動態遊標;若移動方向FORWARD_ONLY和SCROLL都沒指定,若指定遊標類型爲STATIC、KETSET或DYNAMIC,則移動方向默認爲SCROLL;否則爲FORWARD_ONLY。

READ_ONLY|SCROLL_LOCKS | OPTIMISTIC:指明遊標或基本表的訪問屬性,READ_ONLY說明遊標只讀,不能通過該遊標更細數據;SCROLL_LOCKS說明通過遊標完成的定位更新和定位刪除可以成功。如果聲明中已指定了關鍵字FAST_FORWARD,則不能指定SCROLL_LOCK。OPTIMISTIC說明,如果行自從被讀入遊標以來已得到更新,則通過遊標進行的定位更新或定位刪除不成功,若聲明中指定了關鍵字FAST_FORWARD,則不能指定SCROLL_LOCK。OPTIMISTIC說明,如果行自從被讀入遊標以來已得到更新,則通過遊標進行的定位更新或定位刪除不成功,若聲明中指定了關鍵字FAST_FORWARD,則

TYPE_WARNING:若遊標從所請求的類型隱形轉換爲另一種類型,則給客戶端發送警告消息

FOR SELECT語句:與92標準相同

FOR UPDATE:指出右表中可以更新的列,若有參數OF 列名[,...],則只能修改給出的這些列;若在UPDATE中未指出列,則可以修改所有列。

示例:定義一個T-SQL擴展遊標聲明。

DECLARE xs_cur2 CURSOR

DYNAMIC

FOR

SELECT 學號,姓名,總學分 FROM xsb WHERE 專業='計算機' FOR UPDATE OF 總學分

該語句聲明一個名爲xs_cur2的動態遊標,可前後滾動,可對總學分列進行修改。

 

4.4.2打開遊標:OPEN

OPEN {{[GLOBAL] 遊標名} | 遊標變量名}  其中游標名是要打開的遊標名,“遊標變量名”是用於引用一個遊標。GLOBAL說明打開的是全局遊標,否則打開局部遊標。

示例:定義遊標xs_cur3,然後打開遊標,輸出其行數

DECLARE xs_cur3 CURSOR

LOCAL SCROLL SCROLL_LOCKS

FOR SELECT 學號,姓名,總學分 FROM xsb FOR UPDATE OF 總學分

OPEN xs_cur3

SELECT '遊標xs_cur3數據行數' = @@CURSOR_ROWS

 

4.4.3讀取數據:FETCH

遊標打開後,即可使用FETCH語句從中讀取數據,格式如下:

FETCH

[ [NEXT|PRIOR|FIRST|LAST|ABSOLUTE{n |@nvar}|RELATIVE{n |@nvar}] FROM ]

{{[GLOBAL] 遊標名} |@遊標變量名}

[INTO @變量名[,...]]

說明:

遊標名:要從中提取數據的遊標名。

@遊標變量名:引用要進行提取操作的已打開的遊標。

NEXT|PRIOR|FIRST|LAST:說明讀取數據的位置。NEXT說明讀取當前行的下一行,並且使其成爲當前行。如果FETCH NEXT是對遊標的第一次提取操作,則讀取的是結果集的第一行。NEXT爲默認的遊標提取選項。PRIOR說明讀取當前行的前一行,並且使其置位當前行。FIRST讀取遊標中的第一行並將其作爲當前行。LAST讀取遊標中的最後一行並將其作爲當前行。FIRST和LAST不能在只進遊標中使用。

ABSOLUTE{n |@nvar}和RELATIVE{n |@nvar}:給出讀取數據的位置與遊標頭或當前位置的關係,其中n必須爲長整型常量,變量@nvar必須爲smallint、tinyint或int類型。

ABSOLUTE{n |@nvar}:若n 或@nvar爲正數,則讀取從遊標頭開始的第n行,並將讀取的行變成新的當前行;若n 或@nvar爲負數,則讀取遊標尾之前的第n行,並將讀取的行變成新的當前行,若n 或@nvar爲0,則沒有行返回。

RELATIVE{n |@nvar}:若n 或@nvar爲正數,則讀取當前行之後的第n行,並將讀取的行變成新的當前行;若n 或@nvar爲負數,則讀取當前行之前的第n行,並將讀取的行變成新的當前行,若n 或@nvar爲0,則讀取當前行。如果在對遊標的第一次提取操作時將FETCH RELATIVE中的n或@nvar指定爲負數或零,則沒有返回行。

INTO:說明將讀取的遊標數據存放到指定的變量中。

GLOBAL:全局遊標。

示例:只讀遊標的使用

DECLARE xs_curl CURSOR

FOR

SELECT 學號,姓名,性別,出生時間,總學分 FROM xsb WHERE 專業='計算機' FOR READ ONLY

GO

OPEN xs_curl

GO

FETCH NEXT FROM xs_curl

GO

FETCH NEXT FROM xs_curl

GO

由於xs_cur1是隻進遊標,所以只能使用NEXT提取數據。

示例:動態遊標的使用

DECLARE xs_cur2 CURSOR

DYNAMIC

FOR

SELECT 學號,姓名,總學分 FROM xsb WHERE 專業='計算機' FOR UPDATE OF 總學分

OPEN xs_cur2

FETCH NEXT FROM xs_cur2

FETCH NEXT FROM xs_cur2

FETCH RELATIVE 2 FROM xs_cur2

FETCH PRIOR FROM xs_cur2

FETCH RELATIVE -3 FROM xs_cur2

SELECT '執行情況' = @@FETCH_STATUS

FETCH FIRST FROM xs_cur2

從遊標xs_cur2中提取第一行數據的代碼:FETCH NEXT FROM xs_cur2

從遊標xs_cur2中提取下一行數據的代碼:FETCH NEXT FROM xs_cur2

從遊標xs_cur2中提取上一行數據的代碼:FETCH PRIOR FROM xs_cur2

從遊標xs_cur2中提取最後一行數據的代碼:FETCH LAST FROM xs_cur2

讀取當前行的下兩行的代碼:FETCH RELATIVE 2 FROM xs_cur2  如果是-2,則讀取當前行的上兩行

xs_cur2是動態遊標,可以前滾、後滾,可以使用FETCH語句中除ABSOLUTE以外的提取選項。

FETCH語句的執行狀態保存在全局變量@@FETCH_STATUS中,其值爲0時表示上一個FETCH執行成功;爲1時表示所要讀取的行不在結果集中;爲-2時表示被讀取的行已不存在(已被刪除) FETCH RELATIVE -3 FROM xs_cur2 SELECT 'FETCH執行情況'=@@FETCH_STATUS

 

4.4.4關閉和刪除遊標:CLOSE/DEALLOCATE

關閉遊標,語法格式如下:

CLOSE{{[GLOBAL] 遊標名}|@遊標變量名 }

示例:CLOSE xs_cur2

刪除遊標:若確認遊標不再需要,就要釋放其定義佔用的系統空間,即刪除遊標,語法格式如下:

DEALLOCATE{{[GLOBAL] 遊標名}|@遊標變量名 }

示例:DEALLOCATE xs_cur2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章