來源:YEN_CSDN 發(fā)布時間:2019-03-28 14:43:17 閱讀量:1534
首先,當(dāng)然得記住一些常用的詞匯啊?。?!下面就把會出現(xiàn)的詞匯都大概的總結(jié)出來,方便查看,省得滿文章的去找(英語好的就自行跳過吧!)。當(dāng)然,不是純純的單詞翻譯,后面跟的文字可能是翻譯也可能是他用到的地方。
-DBCC ShrinkDataBase :收縮數(shù)據(jù)庫
- Constraint :約束 (數(shù)據(jù)完整性約束條件定義時用到)
- Primary Key :主鍵約束
- Unique :唯一性約束
- Clustered | Nonclustered :聚集索引或非聚集索引
- Check: 檢查約束
- Default :默認(rèn)約束
- Foreign Key:外鍵約束
- On update Cascade On deleteCascade :外鍵約束中的級聯(lián)更新和刪除
- SQL: Structured Query Language 結(jié)構(gòu)化查詢語言
- Having :篩選組
- Exists:存在
- Union:聯(lián)合
- Truncate Table :清空表(不記錄日志操作,無法恢復(fù))
- Begin Transaction :事務(wù)開始
- Commit Transaction :事務(wù)結(jié)束,執(zhí)行過程成功
- Rollback Transaction: 事務(wù)回滾,執(zhí)行過程出錯
- Set Implicit_Transactions On:隱式事務(wù)開始
- Set Implicit_Transactions Off:隱式事務(wù)關(guān)閉
- @@Trancount:檢測連接事務(wù)處理嵌套的層數(shù)
- Sysobjects:主要記錄新表的基本信息
- Syscolumns :主要記錄新表的列信息
- Sysindexes:主要記錄指向新表鎖使用的存儲空間和主鍵等信息。
- excute:執(zhí)行
- @@fetch_status:取得最后一次游標(biāo)數(shù)據(jù)提取操作結(jié)果狀態(tài),0表示成功,-1表示失敗,-2表示要取得行不在記錄集內(nèi),已從集合中刪除。
- PROCEDURE:存儲過程
數(shù)據(jù)庫基礎(chǔ)和設(shè)計
數(shù)據(jù)庫系統(tǒng)包括數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫的用戶和支撐數(shù)據(jù)庫管理系統(tǒng)運行的軟硬件。
數(shù)據(jù)庫五個常用的對象是:表、存儲、視圖、觸發(fā)器、索引。
數(shù)據(jù)庫對象的三種關(guān)系:一對一、一對多、多對多。
信息是有用的數(shù)據(jù),數(shù)據(jù)是信息的表現(xiàn)形式。信息的特點是:無限性、共享性、創(chuàng)造性。
模式是數(shù)據(jù)庫中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述。數(shù)據(jù)庫的三級模式:內(nèi)模式(物理層)、概念模式(邏輯層)、外模式(用戶層)。
數(shù)據(jù)庫系統(tǒng)的用戶結(jié)構(gòu):單用戶結(jié)構(gòu)、主從式結(jié)構(gòu)、客戶-服務(wù)器模式結(jié)構(gòu)和分布式結(jié)構(gòu)。
第一范式:在一個關(guān)系中消除重復(fù)的字段,且每個字段都是最小的邏輯存儲單位。
第二范式:所有非主鍵字段完全依賴于主鍵,不存在非主鍵字段部分依賴主鍵。
第三范式:去除傳遞依賴(不要包含可以通過計算得到或推導(dǎo)得到的字段)。
數(shù)據(jù)庫結(jié)構(gòu)和管理
主數(shù)據(jù)文件(.mdf):數(shù)據(jù)庫的起點,可以指向數(shù)據(jù)庫中文件的其他部分。
次數(shù)據(jù)庫文件(.ndf)
事務(wù)日志文件(.ldf):包含恢復(fù)數(shù)據(jù)庫所需的所有日志信息。
收縮數(shù)據(jù)庫 DBCC SHRINKDATABASE(數(shù)據(jù)庫名稱,收縮后的大小)
表的存儲原理及完整性創(chuàng)建管理
數(shù)據(jù)類型:
數(shù)值型:BIGINT , INT , SMALLINT , TINYINT , DECIMAL和NUMERIC , FLOAT 和 REAL
貨幣型:MONEY , SMALLMONEY
字符型:CHAR , VARCHAR , TEXT
日期時間類型:DATETIME , SMALLDATETIME
完整性約束條件
空值約束 : null | not null
主鍵約束:Constraint PK_課程表_課號 PRIMARY KEY (課號)
唯一性約束:Constraint 約束名 unique [ clustered | nonclustered] (列名)
檢查約束:Constraint CK_課程表_課號 check(課號 like ‘s[0-9][0-9][0-9][0-9]’)
默認(rèn)約束:性別 char(2) Default ‘男’
外部鍵約束:Constraint FK_開課表_課號 Foreign Key (課號) References 課程表(課號) on update cascade on delete cascade(包含了級聯(lián)刪除和修改)
修改表結(jié)構(gòu):ALETR 跟屬性列有關(guān)的約束和索引刪除后,指定的屬性才能刪除。
使用DROP Table 語句不能刪除系統(tǒng)表和被Foreign Key 約束所參照的用戶表,必須先刪除引用的外鍵約束或引用的表。
~~~感覺分不清哪張表可以刪除,哪張不可以了????下面就用例子說明吧,如下所示:創(chuàng)建了兩張表,mainTB和foreignTB,foreignTB中的學(xué)校字段受外鍵約束,此時我們不能刪除mainTB,而foreignTB是可以直接刪除的,當(dāng)然,如果刪除了foreignTB則mainTB也就可以刪除了!
查詢處理和表數(shù)據(jù)編輯
起別名:當(dāng)別名有空格時要加上”,eg: ‘new name’。
Distinct關(guān)鍵字作用的范圍是整個查詢列表,而不是單個的列,因此distinct要放在select后面。
涉及空值的查詢,要用exp is [not] null,而不能用”=“ 或者 ”!=“ 或者 ” <>“代替。
如果在select中用了計算列,并且要求按這個計算列進(jìn)行排序,則在order by子句中有三種方式表示:
??1.計算列的順序編號 2.計算列的表達(dá)式 3.計算列的別名
select 學(xué)號,成績,成績+10 as 新成績
from 學(xué)生表
order by 3 --第二種方式:計算列的順序編號
order by 成績 +10 --第二種方式:計算列的表達(dá)式
order by 新成績 --第三種方式:計算列的別名
分組查詢
??Group by 子句可以將查詢結(jié)果集按一列或多列取值相等的原則進(jìn)行分組。
--查詢個門課程的課程名級相應(yīng)的選課人數(shù)
select 開課號,count(學(xué)號) From 選課表 group by 開課號
group by 子句中的列名只能是From子句所列表的列名,而不能是別名。
select目標(biāo)列表達(dá)式所涉及的列必須滿足,要么在group by 子句中,要么在某個統(tǒng)計函數(shù)中。
--查詢學(xué)號前5位為"s0601"且選修了兩門以上課程的學(xué)生的學(xué)號
select 學(xué)號 from 選課表 where 學(xué)號 like 's0606%' group by 學(xué)號 having count(*) >=2
where 和 having的區(qū)別:
1.作用對象不同(where -> 表;having -> 組);
2.選擇條件的構(gòu)成有差異,where 條件不能直接包含統(tǒng)計函數(shù),而having條件所涉及的列必須要么在group by子句中,要么在某個統(tǒng)計函數(shù)中。
連接查詢
??普通連接
??join on 連接 (Inner join)
??外連接(左連接left outer join,右連接 right outer join,全連接 full outer join)
子查詢
?對子查詢結(jié)果集的檢查包括:
??檢查給定值是否在結(jié)果集中(用in連接子查詢和父查詢);
??檢查給定值和結(jié)果值中元素的大小比較(單值比較;多值比較);
??檢查結(jié)果集是否為空。
--查詢選修了開課計劃編號為010101的課程的學(xué)生姓名
select 姓名
from 學(xué)生表 as s
where exists (
select * from 選課表 as s
where e.學(xué)號=s.學(xué)號 and 開課號='010101'
)
--***** 這類查詢的特點:
--***** 1.子查詢的條件往往用到父查詢所涉及的表;
--***** 2.子查詢的select 子句一般寫成select * 即可,無需給出具體列名;
//獲取前8條記錄 desc降序 asc升序
select top 8 * from newsTab where type='通知通告' order by zhiding desc,id desc;
插入子查詢結(jié)果
??1.使用insert select 子句 要自己創(chuàng)建表
??2.使用select into 子句 系統(tǒng)自己創(chuàng)建表(當(dāng)目標(biāo)列是計算列時必須取別名)
刪除數(shù)據(jù)
??可以使用delete from 表名 或者 Truncate Table 語句來清空目標(biāo)表(比delete快 不記錄日志操作,他的刪除無法恢復(fù))
索引
索引是對數(shù)據(jù)庫中一個或多個列的值進(jìn)行排序的結(jié)構(gòu)。
作用:
??通過創(chuàng)建唯一索引,可以保證數(shù)據(jù)記錄的唯一性。
??可以大大加快數(shù)據(jù)檢索的速度。
??可以加速表與表之間的連接。
??使用order by子句和group by子句進(jìn)行檢索數(shù)據(jù)時,可以顯著減少查詢中分組和排序的時間。
??索引可以在檢索的過程中使用查詢優(yōu)化器,提高系統(tǒng)性能。
索引分類
??聚集索引:邏輯有序,物理也有序,一個表只能有1個;
??非聚集索引:邏輯有序,物理無序,一個表只能有249個;
索引的創(chuàng)建和刪除
--索引的創(chuàng)建
create [unique] [clustered|nonclustered]
index 索引名
on 數(shù)據(jù)表|視圖(字段 asc|desc)
--索引的刪除
drop index 表名.索引名
事務(wù)
事務(wù)的特性:原子性、一致性、隔離性、永久性。
事務(wù)時恢復(fù)和并發(fā)的基本單位。
事務(wù)并發(fā)的數(shù)據(jù)問題:丟失修改或被覆蓋、讀臟數(shù)據(jù)、不能重復(fù)讀、幻影讀。
事務(wù)分類:顯示事務(wù)、隱式事務(wù)、自動事務(wù)模式(SQL SERVER默認(rèn)的)。
顯示事務(wù):
begin transaction --語句開始
commit transaction / commit work --事務(wù)結(jié)束 執(zhí)行成功
rollback transaction / rollback work --事務(wù)結(jié)束 執(zhí)行失敗
隱式事務(wù)
所有的create語句,alert table ,所有的drop語句,Truncate table,grant,revork,insert,delete,update,select,open,fetch都會重新啟動一個事務(wù)。
set Implicit_Transactions on --隱式事務(wù)打開
set Implicit_Transactions off --隱式事務(wù)關(guān)閉
@@Trancount檢測連接事務(wù)處理嵌套的層數(shù)。
基本鎖
??共享鎖(S鎖):用于只讀操作,它允許多個事務(wù)對資源鎖定進(jìn)行讀取,但禁止其他事務(wù)對鎖定資源進(jìn)行修改。
??排它鎖(X鎖) :它鎖定的資源不能再被其他事務(wù)鎖定,所以其他事務(wù)不能讀取和修改。
Transact-SQL程序結(jié)構(gòu)
批是一組sql語句的集合,一個批以GO結(jié)束,使用批的基本規(guī)則:
??1.所有create語句應(yīng)該單獨做成一個批,不能再批中和其他sql語句一起使用。
??2.使用alter table修改表結(jié)構(gòu)以后, 不能再同一個批中使用新定義的列。
??3.excute語句為批中的第一個語句時,可以省略excute關(guān)鍵字。
?? 4.批命令GO與其他sql語句不能再用一行上。
轉(zhuǎn)換函數(shù)
??cast (<表達(dá)式> as <目標(biāo)數(shù)據(jù)類型> [(<長度>)])
??convert(<目標(biāo)數(shù)據(jù)類型> [(<長度>)],<表達(dá)式>[,style])
Case語句用法
CASE <輸入表達(dá)式>
When <當(dāng)表達(dá)式1> Then <結(jié)果表達(dá)式1>
When <當(dāng)表達(dá)式2> Then <結(jié)果表達(dá)式2>
................
When <當(dāng)表達(dá)式n> Then <結(jié)果表達(dá)式n>
{Else <結(jié)果表達(dá)式n+1>}
END
CASE
WHEN <條件表達(dá)式1> Then <結(jié)果表達(dá)式1>
WHEN <條件表達(dá)式2> Then <結(jié)果表達(dá)式2>
................
WHEN <條件表達(dá)式n> Then <結(jié)果表達(dá)式n>
{Else <結(jié)果表達(dá)式n+1>}
END
1
視圖規(guī)劃和操作
視圖對應(yīng)三級模式中的外模式,視圖中存儲著視圖的定義及其關(guān)聯(lián)的基本表的信息,而不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍然存放在導(dǎo)出視圖的基本表中,因此視圖有稱為虛擬表。
數(shù)據(jù)庫中使用視圖的主要優(yōu)點:
- 視圖能簡化用戶的操作;
- 視圖是用戶能以多角度看待同一數(shù)據(jù);
- 視圖為數(shù)據(jù)庫重構(gòu)提供了一定程度的邏輯獨立性;
- 視圖能夠?qū)C(jī)密數(shù)據(jù)提供安全保護(hù)。
--創(chuàng)建視圖的語法格式
create view view_name
as
select_statement --定義視圖的select子句
[with check option] --強(qiáng)制視圖上執(zhí)行的所有數(shù)據(jù)修改語句都必須符合由select_statement設(shè)置的準(zhǔn)則
with encryption --表示sql server加密包含create view 語句的文本系統(tǒng)表列,可防止將視圖作為sql server復(fù)制的一部分發(fā)布。
--創(chuàng)建視圖時,視圖的名字存在sysobjects表中,有關(guān)視圖所定義的列信息添加到syscolumns表中,而有關(guān)視圖相關(guān)性的信息存儲在
--sysdepends表中,另外,create view 語句的文本添加到syscomments表中。
eg:
USE 教學(xué)管理
IF exists (select table_name from information_schema.views where table_name='V_視圖名')
drop view V_視圖名
GO
CREATE view V_視圖名
WITH ENCPYPTION
AS
SELECT 課號,課名,教材
FROM 課程表
WHERE 所在院系='信息學(xué)院'
WITH CHECK OPTION
GO
--修改視圖
alert view view_name
as
select_statement
[with check option]
--使用alert view 更改當(dāng)前正在使用的視圖,sql server將為他提供一個排他架構(gòu)鎖。
--視圖重命名
exec sp_rename 'V_oldname','V_newname'
--刪除視圖
drop view view_name
當(dāng)視圖引用多個表時,無法用delete刪除數(shù)據(jù),若使用update,則應(yīng)當(dāng)與insert一樣,被更新的列必須屬于同一個表。
select_statement在選擇列表中沒有聚合函數(shù),也不包括top,group by,union或distinct子句。
select_statement列表中沒有派生列。
一個update或insert語句只能修改引用的一個基表中的數(shù)據(jù)。
當(dāng)視圖在from子句中只引用一個表時,delete語句才能引用可更新的視圖。
游標(biāo)
游標(biāo)提供了一種對從表中檢索出數(shù)據(jù)進(jìn)行操作的靈活手段,就本質(zhì)而言,有標(biāo)識實際上是一種包括多條數(shù)據(jù)記錄的記過集中每次提取一條記錄的機(jī)制。
sql server支持三種類型的游標(biāo):Transact-SQL 游標(biāo)、API服務(wù)器游標(biāo)、客戶游標(biāo)。
--游標(biāo)的申明
DECLARE <游標(biāo)名> cursor
[local|global]
[forward_only|scroll] --forward_only只進(jìn)游標(biāo),
[static|keyset|dynamic|fast_forwar] --static靜態(tài)游標(biāo),不能隨時反應(yīng)用戶的更改結(jié)果 dynamic動態(tài)游標(biāo),能隨時反應(yīng)用戶的更改結(jié)果
[read_only|scroll_locks|optimistic]
FOR <select 查詢>
eg:
declare 學(xué)生表_cur1 cursor
for select 學(xué)號,姓名
from 學(xué)生表 where 專業(yè)='計算機(jī)'
--打開游標(biāo)
open 游標(biāo)名
--讀取游標(biāo)數(shù)據(jù)
fetch [next | prior | first | last |absolute{n|@nvar} | relative {n|@nvar} from ] --next 返回結(jié)果集的第一行
--prior | first | last |absolute{n|@nvar} | relative {n|@nvar}只有定義了scroll選項才可以使用
游標(biāo)名
into @變量1,@變量2
--關(guān)閉游標(biāo)
close 游標(biāo)名
--close語句關(guān)閉游標(biāo),但不釋放游標(biāo)占用的數(shù)據(jù)結(jié)構(gòu),應(yīng)用程序可以再次執(zhí)行open打開和填充游標(biāo)
eg:
declare 學(xué)生表_cur1 cursor
for select 學(xué)號,姓名,所在院系
from 學(xué)生表
group by 學(xué)號
declare @snum char(5),
@sname char(10),
@sdepa char(10)
--打開游標(biāo)
open 學(xué)生表_cur1
--取游標(biāo)第一行數(shù)據(jù)
fetch next from 學(xué)生表_cur1 into @snum,@sname,@sdepa
--逐行顯示教師信息,并取下一行數(shù)據(jù)
while @@fetch_status = 0
BEGIN
select @snum,@sname,@sdepa
fetch next from 學(xué)生表_cur1
into @snum,@sname,@sdepa
END
--關(guān)閉游標(biāo),此時還可以重新打開
close 學(xué)生表_cur1
--釋放游標(biāo)
deallocate 學(xué)生表_cur1
go
游標(biāo)定位修改和刪除操作
--游標(biāo)定位修改和刪除操作
--語法格式:
--游標(biāo)定位修改update語句:
update 表名
set 子句
where current of 游標(biāo)名
--游標(biāo)定位刪除delete語句:
delete from 表名
set 子句
where current of 游標(biāo)名
--利用where current of進(jìn)行的修改或刪除只影響當(dāng)前行
--eg:首先查看學(xué)生表中的每一行,將學(xué)號="s060109"的記錄的移動電話改為13888320247,并將城市改為天津
declare @學(xué)號 char(6) ,@姓名 char(10),@電話 char(11),@籍貫 char(10)
declare stu_up_cur cursor
for
select 學(xué)號,姓名,電話,籍貫
from 學(xué)生表
for update of 電話,籍貫
open stu_up_cur cursor
fetch next from stu_up_cur cursor into @學(xué)號,@姓名,@電話,@籍貫
while @@fetch_status=0
begin
select @學(xué)號,@姓名,@電話,@籍貫
if @學(xué)號='s060109'
update 學(xué)生表 set 電話='13888320247',籍貫='天津'
where current of stu_up_cur cursor --利用where current of進(jìn)行的修改或刪除只影響當(dāng)前行
fetch next from stu_up_cur cursor into @學(xué)號,@姓名,@電話,@籍貫
end
close stu_up_cur cursor
deallocate stu_up_cur cursor
用戶自定義函數(shù)設(shè)計
用戶自定義函數(shù)分為三種類型:標(biāo)量類型函數(shù)(返回在returns子句中定義的類型的單個數(shù)據(jù)),內(nèi)嵌表值型函數(shù)(以表的類型返回一個返回值),多語句表值型函數(shù)(返回一個表)
不能在函數(shù)中進(jìn)行的操作有:對數(shù)據(jù)庫表的修改,對不在函數(shù)上的局部游標(biāo)進(jìn)行操作,發(fā)送電子郵件,嘗試修改目錄,以及生成返回至用戶的結(jié)果集。
--創(chuàng)建標(biāo)量值用戶自定義函數(shù)
--語法格式
create function function_name
return scalar_return_data_type
begin
function body
return scalar_expression
end
--eg:創(chuàng)建成績轉(zhuǎn)換標(biāo)量值函數(shù),實現(xiàn)百分制與優(yōu) 良 中 及格 不及格的轉(zhuǎn)化
use 教學(xué)管理
go
create function F_分?jǐn)?shù)等級(@成績 float)
return char(16)
as
begin
declare @等級 char(16)
select @等級= case
when @成績 is null then '還沒有參加考試'
when @成績<60 then '不及格'
................
end
return @等級
END
--調(diào)用方式
select 學(xué)號,DBO.F_分?jǐn)?shù)等級(成績) as '成績等級' from 學(xué)生表 where 學(xué)號='s060606'
--創(chuàng)建內(nèi)聯(lián)型用戶自定義函數(shù)
--語法格式
create function function_name
return table
begin
return select_stmt
end
--eg:創(chuàng)建內(nèi)聯(lián)型函數(shù),返回指定學(xué)院的學(xué)生信息
use 教學(xué)管理
go
create function F_學(xué)生信息(@院系 char(20))
return table
as
return(select 學(xué)號,性別 from 學(xué)生表 where 所在院系=@院系)
--調(diào)用方式
select * from DBO.F_學(xué)生信息('信息學(xué)院')
--創(chuàng)建多語句表值型函數(shù)
--語法格式
create function function_name
return @return_variable table
as
begin
function body
return
end
--eg:創(chuàng)建多語句表值型函數(shù),返回執(zhí)行教師某年的開課信息
use 教學(xué)管理
go
create function F_教師課表(@教師姓名 char(20),@開課學(xué)年 char(9))
return @教師課表 table(
課名 varchar(30),
開課地點 char(6),
已選人數(shù) int
)
as
begin
insert @教師課表
select 課名,開課地點,已選人數(shù)
from 教師表 T,開課表 O
where T.工號=O.工號
AND 開課學(xué)年=@開課學(xué)年
return
end
調(diào)用方式
select * from DBO.F_教師課表('張三','2015-2016')
使用alert Function 命令相當(dāng)于重建一個同名的函數(shù)
不能用alert Function更改函數(shù)的類型,也就是:標(biāo)量值函數(shù)、表值型函數(shù)、多語句函數(shù)不能相互轉(zhuǎn)化
刪除函數(shù):drop function function_name
存儲過程和用戶存儲過程的設(shè)計
存儲過程是一組完成特定功能的sql語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。
在sql server中存儲過程分為兩類:系統(tǒng)提供的存儲過程和用戶自定義的存儲過程。
系統(tǒng)過程主要存儲在master數(shù)據(jù)庫中并以sp_為前綴,系統(tǒng)存儲過程主要是從系統(tǒng)表中獲取信息,從而為系統(tǒng)管理員管理sql server提供支持。
用戶自定義存儲過程是由用戶創(chuàng)建并能完成某一個特定功能的存儲過程。
存儲過程的優(yōu)點:
存儲過程允許標(biāo)準(zhǔn)組建式編程。
存儲過程能實現(xiàn)較快的執(zhí)行速度。
存儲過程能減少網(wǎng)絡(luò)流量。
存儲過程可作為一種安全機(jī)制來充分利用。
自動完成需要預(yù)先執(zhí)行的任務(wù)。
存儲過程雖然既有參數(shù)又有返回值,但他與函數(shù)不同,存儲過程的返回值只是指明執(zhí)行是否成功,并且他不能像函數(shù)那樣直接被調(diào)用,在調(diào)用存儲過程名字前一定要有exec保留字。
存儲過程由三部分組成:
- 所有的輸入?yún)?shù)及傳給調(diào)用者的輸出參數(shù)。
- 執(zhí)行的針對數(shù)據(jù)庫的操作語句,包括調(diào)用其它存儲過程的語句。
- 返回給調(diào)用者的狀態(tài)值,以指明調(diào)用是成功還是失敗。
--創(chuàng)建一個帶參數(shù)的存儲過程,實現(xiàn)對指定的某一專業(yè)某門課程學(xué)生選課及成績的查詢。
use 教學(xué)管理
go
if exists (select * from sysobjects where name='p_學(xué)生選課信息' and type='p')
BEGIN
DROP PROCEDURE P_學(xué)生選課信息
END
GO
CREATE PROCEDURE P_學(xué)生選課信息(@專業(yè) char(20),@課名 char(20))
as
if @專業(yè) is null
begin
print '必須指定專業(yè)'
end
else
begin
select s.學(xué)號,姓名,專業(yè),所在院系,o.課號,o.課名,o.成績
from 學(xué)生表 as s,選課表 as E,開課表 as o,課程表 c
where 專業(yè)=@專業(yè) and 課名=@課名 and s.學(xué)號=e.學(xué)號 and e.開課號=o.開課號 and o.課號=c.課號
end
--執(zhí)行存儲過程
exec P_學(xué)生選課信息 '計算機(jī)','數(shù)據(jù)結(jié)構(gòu)'
修改存儲過程 alter
刪除存儲過程 drop procedure 存儲過程名
觸發(fā)器原理及使用
觸發(fā)器可以看成一類特殊的存儲過程,他在滿足某個特定條件時自動觸發(fā)執(zhí)行,觸發(fā)器是為表上的更新、插入、刪除操作定義的,也就是說,當(dāng)表上發(fā)生更新、插入和刪除操作時觸發(fā)器將執(zhí)行。
觸發(fā)器的主要作用就是能夠?qū)崿F(xiàn)主鍵和外鍵所不能保證的復(fù)雜的參照完整性和數(shù)據(jù)一致性。觸發(fā)器還有很多功能:
強(qiáng)化約束。
級聯(lián)運行。
存儲過程的調(diào)用。
觸發(fā)器的種類:
AFTER觸發(fā)器:該類型觸發(fā)器要求只有執(zhí)行完某一操作[INSERT | UPDATE | DELETE ],并處理過所有約束后,觸發(fā)器才能被觸發(fā),且只能在表上定義。
INSTEAD OF 觸發(fā)器:該類觸發(fā)器表示并不執(zhí)行所定義的操作[INSERT | UPDATE | DELETE ],而僅執(zhí)行觸發(fā)器本身。既可以在表上也可以在視圖上。
觸發(fā)器原理:
每個觸發(fā)器有兩個特殊的表:插入表和刪除表,分別為inserted 和 delete,有下列幾個特點:
這兩個表是邏輯表,并且這兩個表都是由系統(tǒng)管理的,存儲在內(nèi)存,不是存儲在數(shù)據(jù)庫中,因此不允許用戶直接對其修改。
這兩個表的結(jié)構(gòu)總是與被該觸發(fā)器作用的表有相同的表結(jié)構(gòu)。
這兩個表是動態(tài)駐留在內(nèi)存中,當(dāng)觸發(fā)器工作完成時,這兩個表也被刪除。
這兩個表是只讀的,且只在觸發(fā)器內(nèi)部可讀,即用戶不能向這兩個表寫入內(nèi)容,但可以在觸發(fā)器中引用表的數(shù)據(jù)。
插入表的功能:
一旦對該表執(zhí)行了插入操作,那么對該表插入的所有行來說,都有一個相應(yīng)的副本存放到插入表(inserted )中,即插入表存儲原表插入的新數(shù)據(jù)行。
刪除表的功能:
一旦對該表執(zhí)行了刪除操作,則將所有被刪除的行存放到刪除表(delete)中。
--insert觸發(fā)器
--在大學(xué)數(shù)據(jù)庫中,當(dāng)新的學(xué)生選課注冊信息添加到選課表中時,要對開課表中的人數(shù)進(jìn)行更新,且當(dāng)人數(shù)超過最多能容納的人數(shù)時,要提示選課人數(shù)已滿
USE 教學(xué)管理
GO
CREATE trigger T_選課表插入觸發(fā)
ON 選課表
FOR insert
AS
Begin
DECLARE @已選人數(shù) int,@限選人數(shù) int
select @已選人數(shù)=已選人數(shù)+1,@限選人數(shù)=限選人數(shù)
from 開課表 o,inserted i
where o.開課號=i.開課號
if(@已選人數(shù) > @限選人數(shù))
begin
print '選修人數(shù)已滿'
rollback transaction
end
update 開課表
set 已選人數(shù)=@已選人數(shù)
from 開課表 o,inserted i
where o.開課號=i.開課號
End
--update觸發(fā)器
--教師表里的工號和負(fù)責(zé)人必須有外鍵關(guān)聯(lián),當(dāng)負(fù)責(zé)人工號修改了,負(fù)責(zé)人內(nèi)容也要更著修改,使用觸發(fā)器實現(xiàn)當(dāng)某個負(fù)責(zé)人工號修改了,級聯(lián)修改負(fù)責(zé)人
use 教學(xué)管理
go
create trigger T_負(fù)責(zé)人工號變化
on 教師表
for update
AS
Begin
declare @old_工號 char(6),@new_工號 char(6)
select @old_工號=工號
from deleted
select @new_工號=i.工號
from inserted i
update 教師表
set 負(fù)責(zé)人=@new_工號
where 負(fù)責(zé)人=@old_工號
end
--delete觸發(fā)器
--當(dāng)某個學(xué)生退學(xué)時,須刪除該學(xué)生的基本數(shù)據(jù),并級聯(lián)刪除該學(xué)生的選課記錄。
use 教學(xué)管理
go
create trigger T_學(xué)生數(shù)據(jù)刪除
on 學(xué)生表
for delete
AS
Begin
delete from 選課表 from 選課表 e,deleted d
where e.學(xué)號=d.學(xué)號
end
--insert of觸發(fā)器
--當(dāng)刪除教師表的某個教師時,需要先查看開課表是否有該教師的代課情況,有則不能刪除,否則可以刪除。
use 教學(xué)管理
go
create trigger T_教師數(shù)據(jù)刪除
on 教師表
instead of delete
as
begin
declare @姓名 char(20)
select @姓名=姓名 from deleted
if exIsts(select * from 開課表 o,deleted d where o.工號=d.工號) print @姓名+'不能刪除'
else
begin
delete from 教師表 from 教師表 T ,deleted d where T.工號=d.工號
print @姓名+'刪除成功'
end
end