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