DBMS :Database Management System
數(shù)據(jù)模型:概念數(shù)據(jù)模型 ----設(shè)計(jì)
???????? 邏輯數(shù)據(jù)模型(關(guān)系數(shù)據(jù)模型,網(wǎng)狀數(shù)據(jù)模型,層次數(shù)據(jù)模型,)----實(shí)現(xiàn)
???????? 物理數(shù)據(jù)模型
數(shù)據(jù)模式:描述
聯(lián)系,約束并發(fā)控制:多用戶訪問(wèn)共享數(shù)據(jù)的沖突問(wèn)題
實(shí)體—聯(lián)系:er模型
rdbms (關(guān)系數(shù)據(jù)庫(kù))???? :? sql server ,oracle ,db/2,sybase,informix
Non-rdbms (file-based) :? foxpro,access
客戶端網(wǎng)絡(luò)實(shí)用工具(Client Network Utility):用來(lái)配置客戶端的網(wǎng)絡(luò)連接,管理和測(cè)定客戶端的數(shù)據(jù)庫(kù)。
事件探察器:監(jiān)視事件處理日志,并對(duì)日志進(jìn)行分析和重播。
服務(wù)端網(wǎng)絡(luò)實(shí)用工具(Server Network Utility):配置服務(wù)器端網(wǎng)絡(luò)連接和設(shè)置相關(guān)參數(shù)。
導(dǎo)入和導(dǎo)出數(shù)據(jù)(Imput and Export Data):采用DTC(data transformation services)向?qū)?lái)完成,實(shí)現(xiàn)其他數(shù)據(jù)和SQL 2000數(shù)據(jù)的轉(zhuǎn)換。
企業(yè)版:win2000 advanced server
標(biāo)準(zhǔn)版:win2000 server
首要數(shù)據(jù)文件 .mdf
次要數(shù)據(jù)文件 .ndf
日志文件???? .ldf
windows身份驗(yàn)證模式 比 混合模式具有更高的安全性,windows身份驗(yàn)證模式下必須是本地用戶和域用戶才能使用SQL Server 2000
升級(jí)SQL SERVER:備份(包括系統(tǒng)庫(kù)在內(nèi)的)所有數(shù)據(jù)庫(kù),備份注冊(cè)表
日志文件:
sqlstp.log?? 在\windows或\winnt下
setup.log??? 在\windows或\winnt下
searchsetup.log? 在\winnt\temp下
errorlog???? 在mssql\log下
系統(tǒng)數(shù)據(jù)庫(kù):
master:
model:? 是用戶數(shù)據(jù)庫(kù)和tempdb數(shù)據(jù)庫(kù)的摸板數(shù)據(jù)庫(kù),是創(chuàng)建新數(shù)據(jù)庫(kù)的摸板
msdb:?? 是代理服務(wù)數(shù)據(jù)庫(kù)
tempdb: 臨時(shí)數(shù)據(jù)庫(kù),默認(rèn)大小8mb,為臨時(shí)操作提供存儲(chǔ)空間
pubs:?? 示范學(xué)習(xí)
系統(tǒng)表:
(
sysobjects表
syscolumns表
sysindexes表
sysusers表
sysdatabases表
sysdepends表
sysconstraints表
)
(主關(guān)鍵字(主鍵):
候選關(guān)鍵字:
公共關(guān)鍵字:
外關(guān)鍵字:確定主表和從表)
數(shù)據(jù)庫(kù)對(duì)象:
(
表
索引
視圖:其實(shí)是虛表,是查詢表產(chǎn)生的
圖表:是表之間的關(guān)系示意圖
確省值:
規(guī)則:
觸發(fā)器:
存儲(chǔ)過(guò)程:
用戶:
)
范式:構(gòu)造數(shù)據(jù)庫(kù)必須遵守的規(guī)則,目前關(guān)系數(shù)據(jù)庫(kù)有6種范式,第一范式(1NF)....,一般需要滿足3NF
SQL(structured query language)結(jié)構(gòu)化查詢語(yǔ)言
9種語(yǔ)句
(
數(shù)據(jù)查詢:select
數(shù)據(jù)定義:create,drop(刪除),alter(修改)
數(shù)據(jù)操作:insert,update,delete
數(shù)據(jù)控制:grant,revoke
)
SQL語(yǔ)言分類:
(
數(shù)據(jù)定義語(yǔ)言(dll),用于定義數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)控制語(yǔ)言(dml),用于檢索和修改數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)控制語(yǔ)言(dcl),用于規(guī)定數(shù)據(jù)庫(kù)用戶的權(quán)限
數(shù)據(jù)庫(kù)事務(wù)處理,用來(lái)保證數(shù)據(jù)庫(kù)的完整性
)
常用dll語(yǔ)句:
(
create table
create index
drop table??? 刪除數(shù)據(jù)庫(kù)表
drop index
truncate????? 刪除表中所有的行
alter table?? 增加表列,重定義表列,更改存儲(chǔ)分配
alter table add constraint?? 在已有的表上增加約束
)
常用dml語(yǔ)句:
(
insert
delete
update
selete
)
常用dcl語(yǔ)句:
(
grant? 將權(quán)限或角色授予用戶或其他角色
revoke 從用戶或數(shù)據(jù)庫(kù)角色回收權(quán)限
set role? 禁止或允許角色
)
事務(wù)處理語(yǔ)句:
(
commit work? 把當(dāng)前事務(wù)所作的更改永久化
rollback???? 作廢上次提交以來(lái)的所有更改
)
數(shù)據(jù)表名稱 as 數(shù)據(jù)表別名,如果已經(jīng)給表定了別名,在T-SQL語(yǔ)句中應(yīng)引用別名,而不能用數(shù)據(jù)表名
select e.id,e.name from 用戶表 as e
select [all | distinct] [top n] selectlist [into[NewtAbleName]]? //distinct:無(wú)重復(fù)的,selectlist:可以是表達(dá)式
? from {TableName | ViewName,....}
where? conditions
[group by group_by_list]? // 分組?
[having conditions]?????? // 分組條件
[order by order_by_list [asc | desc]]
select cost*quantity as sum
select 數(shù)據(jù)表 join on (員工數(shù)據(jù)表.員工編號(hào)=項(xiàng)目數(shù)據(jù)表.負(fù)責(zé)人)???? //聯(lián)接條件
嵌套select:
select table1.a,tmptable.b
from table1,
(select table2.c,table2.d
from table2
where table2.id>2) as tmptable
where table1.id=tmptable.id
where:
比較:<,<=,>,>=,=,!=,!<,!>
范圍:between a and b , not between a and b
可選擇:in,not in
模式匹配:like,not like
是否空值:is null,is not null
邏輯:and,or,not
like通配符:
%? : like 'wang%'??? like '%yi'??
-? : like '_angyi'???
[]? :like '[a-z]angyi'
[~] :like '[~w]angyi'
in的用例:
select name
? from table
where id in ('4','20')
escape的用例:
select *
? from table
like 'wang#_yi' escape '#'
select id,count(*)
? from table
where wage>=6000
group by id
//group by 對(duì)查詢結(jié)果分組
select id,name
? from table
where level='2'
group by id,name???? //先按id分,在按name分
with cube??????????? //對(duì)group產(chǎn)生的組再按組統(tǒng)計(jì)
with rollup????????? //只返回第一個(gè)分組條件下的再按組統(tǒng)計(jì)
having 指定分組搜索條件,通常與group by一起用
having count(*)>1
select *
? from table
where col like '%50[%]%'? 返回包含50%的字符串
asc:升續(xù)
//compute計(jì)算? avg,sum,min,max,count (都會(huì)忽律null)
select id,wage
?? from table
order by 部門
compute sum(wage) by 部門
count(distinct 列名)
union
子查詢中一般不用Order by子句,Order by子句用于最終的結(jié)果
>all,<all,
<>all等價(jià)于not in
>some,<some
=some 等價(jià)于in? <>some等價(jià)于 not in
不要把If..exists和聚合函數(shù)一起使用
數(shù)據(jù)完整性:
實(shí)體完整性---表中數(shù)據(jù)的唯一性
區(qū)域完整性---字段數(shù)據(jù)范圍的完整性
參考完整性----表與表之間關(guān)聯(lián)的完整性
使用者定義的完整性----用戶自己定義的完整性。如:客戶欠6個(gè)月的錢,下次再下定單的時(shí)候就不賣給他。
數(shù)據(jù)庫(kù)分離:使用SQL語(yǔ)句分離為EXEC sp_detach_db ‘銷售數(shù)據(jù)庫(kù)’?指明欲分離的數(shù)據(jù)庫(kù)名稱即可。分離后想再用該數(shù)據(jù)庫(kù),則需要附加該數(shù)據(jù)庫(kù),具體SQL語(yǔ)句為:
CREATE? DATABASE 銷售數(shù)據(jù)庫(kù) ON PRIMARY(FILENAME=’C:\SQLTEST\銷售數(shù)據(jù)文件_1。MDF’)
FOR? ATTACH 或者使用sp_attach_db系統(tǒng)存儲(chǔ)過(guò)程來(lái)附加數(shù)據(jù)庫(kù):
sp_attach_db? 銷售數(shù)據(jù)庫(kù)
‘C:\SQLTEST\銷售數(shù)據(jù)文件_1.MDF’
?UNIQUE 和Primary key的差異
1、? UNIQUE允許輸入NULL值(最多為一個(gè)),而Primary key不允許;
2、? 一個(gè)數(shù)據(jù)表中可以定義多個(gè)UNIQUE條件約束,但只能定義一個(gè)Primary key條件約束。
CHECK約束可用來(lái)限制字段值是否在所允許的范圍內(nèi),例如:
CREATE TABLE 客戶02
(
客戶編號(hào) int IDENTITY? NULL? UNIQUE,
身份證號(hào) char[10] NOT NULL? UNIQUE,
年齡? int? CHECK (年齡>0) DEFAULT 2
)
建立計(jì)算列:
CREATE TABLE 估價(jià)
(
編號(hào)? int? IDENTITY,?????????????? //自動(dòng)編號(hào)
單價(jià)? numeric(5,1),
數(shù)量? int,
總價(jià)? AS 單價(jià)*數(shù)量
)
insert 估價(jià) values(21.5,8)
insert 估價(jià) values(12,3)
delete from 估價(jià) where 編號(hào)=5 or 編號(hào)=6
drop table 估價(jià)
創(chuàng)建約束字段:
Create table 客戶
{
客戶編號(hào)? int? IDENTITY? Primary Key,------------------------IDENTITY自動(dòng)產(chǎn)生編號(hào)
身份證號(hào)? char 18? NOT NULL UNIQUE,
地址????? char(50),
電話????? char (12),
雜志編號(hào)? int? REFERENCES 雜志種類(雜志編號(hào)),
訂單編號(hào)? int? NOT NULL,FOREIGN Key(雜志編號(hào),訂戶編號(hào))
REFERENCES? 雜志訂戶(雜志編號(hào),訂戶編號(hào)),
Check(地址 is NOT NULL? OR 電話? is? NOT NULL)
}
修改數(shù)據(jù)表:
ALTER TABLE 客戶A
ADD
類別編號(hào) int
DEFAULT 1 WITH VALUES
CONSTRAINT? FK_類型編號(hào)
FOREIGN KEY
REFERENCES? 客戶類別(類別編號(hào))
刪除約束字段:
ALTER TABAL訂購(gòu)項(xiàng)目A
DROP CONSTRAINT PK_訂購(gòu)項(xiàng)目A
下面刪除訂購(gòu)項(xiàng)目A的兩個(gè)字段
ALTER TABLE 訂購(gòu)項(xiàng)目A
DROP COLUMN 定單編號(hào),項(xiàng)目編號(hào)
激活/關(guān)閉約束
ALTER TABLE table
{ CHECK | NOCHECK} CONSTRAINT
{ALL | constrant_name{,…….n}}
臨時(shí)數(shù)據(jù)表以#或##開(kāi)頭,用戶斷開(kāi)連接后表被自動(dòng)刪除
數(shù)據(jù)表中字段的種類:
Primary key,? Foreign Key,? NULL,? NOT NULL,? DEFAULT,? UNIQUE,? CHECK
用查詢結(jié)果建立新數(shù)據(jù)表
Select * into? newtablename? from table_source where 條件
重復(fù)記錄采用DISTINCT來(lái)獲取單獨(dú)的數(shù)據(jù)。
TOP? N 為顯示前N個(gè)數(shù)據(jù),TOP? N? 30? PERSENT * FROM 表名
表示顯示N的前30%的數(shù)據(jù)
?ORDER BY 按什么方式排序顯示結(jié)果,ASC升DESC降
?JOIN :SELECT? A,B,C? FROM? T1? JOIN? T2? ON? T1.NO=T2.NO
JOIN 的類型有多種:INNER(默認(rèn))LEFT(以左邊為條件,如果右邊沒(méi)有符合的條件,則以NULL)
??????? SELECT 旗.產(chǎn)品名稱AS旗旗公司產(chǎn)品名稱,旗.價(jià)格,標(biāo).成品名稱AS標(biāo)標(biāo)公司產(chǎn)品名稱,標(biāo).價(jià)格 FROM 旗旗公司 AS 旗 LEFT JOIN 標(biāo)標(biāo)公司AS標(biāo) ON旗.產(chǎn)品名稱=標(biāo)產(chǎn)品名稱 RIGHT(以右邊為條件,如果左邊沒(méi)有符合的條件,則以NULL)FULL(左邊右邊都顯示,如果沒(méi)有則以NULL) CROSS(將兩個(gè)表的數(shù)據(jù)進(jìn)行比較,全部顯示出來(lái))
有時(shí)需要自己JOIN自己
SELECT 員工.姓名,員工.職位,長(zhǎng)官.姓名AS主管
FROM 員工 LEFT JOIN 員工AS 長(zhǎng)官
ON 員工.主管編號(hào)=主管.編號(hào) 姓名 職位 主管
?1
?a
?b
?c
?2
?d?
e?
NULL
GROUP BY 按什么分組顯示
UNION把兩個(gè)查詢結(jié)果合并到一個(gè)表中顯示出來(lái)查詢時(shí)Group的使用,?
Select name? AS名稱,Sum(Quantity)數(shù)量? Form? table? Group? By? name
GROUP BY后面如果有WITH CUBE則把各個(gè)組進(jìn)行匯總計(jì)算后顯示結(jié)果?
查詢:select name? AS出版社名稱,bookname AS 書(shū)名,sum(quantity) AS 數(shù)量 from table group by name,bookname with cube
查詢時(shí)改變要顯示的數(shù)據(jù):(1代表“男”,0代表“女”)要求查詢時(shí)如果是1則顯示“男”,否則顯示“女”
Select name? AS 姓名,case? sex? when? 0? then “女” else? “男”? End? AS 性別? From? table
?比較清單有:IN,ALL,ANY(SOME)結(jié)果為TRUE或FALSE
測(cè)試存在用EXISTS結(jié)果返回TRUE,F(xiàn)ALSE
?索引分為聚集索引和非聚集索引
聚焦索引數(shù)據(jù)的存放會(huì)依照該索引的順序來(lái)存放
非聚焦索引數(shù)據(jù)的存放不會(huì)依照索引的順序來(lái)存放
因?yàn)榉蔷劢顾饕挥绊憯?shù)據(jù)排列順序,則可以設(shè)置多個(gè)非聚焦索引,而聚焦索引則最多只能設(shè)置一個(gè),因?yàn)閷?shí)際數(shù)據(jù)只能有一種排列順序。
(Unique index)索引值是否唯一:如果索引值為唯一,則成為唯一索引
多個(gè)字段做為索引稱為復(fù)合索引(Composite index)
Create? [UNIQUE]? -----指定唯一
CREATE? TABLE? t
(
ProductID? smallint? not null? primary key,
ProductName?? char(30),
Price?? smallmoney,
Manufacturer?? char(30)
)?????????
//創(chuàng)建索引
CREATE??UNIQUE???NONCLUSTERED????INDEX????indexname
ON???t?(Price?? DESC)
WITH???? PAD_INDEX, FILLFACTOR=30,IGNORE_DUP_KEY
//刪除索引
DROP? INDEX?? table.index_name
//修改索引
使用DROP_EXISTING修改索引,如果要修改索引,只要在CREATE??? INDEX語(yǔ)句的最后加上DROP_EXISTING即可(如果存在該索引,則修改之,否則會(huì)發(fā)生錯(cuò)誤)
使用DBCC? DBREINDEX重建索引
如果只想重建索引(而不修改索引的相關(guān)設(shè)置),那么使用DBCC? DBREINDEX語(yǔ)句比較方便,而且使用時(shí)也可指定重建的填充因子。
DBCC DBREINDEX(’database_name.owner.table_name’,? index_name,?? fillfactor)數(shù)據(jù)庫(kù)? 數(shù)據(jù)庫(kù)所有者 表名? 重建的索引名 設(shè)置新的填充因子[WITH? NO_INFOMSGS]?? -------有此項(xiàng),則重建索引不會(huì)顯示出信息
?存儲(chǔ)過(guò)程
系統(tǒng)存儲(chǔ)過(guò)程都是以 sp_開(kāi)頭
擴(kuò)展存儲(chǔ)過(guò)程通常以xp_開(kāi)頭
EXECUTE 執(zhí)行存儲(chǔ)過(guò)程或SQL字符串(EXEC)
EXEC? 存儲(chǔ)過(guò)程名?? 參數(shù)1?? 參數(shù)2?? 參數(shù)3……
?變量的聲明:
DECLARE? @A? int -------------- 生命了一個(gè)為int 類型的A 變量。
建立存儲(chǔ)過(guò)程
使用CREATE? PROC或者CREATE? PROCEDURE + 過(guò)程名 + AS +SQL語(yǔ)句
CREATE? PROC? MyProcl
AS? SELECT * FROM 標(biāo)標(biāo)公司? WHERE 價(jià)格 >5
GO
EXEC MyProcl
EXEC? lookup? ‘楊小雄’,@地址 OUTPUT---OUTPUT表示參數(shù)的值是可以返回的
一個(gè)存儲(chǔ)過(guò)程為一個(gè)批,因此在查詢分析器中遇到GO時(shí),表示存儲(chǔ)過(guò)程的定義已結(jié)束.在存儲(chǔ)過(guò)程中,有些創(chuàng)建對(duì)象的語(yǔ)句不可使用
CREATE? DEFAULT?????? CREATE? TRIGGER
CREATE? PROCEDURE??? CREATE? VIEW
CREATE? RULE
臨時(shí)存儲(chǔ)過(guò)程分為局部和全局
局部要以#開(kāi)頭
全局要以##開(kāi)頭
修改存儲(chǔ)過(guò)程ALTER PROC
刪除存儲(chǔ)過(guò)程DROP PROC
建立函數(shù)CREATE? FUNCTION????????????????????
修改函數(shù)?ALTER? FUNCTION?????????????
刪除函數(shù)DROP? FUNCTION
返回單個(gè)數(shù)據(jù)的函數(shù)和一般函數(shù)一樣
返回大量數(shù)據(jù)集的函數(shù)如下例:
CREATE FUNCTION 依售價(jià)查詢書(shū)籍
(@由 money,? @到money)
RETURNS TABLE
RETURN? (SELECT 書(shū)籍編號(hào),書(shū)籍名稱,單價(jià) FROM 書(shū)籍 WHERE 單價(jià)>=@由AND單價(jià)<=@到)
GO
SELECT * FROM依售價(jià)查詢書(shū)籍(400,500)
ORDER? BY? 單價(jià)
在調(diào)用系統(tǒng)內(nèi)置的函數(shù)時(shí),需要加上?? ::如:SELECT * FROM ::fn_helpcollations()在創(chuàng)建表時(shí)可以使用這些函數(shù)。
?函數(shù)分為確定性函數(shù)和非確定性函數(shù)
確定性函數(shù)為當(dāng)傳入的參數(shù)不變時(shí),返回值不變,而非確定性函數(shù)為傳入?yún)?shù)不變,但每次返回的值會(huì)改變(如:GETDATE()函數(shù))
?觸發(fā)器(Trigger)是一種與數(shù)據(jù)表緊密結(jié)合的存儲(chǔ)過(guò)程,當(dāng)該數(shù)據(jù)表有新建(INSERT)更改(UPDATE)或刪除(DELETE)事件發(fā)生時(shí),所設(shè)置的觸發(fā)器會(huì)自動(dòng)被執(zhí)行,以進(jìn)行數(shù)據(jù)完整性,或其他一些特殊的數(shù)據(jù)處理工作。
觸發(fā)器是針對(duì)單一數(shù)據(jù)表所撰寫(xiě)的特殊存儲(chǔ)過(guò)程。觸發(fā)器的種類與操作:觸發(fā)器分為2類
AFTER觸發(fā)器:這類觸發(fā)器要在數(shù)據(jù)已變動(dòng)完成之后(AFTER),才會(huì)被激活并進(jìn)行必要的善后處理或檢查。若發(fā)現(xiàn)錯(cuò)誤,則可用ROLLBACK? TRANSATION回滾全部數(shù)據(jù)。
INSTEAD? OF觸發(fā)器:INSTEAD? OF 是取代的意思,就是這類觸發(fā)器會(huì)取代原本要進(jìn)行的操作(例如新建或更改數(shù)據(jù)庫(kù)操作),因此會(huì)在數(shù)據(jù)變動(dòng)前就發(fā)生,而且數(shù)據(jù)要如何變動(dòng)也完全取決于觸發(fā)器。(該觸發(fā)器能應(yīng)用與數(shù)據(jù)表與視圖)
建立觸發(fā)器
CREATE? TRIGGER? trigger_name
ON? {table|view}
[with? encryption]??????? ------加密
{FOR|AFTER|INSTEAD OF}? ------FOR和AFITER都是要等到數(shù)據(jù)完全操作完后才激活觸發(fā)器,INSTEAD OF則表示要建立INSTEAD OF觸發(fā)器,此時(shí)觸發(fā)器將取代原來(lái)要執(zhí)行的數(shù)據(jù)操作。
{[DELETE][,][INSERT][,][UPDATE]}-----指定觸發(fā)器的觸發(fā)操作,必須指定一個(gè),多個(gè)時(shí)以逗號(hào)隔開(kāi),在同一數(shù)據(jù)表中,AFTER觸發(fā)器數(shù)目沒(méi)有限制;但對(duì)INSTEAD OF 觸發(fā)器來(lái)說(shuō)則限制DELETE、INSERT、UPDATE每項(xiàng)最多只能有一個(gè)。
AS
Sql_statements??? ------用來(lái)定義觸發(fā)器的內(nèi)容。
例如:下面對(duì)一個(gè)表建立2個(gè)觸發(fā)器:
CREATE? TRIGGER? 訂單修改通知
ON? 訂單
AFTER? INSERT ,UPDATE
AS
PRINT? ‘又有訂單被修改了!’
GO
CREATE TRGGER 訂單刪除通知
ON? 訂單
AFTER? DELETE
AS
PRINT? ‘又有訂單被刪除了!’
GO
INSERT 訂單(日期,客戶編號(hào))
Values(‘2000/1/1’,3)
Delete訂單
Where 日期=‘2000/1/1’
?刪除觸發(fā)器:DROP? TRIGGER? trigger_name
?事務(wù)通常是由BEGIN? TRAN 語(yǔ)句開(kāi)始,一直執(zhí)行到COMMIT? TRAN或ROLLBACK? TRAN語(yǔ)句時(shí)才結(jié)束。
當(dāng)執(zhí)行完事務(wù)中的最后一項(xiàng)數(shù)據(jù)庫(kù)的操作后,若沒(méi)有任何錯(cuò)誤,我們可以用COMMIT TRAN提交事務(wù)。反之,若發(fā)現(xiàn)在事務(wù)中有任何的錯(cuò)誤,則執(zhí)行ROLLBACK? TRAN取消事務(wù),并回滾至事務(wù)執(zhí)行前的狀態(tài)。
每執(zhí)行完一項(xiàng)數(shù)據(jù)庫(kù)的操作后,要立即檢查@@ERROR和@@ROWCOUNT,否則再執(zhí)行下一項(xiàng)數(shù)據(jù)庫(kù)操作時(shí),這2個(gè)系統(tǒng)變量將會(huì)被新的值代替。在更改或刪除數(shù)據(jù)時(shí),若因指定條件不符或其他原因而沒(méi)有更改到任何一條記錄,由于這種情況并不是錯(cuò)誤(@@ERROR仍為0),因此我們還要檢查@@ROWCOUNT的更改條數(shù),以確定數(shù)據(jù)已正確更改。
?無(wú)論是COMMIT TRAN還是ROLLBACK TRAN而結(jié)束的事務(wù)后,如果后面還有其他未執(zhí)行的語(yǔ)句,則還會(huì)繼續(xù)執(zhí)行這些語(yǔ)句,直到批結(jié)束。不過(guò)已COMMIT的事務(wù)就無(wú)法再ROLLBACK了,同理,已ROLLBACK的事務(wù)也無(wú)法再COMMIT了。
?在事務(wù)中,把事務(wù)中所有的語(yǔ)句看成是一個(gè)數(shù)據(jù)處理單元,因此單元必須全部做完或全部不做。
?事務(wù)的4大特性:
1,? 原子性:整個(gè)事務(wù)被看成一個(gè)執(zhí)行單元,要么全部成功,要么全部取消。
2,? 一致性:當(dāng)事務(wù)完成后,數(shù)據(jù)庫(kù)的內(nèi)容必須全部更新妥當(dāng),而且仍然具備正確性及完整性。
3,? 隔離性:在事務(wù)中所使用到的數(shù)據(jù),必須與其他同時(shí)在進(jìn)行的事務(wù)適度隔離(使用鎖定數(shù)據(jù)的方法來(lái)隔離事務(wù))
4,? 永久性:事務(wù)一旦提交后,其所作的數(shù)據(jù)修改將被視為永久性的,無(wú)法再用ROLLBACK回滾了。
事務(wù)是以連接為單位,每個(gè)連接都可以有自己的事務(wù)。
事務(wù)的執(zhí)行有3種模式:
1,? 外顯事務(wù)2,? 自動(dòng)提交事務(wù)3,? 隱含事務(wù)
嵌套事務(wù)是以最外層的事務(wù)為提交或回滾對(duì)象的。
雖然嵌套事務(wù)是以最外層為提交對(duì)象的,但其中的每個(gè)事務(wù)都有自己的BEGIN TRAN 和COMMIT
其實(shí)事務(wù)是為存儲(chǔ)過(guò)程而設(shè)計(jì)的,因?yàn)檫@樣我們就可以在存儲(chǔ)過(guò)程中撰寫(xiě)事務(wù)程序,而不用擔(dān)心該程序被調(diào)用時(shí)是否已在另一個(gè)事務(wù)之中。
?@@TRANCOUNT事務(wù)計(jì)數(shù)
無(wú)論是那里調(diào)用ROLLBACK,都會(huì)跳轉(zhuǎn)到最外層的BEGIN TRAN處,@@TRANCOUNT都會(huì)變?yōu)?。‘
有時(shí)在事務(wù)中發(fā)生錯(cuò)誤時(shí),我們希望只要回滾一小部分就可以了
則用SAVE TRANSACTION來(lái)設(shè)置“事務(wù)保存點(diǎn)”,然后在必要時(shí)使用ROLLBACK來(lái)回滾到所保存的位置,而不會(huì)中斷事務(wù)。
ROLLBACK 后的事務(wù)名稱只能是由SAVATRAN或最外層的BEGIN TRAN所聲明的事務(wù)名稱。
游標(biāo)的狀態(tài):
1
?Cursor已打開(kāi),其內(nèi)有0,1或多條記錄
?0
?Cursor已打開(kāi),但確定其內(nèi)沒(méi)有查詢到任何一條信息記錄
?-1
?Cursor已關(guān)閉
?-2
?Cursor變量名未參照到時(shí)間Cursor或參照的Cursor已被DeAllocale
?-3
?指定的游標(biāo)變量名不存在
?
Cursor主要是使用于SQL批、存儲(chǔ)過(guò)程和出發(fā)器中。
游標(biāo)的格式:
DECLARE? 游標(biāo)名? CURSOR? -------聲明游標(biāo)
FOR? SELECT 姓名? FROM 通訊薄? WHERE 地址=臺(tái)北??? -------------游標(biāo)的數(shù)據(jù)來(lái)源
OPEN 游標(biāo)名?? -----------打開(kāi)游標(biāo)
DECLARE? @name? varchar(20)
FETCH? NEXT? FROM? 游標(biāo)名???? ------------將第一條數(shù)據(jù)存入@name
INTO? @name
WHILE(@@FETCH_STATUS=0)????? -------------判斷是否讀到數(shù)據(jù),0表示讀到數(shù)據(jù)
BEGIN
???FETCH? NEXT? FROM 游標(biāo)名
?? INTO? @name
END
CLOSE? 游標(biāo)名?? ----------------關(guān)閉游標(biāo)與數(shù)據(jù)的關(guān)聯(lián)
DEALLOCATE? 游標(biāo)名? ---------------將游標(biāo)對(duì)象刪除
除了Cursor中FETCH數(shù)據(jù)外,可以通過(guò)Cursor來(lái)UPDATE或DELETE一條目前所指定的記錄
UPDATE 標(biāo)標(biāo)公司?? SET 價(jià)格=100? WHERE CURRENT? OF? 游標(biāo)名
DELETE 標(biāo)標(biāo)公司?? WHERE CURRENT? OF? 游標(biāo)名
范例:
DECLARE? MyCursor? CURSORLOCAL?? SCROLL_LOCKS
FOR? SELECT 價(jià)格FROM? 標(biāo)標(biāo)公司
FOR? UPDATE
OPEN? MyCursor
DECLARE? @money?? money
FETCH? MyCursor? INTO @money
WHILE(@@FETCH_STATUS=0)
BEGIN
????IF? @money<=10
??????BEGIN
?????????SET @money=money*1.1
???????????????UPDATE? 標(biāo)標(biāo)公司
???????????????SET 價(jià)格=@money?????????????? -----------------更新價(jià)格信息
???????????????WHERE?? CURRENT OF MyCursor
???????END
FETCH? MyCursor? INTO @money
END
游標(biāo)變量,使用SET將已經(jīng)聲明好的游標(biāo)給游標(biāo)變量。在使用上,游標(biāo)變量和游標(biāo)是一樣使用的
全局游標(biāo)和本地游標(biāo)有相同的變量時(shí),以本地游標(biāo)為優(yōu)先調(diào)用
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?


