亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

數(shù)據(jù)庫基礎(chǔ)知識匯總

來源: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)更新和刪除

- SQLStructured 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 , DECIMALNUMERIC , 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)建了兩張表,mainTBforeignTB,foreignTB中的學(xué)校字段受外鍵約束,此時我們不能刪除mainTB,而foreignTB是可以直接刪除的,當(dāng)然,如果刪除了foreignTBmainTB也就可以刪除了!

 

查詢處理和表數(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,grantrevork,insertdelete,updateselect,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,uniondistinct子句。

select_statement列表中沒有派生列。

一個updateinsert語句只能修改引用的一個基表中的數(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


分享:
評論:
你還沒有登錄,請先