SQL Server的事務處理與高級查詢

6.高級查詢與腳本

6.1子查詢web

位於SELECT查詢中的SELECT查詢。數據庫

6.11 標量表達式編程

select id,val,val-(select avg(val) from tbltest) from tbltest安全

運行結果服務器

1       25.00        -16.928571ide

1       35.00        -6.928571函數

2       23.00        -18.928571測試

4       12.00        -29.928571url

4       52.00        10.071429spa

6       27.00        -14.928571

6       37.00        -4.928571

8       26.00        -15.928571

9       99.00        57.071429

10     28.00        -13.928571

11     65.00        23.071429

11     48.00        6.071429

13     83.00        41.071429

14     27.00        -14.928571

6.12 建立派生表

select id as topid,val as topvalue,val-(select avg(val) from tbltest) as subvalue from tbltest

6.13 使用IN()函數

select id as topid,val as topvalue,val-(select avg(val) from tbltest) as subvalue from tbltest where id in (2,4,6,8,10,12,14)

運行結果

2       23.00        -18.928571

4       12.00        -29.928571

4       52.00        10.071429

6       27.00        -14.928571

6       37.00        -4.928571

8       26.00        -15.928571

10     28.00        -13.928571

14     27.00        -14.928571

6.14 使用EXISTS()和NOT EXISTS()函數

用於在子查詢有返回記錄時返回外查詢中的一行。在查詢中一般使用星號而不是使用列名。可是在子查詢中,它僅用於讓查詢引擎測試試行時是否存在,而不會浪費系統資源。

select id as topid,val as topvalue,val-(select avg(val) from tbltest) as subvalue from tbltest where exists(select id from tbltest where id in (2,4,6,8,10,12,14))

6.2 Common Table Expressions(CTE)

CTE是一個只存在於內存中的子查詢,不須要特殊的權限,也不須要物理空間操做。CTE與傳統的子查詢不一樣,它是一個已命名的對象,能夠像表那樣重用和引用。

CTE須要在查詢腳本中被使用以前進行定義,其定義形式是:用WITH開頭,後跟一列放在括號中的輸出列,以後是關鍵字AS和一個放在括號中的完整的SELECT語句。

WITH HighPrice (ProductID,ProductName,UnitPrice) AS

(

    SELECT ProductID,ProductName,UnitPrice From Products

    WHERE UnitPrice>80

)

 

SELECT * From HighPrice

運行結果

9       Mishi Kobe Niku        97.00

20     Sir Rodney's Marmalade 81.00

29     Thüringer Rostbratwurst          123.79

38     Côte de Blaye  263.50

注意CTE必須在後續的查詢中才能被使用。

6.3遊標

對於SQL來講,遊標是指從查詢返回的記錄集。

6.31 建立與遍歷遊標

首先聲明一個遊標類型的變量,變量名不能以@符號開頭。遊標變量能夠在填寫遊標的SELECT語句的行上聲明和定義:

DECLARE curProduct INSENSITIVE CURSOR

FOR SELECT TOP 10 ProductID,ProductName FROM Products

DECLARE @ProID int

DECLARE @ProName nvarchar(40)

 

Open curProduct

FETCH NEXT FROM curProduct INTO @ProID,@ProName

WHILE @@Fetch_Status=0

  BEGIN

    PRINT @ProName

    Fetch NEXT FROM curProduct Into @ProID,@ProName

  END

CLOSE curProduct

DEALLOCATE curProduct

運行結果

Alice Mutton

Aniseed Syrup

Boston Crab Meat

Camembert Pierrot

Carnarvon Tigers

Chai

Chang

Chartreuse verte

Chef Anton's Cajun Seasoning

Chef Anton's Gumbo Mix

7.數據事務

7.1事務簡介

7.11 事務類型

  • 顯式事務:事務中存在顯示的BEGIN TRANSACTION語句,後跟一個或多個相關的數據修改語句,並以顯式的COMMIT TRANSACTION語句結束。錯誤檢查添加在COMMIT TRANSACTION語句以前。若是操做有誤,事務能夠經過ROLLBACK TRANSACTION語句來撤銷。
  • 隱式事務:只要進行數據修改,就隱式地開始一個事務。
  • 自動提交事務

7.12 ACID測試

  • 原子(Atomic):事務中的全部步驟和操做都當作原子單元。要麼所有成功,要麼所有失敗。
  • 一致(Consistent):任何事務的輸出都是可預測的,全部的操做都遵循一致性原則,並確保數據庫內的數據完整性。
  • 隔離(Isolated):任何在事務以前、之中或者以後執行的操做,相關數據都處於一致的狀態,而不是處於部分完成的狀態。任何用戶或者操做查詢受事務影響的數據時,都會當即覺察到整個事務被他提交了。
  • 持久(Durable):若是事務成功,數據就寫到磁盤上,不會回到它原來的狀態。數據不會受系統失敗的影響。

7.13 事務日誌

事務日誌是磁盤上的一個獨立文件,用於從全部用戶與應用程序處收集全部成功的數據修改請求。

7.2對數據執行CRUD

7.21 添加記錄

INSERT…Values語句:

提供一個列名的列表,以後是放在括號中的值的列表,用於在表中插入一行。

INSERT INTO tbltest (id,val) values (2,18)

INSERT…SELECT:經過使用SELECT語句來提供值。

INSERT INTO tbltest (id,val)

SELECT '2','23'

插入多個記錄(2008中新增)

INSERT INTO tbltest (id,val) values (2,18),(3,4)

插入其餘表中的行:

insert into tbltest2 (id,va2)

select id,val from tbltest

使用存儲過程管理插入操做

CREATE PROCEDURE Ins_tbltest

  @id int,

  @val decimal(9,2)

AS

  INSERT INTO tbltest(id,val)

  SELECT @id,@val

return @@Identity

Ins_tbltest 2,28.2

7.22 修改記錄

UPDATE命令:列值用SET關鍵字來修改。

過濾更新:

update tbltest

set val=val*1.2

根據多個表更新數據行

update tb

set val=val*1.2

From tbltest tb

INNER JOIN tbltest2 tb2 on tb.id=tb2.id

WHERE tb.id=4

使用存儲過程更新記錄

CREATE PROCEDURE spUpd_tbltest

  @id int

 ,@val decimal(9,2)

AS

  update tbltest

  SET id=@id,val=@val

7.23 刪除記錄

DELETE命令:delete from tbltest where id=1

7.24 用MERGE命令自動完成插入、更新和刪除操做(SQL2008新增)

8.高級功能

8.1數據的透視

第一範式:一個實體不該包含重複類型的特性。着意味着相似的值不該在同一行的多列上重複出現。

PIVOT和UNPIVOT操做符:

8.2全文索引和近似匹配

SQLSERVER爲BLOB類型提供了三種不一樣的實現方法,包括Text,nText和Image。但它們並不支持索引和排序功能。

8.3 Microsoft搜索服務

音索匹配:

9.T-SQL編程對象

9.1聯合視圖

單機視圖建立比較簡單,聯合視圖將異地服務器聯合工做,來解決業務問題。

CREATE VIEW vALLAcounts

AS

  SELECT * FROM Accounts      ---(local DATABASE)

UNION ALL

  SELECT * FROM EastCoastServer.SaleDatabase.Accounts  ---(other DATABASE)

 

SELECT TOP 10* FROM vALLAcounts

9.2保護數據

視圖提供一個容許用戶訪問數據的層,但不能經過該層訪問敏感數據或者其餘數據庫對象。一般須要採起的安全措施是,數據庫管理員首先鎖着全部的表,拒絕任何常規用戶訪問。而後建立視圖,並顯式地位全部或有選擇的用戶公開通過選擇的表、列或行。通常狀況下視圖不提供數據修改。

9.3存儲過程

能夠實現帶參數的視圖、返回標量值、維護記錄、處理業務邏輯。

存儲過程建立完畢後例如sp_Protb,用以下語句進行執行

Exec sp_Protb

處理業務邏輯:主要使用條件邏輯、IF語句、CASE、循環來實現。

select val,case id when 1 then 111 when 2 then 222

when 3 then 333 else 999

End as valtotal

from tbltest

運行結果

27.60   222

17.28   999

74.88   999

32.40   999

44.40   999

31.20   999

118.80  999

33.60   999

78.00   999

57.60   999

99.60   999

32.40   999

21.60   222

27.60   222

9.4用戶自定義函數

9.41 標量函數

用於接收任何數量的參數而且返回一個值。將輸入參數在括號中聲明,後跟返回值表名,且全部語句必須包括在BEGIN…END中。

CREATE FUNCTION fnGetAge(@Bir Datetime,@Today Datetime)

RETURNS INT

AS

  BEGIN

    RETURN DateDIff(day,@Bir,@Today)/365.25

  END

 

SET ANSI_NULLS ON

select dbo.fnGetAge('1/5/1984',GetDate())

運行結果

26

9.42 內嵌表值函數

能夠像視圖同樣返回一個結果集,可是函數可也接收參數。在函數定義中,返回類型被設置爲表類型,而RETURN語句則和位於括號內的SELECT查詢一塊兒被調用。

ALTER FUNCTION [dbo].[fnTblList](@val decimal)

RETURNS TABLE

AS

RETURN

(

    -- Add the SELECT statement with parameter references here

    SELECT * from tbltest where tbltest.val=@val

)

9.43 多語句表值函數

10.建立和管理數據庫對象

10.1數據定義語言

對象類型

名字

Employee

視圖

vwOpsEmployee

存儲過程

spInsertEmployee

函數

fnNewEmployee

觸發器

trVerifyEmployee

檢查約束

chPhoneNumber

外鍵約束

fkSalesEmployeeLink

主鍵約束

pkEmployeeID

默認

dfRegion

簇索引

clRegionID

非簇索引

ncLastName

CREATE TABLE MyTable

(ID Int Not null,Val varchar(50) null)

Go

Create view Myview

AS

  Select Val from MyTable

10.11 可空性

若是沒有給這個列提供值,則默認爲NULL。NOT NULL實際上市列約束,若是要禁止使用空值,則使用NOT NULL

10.12 標識符

IDENTITY:給某個列自動賦予數字值。語法格式爲IDENTITY[(seed,increment)].種子(seed)與增量(increment)值並無被限制爲1,也沒有被限制爲整數。支持IDENTITY屬性的數據類型有tinyInt,smallInt,int,bigInt,decimal與numeric.

CREATE TABLE MyTable

(ID Int identity(1000000,-100) Not null,Val varchar(50) null)

Go

10.13 默認值

DEFAULT語句

CREATE TABLE MyTable

(ID Int identity(100000,-100) Not null,Val varchar(50) null default 888,

Mes varchar(50))

Go

10.14 約束

約束類型

說明

NotNull(非空)

確保列有一個已定義的非空值

Primary Key(主鍵)

對行的標識強制要求惟一性,不接受空值

Check(主鍵)

根據列的質來驗證行。使用一個與WHERE語句後所接內容相似的子句來標識可接受的值

Unique(惟一)

要求列中的每一個值都是惟一,可接受空值

Foreign Key(外鍵)

根據相關表的主鍵檢查列的值,來強制遵循所引用完整性規則

主鍵約束:

CREATE TABLE MyTable

(ID Int Not null CONSTRAINT pkMyTable PRIMARY KEY,Val varchar(50) null default 888,

Mes varchar(50))

Go

相關文章
相關標籤/搜索