實(shí)用數(shù)據(jù)庫技術(shù)_第1頁
實(shí)用數(shù)據(jù)庫技術(shù)_第2頁
實(shí)用數(shù)據(jù)庫技術(shù)_第3頁
實(shí)用數(shù)據(jù)庫技術(shù)_第4頁
實(shí)用數(shù)據(jù)庫技術(shù)_第5頁
已閱讀5頁,還剩171頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)庫原理及應(yīng)用

第0章數(shù)據(jù)庫概述OICQ銀行存款和轉(zhuǎn)賬系統(tǒng)購書網(wǎng)站、圖書館系統(tǒng)、書店。超市(例如大福源超市)。財(cái)務(wù)管理系統(tǒng)等等0.1數(shù)據(jù)庫廣泛應(yīng)用Oracle公司的OracleIBM公司的DB2(收購了Informix)微軟公司的Access和SQLServer。Sybase公司的Sybase開源數(shù)據(jù)庫MySQL等。中國還沒有真正市場意義上的商業(yè)數(shù)據(jù)庫產(chǎn)品0.2主流數(shù)據(jù)庫產(chǎn)品第0章數(shù)據(jù)庫概述0.3學(xué)習(xí)數(shù)據(jù)庫的好處為開發(fā)打基礎(chǔ)。

有助于深入理解各種應(yīng)用系統(tǒng),以使自己在工作中有更出色的表現(xiàn)。在工作中使用數(shù)據(jù)庫,提高工作效率。

第0章數(shù)據(jù)庫概述0.4課程主要內(nèi)容基本概念:表、記錄、字段、關(guān)系模型、鍵、聯(lián)系、約束等。SQL語言:數(shù)據(jù)檢索、數(shù)據(jù)庫對(duì)象操縱等。*數(shù)據(jù)庫設(shè)計(jì):聯(lián)系圖、范式、設(shè)計(jì)過程。*存儲(chǔ)過程、觸發(fā)器、并發(fā)控制、事務(wù)等。SQLServer2000的基本操作。第0章數(shù)據(jù)庫概述0.5考查/考試模式建議開卷考試。建議學(xué)生完成書中練習(xí),尤其是完成練習(xí)中的進(jìn)銷存系統(tǒng)的完整數(shù)據(jù)庫設(shè)計(jì)。第0章數(shù)據(jù)庫概述1.1關(guān)系學(xué)號(hào)姓名性別出生年月日宿舍電話Email030101001李勇男1981-9-1028885692liyong@21030101002歐陽晨女1981-8-628885567liuchen@126.com030101003王敏女1981-5-3028885567wangming@21040102001歐小立男1982-1-228885692zhangli@126.com040102002歐小立男1979-7-1628885692chenhui@21第1章數(shù)據(jù)庫基礎(chǔ)1.2實(shí)體和屬性我們把需要研究的某類事物稱作實(shí)體,實(shí)體具有一些我們需要研究的特性,稱為屬性,具體的實(shí)體稱為實(shí)例。做書本練習(xí)1-2第1章數(shù)據(jù)庫基礎(chǔ)1.3表、行、列表記錄了實(shí)體的實(shí)例數(shù)據(jù)。我們?nèi)粘K褂玫亩S表,在數(shù)據(jù)庫的世界中,也稱作關(guān)系。嚴(yán)格意義上的關(guān)系具備以下特征:

(1)每一行記載了一個(gè)實(shí)例的數(shù)據(jù),稱為這個(gè)表的一條記錄,或者就叫一行。(2)每一列數(shù)據(jù)統(tǒng)稱為表的一個(gè)字段,或者就叫一列。(3)表中單元格存儲(chǔ)單個(gè)值。第1章數(shù)據(jù)庫基礎(chǔ)(4)每列的所有數(shù)據(jù)項(xiàng)類型一致,語義一致。(5)列的名稱不能重復(fù)。(6)列不能重名,否則不能區(qū)分一個(gè)表中的列。(7)列的順序無關(guān)緊要。1.3表、行、列第1章數(shù)據(jù)庫基礎(chǔ)比如,下表1-2雖然列的順序變了,但和表1-1是等價(jià)的。第1章數(shù)據(jù)庫基礎(chǔ)(7)行的順序無關(guān)緊要。(8)任意兩行互不重復(fù)。做書本練習(xí)1-31.3表、行、列第1章數(shù)據(jù)庫基礎(chǔ)1.4等價(jià)的幾套術(shù)語表(Table)行(Row)列(Column)文件(File)數(shù)據(jù)文件(DataFile)(注意,現(xiàn)在較少使用)記錄(Record)字段(Field)關(guān)系(Relation)元組(Tuple)屬性(Attribute)第1章數(shù)據(jù)庫基礎(chǔ)1.5鍵唯一鍵與非唯一鍵。鍵(key)是關(guān)系中用來標(biāo)識(shí)行的一列或多列。鍵可以是唯一的(uniqe)的,也可以是不唯一(nonunique)的。復(fù)合鍵:包含兩個(gè)或更多屬性的鍵被稱為復(fù)合鍵,(姓名,宿舍電話)就是一個(gè)復(fù)合鍵。第1章數(shù)據(jù)庫基礎(chǔ)主鍵與候選鍵在設(shè)計(jì)數(shù)據(jù)庫的時(shí)候,我們需要從這些唯一標(biāo)識(shí)符中選出一個(gè)作為主鍵(primarykey)。而因?yàn)槠渌ㄒ绘I都是主鍵的候選,所以它們就被稱為候選鍵。做書本練習(xí)1-5和練習(xí)1-6

1.5鍵第1章數(shù)據(jù)庫基礎(chǔ)為了表示關(guān)聯(lián),可以將一個(gè)關(guān)系的主鍵作為屬性放入另外一個(gè)關(guān)系中。此時(shí),第二個(gè)關(guān)系中的那些屬性就被稱為外鍵(foreign)。

外鍵的數(shù)據(jù)必須在主鍵中存在對(duì)應(yīng)項(xiàng)的的關(guān)聯(lián)規(guī)則,稱之為參照完整性。這種規(guī)則在一定程度上保證了選修表中的每一條記錄的正確性。

做書本練習(xí)1-81.6外鍵與參照完整性約束第1章數(shù)據(jù)庫基礎(chǔ)1.7表間聯(lián)系一對(duì)多聯(lián)系(表示為1:N,1:M等)第1章數(shù)據(jù)庫基礎(chǔ)多對(duì)多聯(lián)系(表示為:M:N)學(xué)號(hào)姓名性別出生年月日選修課程號(hào)030101001李勇男1981-9-10001,002030101002歐陽晨女1981-8-6001,002,003030101003王敏女1981-5-30課程號(hào)課程名學(xué)時(shí)學(xué)分001數(shù)據(jù)庫724002數(shù)學(xué)724003英語644004操作系統(tǒng)543學(xué)生表

課程表

多對(duì)多聯(lián)系的不方便性:當(dāng)某一門課不開設(shè)時(shí),要修改學(xué)生表中多條記錄1.7表間聯(lián)系第1章數(shù)據(jù)庫基礎(chǔ)修改成一對(duì)多的關(guān)系1.7表間聯(lián)系做書本練習(xí)1-10第1章數(shù)據(jù)庫基礎(chǔ)1.8關(guān)系數(shù)據(jù)庫系統(tǒng)以表來記錄數(shù)據(jù),通過字段實(shí)現(xiàn)表間聯(lián)系,這種組織數(shù)據(jù)的方式稱作關(guān)系模型。以關(guān)系模型組織數(shù)據(jù)的數(shù)據(jù)庫稱之為關(guān)系數(shù)據(jù)庫。用來創(chuàng)建、維護(hù)、修改和操縱關(guān)系數(shù)據(jù)庫的軟件系統(tǒng)稱之為關(guān)系數(shù)據(jù)庫系統(tǒng)(RDBMS)。第1章數(shù)據(jù)庫基礎(chǔ)數(shù)據(jù)庫系統(tǒng)流程圖:用戶操作應(yīng)用程序數(shù)據(jù)庫應(yīng)用程序數(shù)據(jù)庫管理系統(tǒng)數(shù)據(jù)庫創(chuàng)建庫表等并維護(hù)之創(chuàng)建并處理查詢執(zhí)行應(yīng)用邏輯控制應(yīng)用程序

創(chuàng)建庫表等并維護(hù)之讀寫數(shù)據(jù)并維護(hù)之強(qiáng)制規(guī)則并發(fā)性控制安全性支持備份與恢復(fù)

組織存儲(chǔ)數(shù)據(jù)

1.8關(guān)系數(shù)據(jù)庫系統(tǒng)第1章數(shù)據(jù)庫基礎(chǔ)1.9字段的類型和大小表由字段構(gòu)成,字段有名稱、大小、類型。1.整數(shù)bigintintsmallintTinyint2.bitbit第1章數(shù)據(jù)庫基礎(chǔ)3.decimal和numeric4.money和smallmoney5.浮點(diǎn)數(shù)floatReal6.datetime

和smalldatetime1.9字段的類型和大小第1章數(shù)據(jù)庫基礎(chǔ)7.字符串char。Varchar。Text8.Unicode字符串。ncharnvarcharntext1.9字段的類型和大小第1章數(shù)據(jù)庫基礎(chǔ)9.二進(jìn)制字符串binaryvarbinaryImage10.其它數(shù)據(jù)類型cursorsql_varianttabletimestampuniqueidentifier1.9字段的類型和大小第1章數(shù)據(jù)庫基礎(chǔ)字段的大小指字段的取值范圍。如果要算術(shù)運(yùn)算,則以數(shù)值型為宜,可根據(jù)實(shí)際情況選用整型、定點(diǎn)數(shù)或浮點(diǎn)數(shù),如身高、長度、個(gè)數(shù)、重量等。如果是日期或時(shí)間,則以日期時(shí)間型為宜,如出生年月日。如果只有兩種可能,則可用bit型,一種用0代表,一種用1代表,如婚否。如果可做模式匹配,則以字符型為宜,如地址、名稱、電話、郵編等。如果是大量的文本,可用text類型。如果是圖像,可用image。1.9字段的類型和大小第1章數(shù)據(jù)庫基礎(chǔ)空值學(xué)號(hào)課程號(hào)成績選修日期030101001001952004-2-10301010010042004-9-11.9字段的類型和大小第1章數(shù)據(jù)庫基礎(chǔ)空格及其他空白字符課程號(hào)課程名學(xué)時(shí)學(xué)分001數(shù)據(jù)庫724002數(shù)學(xué)7241.9字段的類型和大小英文大小寫、全角半角第1章數(shù)據(jù)庫基礎(chǔ)1.10排序與索引1.排序在數(shù)據(jù)庫中,常規(guī)的排序規(guī)則如下:數(shù)值:按值的大小進(jìn)行排序。英文字符:按英文碼表內(nèi)的編碼進(jìn)行,如ASCII。ASCII從小到大的順序:空格…0123456789…ABC…XYZ…abc…xyz中文字符:按中文碼表內(nèi)的編碼進(jìn)行。一般是按拼音的字典順序進(jìn)行。英文符號(hào)比中文小,中文符號(hào)比中文字小,而空值是最小的??赡茉跀?shù)據(jù)庫系統(tǒng)中,可指定別的排序規(guī)則。符串確定大小:逐個(gè)比較相應(yīng)位置的字符,先出現(xiàn)大字符的較大。不同類型的數(shù)據(jù)無法正確比較大小。做書本練習(xí)1-13~1-17

第1章數(shù)據(jù)庫基礎(chǔ)索引本質(zhì)上來說,是一種排序。在已排序中的表中查找,通常速度會(huì)更快。索引的目的,主要是為了加快數(shù)據(jù)的檢索定位。有時(shí),有索引和沒有索引,性能相差極遠(yuǎn),足以影響用戶的體驗(yàn)。但并不是在表中做越多索引越好,通常情況下,只有當(dāng)經(jīng)常查詢索引列中的數(shù)據(jù)時(shí),才需要在表上創(chuàng)建索引。1.10排序與索引第1章數(shù)據(jù)庫基礎(chǔ)1.10排序與索引第1章數(shù)據(jù)庫基礎(chǔ)1.11數(shù)據(jù)完整性與約束數(shù)據(jù)完整性數(shù)據(jù)完整性是指存儲(chǔ)在數(shù)據(jù)庫中的所有數(shù)據(jù)值均處于正確的狀態(tài)。所謂正確,是指符合設(shè)計(jì)的原意,符合指定的規(guī)則等。第1章數(shù)據(jù)庫基礎(chǔ)實(shí)體完整性保證主鍵字段的值唯一且不能為空域完整性要求每個(gè)字段的值都在該字段定義的取值范圍內(nèi)參照完整性保證外鍵字段的值預(yù)先存在于主鍵字段。1.11數(shù)據(jù)完整性與約束第1章數(shù)據(jù)庫基礎(chǔ)用戶自定義完整性。

滿足用戶自己定義的條件或規(guī)則,這常常和實(shí)際的業(yè)務(wù)邏輯息息相關(guān)。所謂約束,就是條件、規(guī)則之意。對(duì)于數(shù)據(jù)庫管理系統(tǒng)來說,約束就是保證數(shù)據(jù)完整性的機(jī)制。1.11數(shù)據(jù)完整性與約束第1章數(shù)據(jù)庫基礎(chǔ)1.11數(shù)據(jù)完整性與約束第1章數(shù)據(jù)庫基礎(chǔ)第2章結(jié)構(gòu)化查詢語言SQL本章重點(diǎn)定義、刪除與修改基本表;建立和刪除索引;定義、刪除與修改視圖;各種數(shù)據(jù)查詢方法;數(shù)據(jù)更新;數(shù)據(jù)控制。本章難點(diǎn)查詢條件的形式化表示;多表聯(lián)結(jié);嵌套查詢;數(shù)據(jù)控制。自學(xué)建議按順序閱讀并做練習(xí)。教學(xué)建議建議根據(jù)本章的結(jié)構(gòu),采用案例教學(xué),按照:舉例→語法→實(shí)例→練習(xí)的順序進(jìn)行講解;強(qiáng)調(diào)學(xué)生的實(shí)操能力,對(duì)于每個(gè)知識(shí)點(diǎn),讓學(xué)生在相關(guān)平臺(tái)上練習(xí)后直接把答案寫在教本上。2.1SQL概述SQL(StructuredQueryLanguage)稱為結(jié)構(gòu)化查詢語言,它專應(yīng)用于數(shù)據(jù)庫中對(duì)數(shù)據(jù)的各種操作,其功能包括查詢、操縱、定義和控制四個(gè)方面,是一個(gè)通用的功能極強(qiáng)的數(shù)據(jù)庫標(biāo)準(zhǔn)語言。第2章結(jié)構(gòu)化查詢語言SQL2.1SQL概述第2章結(jié)構(gòu)化查詢語言SQL2.2數(shù)據(jù)定義我們在建立數(shù)據(jù)庫之前必須先對(duì)數(shù)據(jù)表中各字段類型、大小、索引等有所定義,SQL的數(shù)據(jù)定義部分包括對(duì)基本表(即我們在第一章所講到的關(guān)系,Table)、索引(Index)、視圖(View,我們會(huì)在這一章里詳細(xì)講解)的創(chuàng)建和撤消操作。SQL對(duì)數(shù)據(jù)定義的語句十分簡易,第2章結(jié)構(gòu)化查詢語言SQL2.2數(shù)據(jù)定義第2章結(jié)構(gòu)化查詢語言SQL[例2-1]定義一個(gè)數(shù)據(jù)庫叫:學(xué)生選課與成績管理,該數(shù)據(jù)庫由數(shù)據(jù)文件和日志文件兩個(gè)文件組成,它們都存放在D盤上,數(shù)據(jù)文件大小為10MB,日志文件大小為5MB。CREATEDATABASE學(xué)生選課與成績管理ON(NAME=學(xué)生選課與成績管理_dat,FILENAME='d:\學(xué)生選課與成績管理.mdf',SIZE=10)LOGON(NAME='學(xué)生選課與成績管理_log',FILENAME='d:\學(xué)生選課與成績管理.ldf',SIZE=5)2.3定義數(shù)據(jù)庫第2章結(jié)構(gòu)化查詢語言SQL[例2-2]建立一個(gè)“學(xué)生”表,它由學(xué)號(hào)、姓名、班級(jí)、性別、出生年月日、電話、email、備注八個(gè)屬性組成。其中學(xué)號(hào)為主鍵。CREATETABLE學(xué)生(

學(xué)號(hào)CHAR(9)PRIMARYKEY,姓名NCHAR(5),班級(jí)CHAR(20),性別NCHAR(1),出生年月日SMALLDATETIME,

電話CHAR(11),EmailVARCHAR(30),

備注VARCHAR(100))2.4定義、刪除與修改基本表第2章結(jié)構(gòu)化查詢語言SQL[例2-5]將一個(gè)新學(xué)生記錄(學(xué)號(hào):050103001;姓名:陳冬偉;班級(jí):計(jì)算機(jī)軟件;性別:男;出生年月日:1983-4-18;電話:22894152;Email:cdwei@163.com;備注:轉(zhuǎn)校生)插入到學(xué)生表中。

INSERTINTO學(xué)生

VALUES(‘050103001’,‘陳冬偉’,‘計(jì)算機(jī)軟件’,‘男’,‘1983-4-18’,‘22894152’,‘cdwei@163.com’,‘轉(zhuǎn)校生’)2.4.1初始化基本表第2章結(jié)構(gòu)化查詢語言SQL[例2-6]

向“學(xué)生”表增加“入學(xué)時(shí)間”列,其數(shù)據(jù)類型為日期型。

ALTERTABLE學(xué)生ADD入學(xué)時(shí)間DATETIME2.4.2修改基本表第2章結(jié)構(gòu)化查詢語言SQL[例2-7]將例1中增加的“入學(xué)時(shí)間”列刪除。ALTERTABLE學(xué)生DROPCOLUMN入學(xué)時(shí)間做書本練習(xí)2-8~練習(xí)2-92.4.2修改基本表第2章結(jié)構(gòu)化查詢語言SQL2.4.3刪除基本表

有時(shí),由于某種業(yè)務(wù)的需要,我們不要某些表(這樣往往可以減輕系統(tǒng)的開支),就可以把這些表刪除。例如:刪除“學(xué)生”表。

DROPTABLE學(xué)生做書本練習(xí)2-10第2章結(jié)構(gòu)化查詢語言SQL為學(xué)生選課與成績管理數(shù)據(jù)庫中的課程表按課程名降序建立唯一索引。CREATEUNIQUEINDEXCcourseON課程(課程名DESC)做書本練習(xí)2-11~練習(xí)2-132.4.4建立與刪除索引第2章結(jié)構(gòu)化查詢語言SQL[例2-13]刪除學(xué)生表的stusname索引。

DROPINDEX學(xué)生.Stusname做書本練習(xí)2-142.4.4建立與刪除索引第2章結(jié)構(gòu)化查詢語言SQL2.5.1數(shù)據(jù)查詢2.5數(shù)據(jù)操縱[例2-15]查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名。SELECT學(xué)號(hào),姓名FROM學(xué)生第2章結(jié)構(gòu)化查詢語言SQL[例2-16]查詢?nèi)w學(xué)生的姓名,出生年月日,學(xué)號(hào)。

SELECT姓名,出生年月日,學(xué)號(hào)

FROM學(xué)生做書本練習(xí)2-15~練習(xí)2-172.5.1數(shù)據(jù)查詢第2章結(jié)構(gòu)化查詢語言SQL[例2-17]查詢?nèi)w學(xué)生的詳細(xì)記錄。SELECT*FROM學(xué)生做書本練習(xí)2-18~練習(xí)2-19

2.5.1數(shù)據(jù)查詢(1)查詢?nèi)苛衃例2-18]查詢?nèi)w學(xué)生的姓名及年齡。SELECT姓名,YEAR(GETDATE())-YEAR(出生年月日)as年齡FROM學(xué)生做書本練習(xí)2-20~練習(xí)2-22(2)查詢含有表達(dá)式的記錄第2章結(jié)構(gòu)化查詢語言SQL[例2-19]查詢選修表中選修了課程的學(xué)生學(xué)號(hào),要求去除重復(fù)的值。

SELECTDISTINCT學(xué)號(hào)

FROM選修做書本練習(xí)2-23~練習(xí)2-24(3)選擇表中的若干記錄

第2章結(jié)構(gòu)化查詢語言SQL[例2-20]查詢班級(jí)為計(jì)算機(jī)應(yīng)用學(xué)生的記錄。

SELECT*FROM學(xué)生

WHERE班級(jí)=‘計(jì)算機(jī)應(yīng)用’(3)選擇表中的若干記錄

第2章結(jié)構(gòu)化查詢語言SQL[例2-21]查詢選修表中選修成績不及格的學(xué)生的學(xué)號(hào)和成績。

SELECTDISTINCT學(xué)號(hào)

FROM選修

WHERE成績<60做書本練習(xí)2-25~練習(xí)2-27(3)選擇表中的若干記錄

第2章結(jié)構(gòu)化查詢語言SQL[例2-22]查詢學(xué)生表中在1981出生的學(xué)生的學(xué)號(hào),姓名和出生年月日。

SELECT學(xué)號(hào),姓名,出生年月日

FROM學(xué)生

WHERE出生年月日BETWEEN‘1981-1-1’AND‘1981-12-31’做書本練習(xí)2-28~練習(xí)2-29(4)確定范圍第2章結(jié)構(gòu)化查詢語言SQL[例2-24]查詢學(xué)生表中所在班級(jí)為“計(jì)算機(jī)應(yīng)用”或“計(jì)算機(jī)網(wǎng)絡(luò)”班的學(xué)生記錄。SELECT*FROM學(xué)生WHERE班級(jí)IN(‘計(jì)算機(jī)應(yīng)用’,‘計(jì)算機(jī)網(wǎng)絡(luò)’)練習(xí)2-30~練習(xí)2-31(5)確定集合第2章結(jié)構(gòu)化查詢語言SQL[例2-26]查詢所有電話號(hào)碼以“22”開頭的學(xué)生的姓名,學(xué)號(hào)和電話。

SELECT姓名,學(xué)號(hào),電話

FROM學(xué)生

WHERE電話LIKE‘22%’(6)字符匹配第2章結(jié)構(gòu)化查詢語言SQL[例2-28]查詢姓“歐陽”且全名為四個(gè)漢字的學(xué)生的名字。

SELECT姓名

FROM學(xué)生

WHERE姓名LIKE‘歐陽__’(6)字符匹配第2章結(jié)構(gòu)化查詢語言SQL[例2-29]查詢名字中第2個(gè)字為“陽”字的學(xué)生的姓名和學(xué)號(hào)。

SELECT姓名,學(xué)號(hào)

FROM學(xué)生

WHERE姓名LIKE‘_陽%’(6)字符匹配第2章結(jié)構(gòu)化查詢語言SQL[例2-30]查詢所有不姓劉的學(xué)生姓名。

SELECT姓名

FROM學(xué)生

WHERE姓名NOTLIKE‘劉%’做書本練習(xí)2-32~練習(xí)2-35(6)字符匹配第2章結(jié)構(gòu)化查詢語言SQL[例2-31]

某些學(xué)生由于特殊原因分配到某個(gè)班上課,一般都在學(xué)生表的備注信息欄里寫明,沒有特殊原因的學(xué)生備注欄為空,今查詢備注為空的學(xué)生學(xué)號(hào),姓名,備注。

SELECT學(xué)號(hào),姓名,備注

FROM學(xué)生

WHERE備注ISNULL做書本練習(xí)2-36~練習(xí)2-37(7)涉及空值的查詢第2章結(jié)構(gòu)化查詢語言SQL[例2-33]查詢課程表中學(xué)時(shí)大于60且學(xué)分大于3分的記錄。

SELECT*FROM課程

WHERE學(xué)時(shí)>60AND學(xué)分>3(8)多重條件查詢第2章結(jié)構(gòu)化查詢語言SQL[例2-35]查詢選修了001號(hào)課程的學(xué)生的學(xué)號(hào)及其成績,查詢結(jié)果按成績分?jǐn)?shù)的升序排列。

SELECT學(xué)號(hào),成績

FROM選修

WHERE課程號(hào)=‘001’ORDERBY成績2.5.2對(duì)查詢結(jié)果排序第2章結(jié)構(gòu)化查詢語言SQL[例2-36]查詢?nèi)w學(xué)生情況,查詢結(jié)果先按所在班級(jí)升序排列,同一班級(jí)中的學(xué)生按姓名降序排列。

SELECT*FROM學(xué)生

ORDERBY班級(jí),姓名DESC2.5.2對(duì)查詢結(jié)果排序第2章結(jié)構(gòu)化查詢語言SQL2.5.2使用聚集函數(shù)第2章結(jié)構(gòu)化查詢語言SQL[例2-37]查詢學(xué)生總?cè)藬?shù)。

SELECTCOUNT(*)AS總?cè)藬?shù)

FROM學(xué)生2.5.2使用聚集函數(shù)第2章結(jié)構(gòu)化查詢語言SQL[例2-38]查詢選修了課程的學(xué)生人數(shù)。SELECTCOUNT(DISTINCT學(xué)號(hào))as總?cè)藬?shù)FROM選修2.5.2使用聚集函數(shù)第2章結(jié)構(gòu)化查詢語言SQL[例2-39]計(jì)算001號(hào)課程的學(xué)生平均成績。

SELECTAVG(成績)as平均成績

FROM選修

WHERE課程號(hào)=‘001’2.5.2使用聚集函數(shù)第2章結(jié)構(gòu)化查詢語言SQL[例2-40]查詢選修001號(hào)課程的學(xué)生的最高分?jǐn)?shù)。

SELECTMAX(成績)AS最高分

FROM選修

WHERE課程號(hào)=‘001’2.5.2使用聚集函數(shù)第2章結(jié)構(gòu)化查詢語言SQL[例2-41]對(duì)選修表中的課程號(hào)分組求相應(yīng)的選課人數(shù)。

SELECT課程號(hào),COUNT(學(xué)號(hào))AS選課人數(shù)FROM選修GROUPBY課程號(hào)2.5.3對(duì)查詢結(jié)果分組第2章結(jié)構(gòu)化查詢語言SQL[例2-42]查詢選修了2門以上(包括2門)課程的學(xué)生學(xué)號(hào)和課程數(shù)。

SELECT學(xué)號(hào),COUNT(課程號(hào))as課程數(shù)

FROM選修

GROUPBY學(xué)號(hào)

HAVINGCOUNT(*)>=22.5.3對(duì)查詢結(jié)果分組第2章結(jié)構(gòu)化查詢語言SQL2.5.4連接查詢第2章結(jié)構(gòu)化查詢語言SQL(1)內(nèi)聯(lián)接第2章結(jié)構(gòu)化查詢語言SQL查詢選修了課程的學(xué)生SELECT學(xué)生.*,選修.*FROM學(xué)生INNERJOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)(1)內(nèi)聯(lián)接第2章結(jié)構(gòu)化查詢語言SQL(1)內(nèi)聯(lián)接第2章結(jié)構(gòu)化查詢語言SQL[例2-44]

對(duì)例4-43用自然連接完成。

SELECT學(xué)生.學(xué)號(hào),姓名,班級(jí),性別,出生年月日,電話,Email,備注,課程號(hào),成績,選修日期

FROM學(xué)生INNERJOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)(2)自然連接第2章結(jié)構(gòu)化查詢語言SQL1)使用左向外聯(lián)接[例2-46]查詢查詢各個(gè)學(xué)生的選修情況。SELECT學(xué)生.*,課程號(hào),成績,選修日期FROM學(xué)生LEFTJOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)(3)外聯(lián)接2)使用右向外聯(lián)接右向外聯(lián)接和左向外聯(lián)接原理一樣,只是使用RIGHTJOIN,不管第一個(gè)表中是否有匹配的數(shù)據(jù),結(jié)果將包含第二個(gè)表中的所有行。這里就不多講了,讀者可以通過查看聯(lián)機(jī)叢書進(jìn)一步了解。第2章結(jié)構(gòu)化查詢語言SQL3)使用完整外部聯(lián)接[例2-47]查詢查詢各個(gè)學(xué)生及課程的選修的情況。SELECT學(xué)生.*,課程.*,成績,選修日期FROM(學(xué)生LEFTJOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào))FULLJOIN課程ON選修.課程號(hào)=課程.課程號(hào)第2章結(jié)構(gòu)化查詢語言SQL[例2-48]查詢選修001號(hào)課程且成績及格的所有學(xué)生。

SELECT學(xué)生.學(xué)號(hào),姓名

FROM學(xué)生INNERJOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào)

WHERE選修.課程號(hào)=‘001’AND選修.成績>60(3)復(fù)合條件連接

第2章結(jié)構(gòu)化查詢語言SQL[例2-49]查詢性別為男的學(xué)生的學(xué)號(hào)、姓名、選修的課程名及成績。

SELECT學(xué)生.學(xué)號(hào),姓名,課程名,成績

FROM(學(xué)生INNERJOIN選修ON學(xué)生.學(xué)號(hào)=選修.學(xué)號(hào))INNERJOIN課程ON選修.課程號(hào)=課程.課程號(hào)(3)復(fù)合條件連接

第2章結(jié)構(gòu)化查詢語言SQL(1)帶有IN謂詞的子句查詢2.5.5嵌套查詢[例2-50]

查詢與“劉晨”在同一個(gè)班學(xué)習(xí)的學(xué)生。第一步:確定“劉晨”所在班級(jí)名:SELECT班級(jí)FROM學(xué)生WHERE姓名=‘劉晨’第二步:查找所有在“計(jì)算機(jī)應(yīng)用”班學(xué)習(xí)的學(xué)生。

SELECT學(xué)號(hào),姓名,班級(jí)

FROM學(xué)生

WHERE班級(jí)=‘計(jì)算機(jī)應(yīng)用’(1)帶有IN謂詞的子句查詢第2章結(jié)構(gòu)化查詢語言SQL將第一步查詢嵌入到第二步查詢的條件中,構(gòu)造嵌套查詢,SQL語句如下:

SELECT學(xué)號(hào),姓名,班級(jí)

FROM學(xué)生

WHERE班級(jí)IN(SELECT班級(jí)

FROM學(xué)生

WHERE姓名=‘劉晨’)(1)帶有IN謂詞的子句查詢第2章結(jié)構(gòu)化查詢語言SQL[例2-51]查詢選修了課程名為“數(shù)據(jù)庫”的學(xué)生學(xué)號(hào)、姓名和課程名。SELECT學(xué)號(hào),姓名FROM學(xué)生WHERE學(xué)號(hào)IN(SELECT學(xué)號(hào)

FROM選修

WHERE課程號(hào)IN(SELECT課程號(hào)

FROM課程

WHERE課程名=‘?dāng)?shù)據(jù)庫’))(1)帶有IN謂詞的子句查詢第2章結(jié)構(gòu)化查詢語言SQL(2)帶有ANY或ALL謂詞的子查詢

第2章結(jié)構(gòu)化查詢語言SQL[例2-52]查詢選修表中其他科目比科目001的任意一個(gè)成績高的記錄。

SELECT*FROM選修

WHERE成績>ANY(SELECT成績

FROM選修

WHERE課程號(hào)=‘001’)AND課程號(hào)<>‘001’(2)帶有ANY或ALL謂詞的子查詢

第2章結(jié)構(gòu)化查詢語言SQL2.6.1插入數(shù)據(jù)[例2-5]將一個(gè)新學(xué)生記錄(學(xué)號(hào):050103001;姓名:陳冬偉;班級(jí):計(jì)算機(jī)軟件;性別:男;出生年月日:1983-4-18;電話:22894152;Email:cdwei@163.com;備注:轉(zhuǎn)校生)插入到學(xué)生表中。

INSERTINTO學(xué)生

VALUES(‘050103001’,‘陳冬偉’,‘計(jì)算機(jī)軟件’,‘男’,‘1983-4-18’,‘22894152’,‘cdwei@163.com’,‘轉(zhuǎn)校生’)2.6數(shù)據(jù)更新[例2-59]

假設(shè)例2-4中新插入的學(xué)生選了課程但還沒參加考試,所以成績一欄中的記錄為空,插入該選課記錄為(學(xué)號(hào):050103001;課程號(hào):006;選修日期:2005-9-1)。

INSERTINTO選修(學(xué)號(hào),課程號(hào),選修日期)VALUES(‘050103001’,‘006’,‘2005-9-1’)2.6.1插入數(shù)據(jù)第2章結(jié)構(gòu)化查詢語言SQL[例2-61]將學(xué)號(hào)為050103001的學(xué)生的出生年月日改為1984-3-1。

UPDATE學(xué)生

SET出生年月日=‘1984-3-1’WHERE學(xué)號(hào)=‘050103001’2.6.2修改數(shù)據(jù)(1)修改某個(gè)記錄的值[例2-62]將選修表中所有學(xué)生各科的成績增加3分。

UPDATE選修

SET成績=成績+3(2)修改某個(gè)記錄的值第2章結(jié)構(gòu)化查詢語言SQL[例2-63]將計(jì)算機(jī)網(wǎng)絡(luò)班全體學(xué)生的成績置零。UPDATE選修SET成績=0WHERE學(xué)號(hào)IN(SELECT學(xué)號(hào)

FROM學(xué)生

WHERE班級(jí)=‘計(jì)算機(jī)網(wǎng)絡(luò)’)(3)帶子查詢的修改語句第2章結(jié)構(gòu)化查詢語言SQL(1)刪除某一個(gè)記錄的值[例2-64]刪除學(xué)號(hào)為050103001的學(xué)生記錄。

DELETEFROM選修

WHERE學(xué)號(hào)=‘050103001’2.6.3刪除數(shù)據(jù)(2)刪除多個(gè)記錄的值[例2-65]刪除所有的學(xué)生選課記錄。

DELETEFROM選修第2章結(jié)構(gòu)化查詢語言SQL[例2-66]刪除計(jì)算機(jī)網(wǎng)絡(luò)班所有學(xué)生的選課記錄。DELETEFROM選修WHERE學(xué)號(hào)IN(SELECT學(xué)號(hào)

FROM學(xué)生

WHERE班級(jí)=‘計(jì)算機(jī)網(wǎng)絡(luò)’)(3)帶子查詢的刪除語句第2章結(jié)構(gòu)化查詢語言SQL[例2-69]建立計(jì)算機(jī)網(wǎng)絡(luò)班的學(xué)生的視圖,視圖名為計(jì)算機(jī)網(wǎng)絡(luò),并要求進(jìn)行修改和插入操作時(shí)仍需要保證該視圖只有計(jì)算機(jī)網(wǎng)絡(luò)班的學(xué)生。

CREATEVIEW計(jì)算機(jī)網(wǎng)絡(luò)

ASSELECT*FROM學(xué)生

WHERE班級(jí)=‘計(jì)算機(jī)網(wǎng)絡(luò)’

WITHCHECKOPTION2.7定義、刪除與修改視圖[例2-72]定義一個(gè)反映學(xué)生出生年齡的視圖,命名為:年齡,視圖的字段包括學(xué)號(hào),姓名,年齡。

CREATEVIEW年齡(學(xué)號(hào),姓名,年齡)ASSELECT學(xué)號(hào),姓名,2005-YEAR(出生年月日)FROM學(xué)生2.7定義、刪除與修改視圖[例2-73]定義為一個(gè)視圖,求選修表中按學(xué)號(hào)分組求每個(gè)學(xué)生的平均成績,視圖名命名為:匯總1,視圖的字段包括學(xué)號(hào),平均成績。

CREATEVIEW匯總1(學(xué)號(hào),平均成績)ASSELECT學(xué)號(hào),AVG(成績)FROM選修

GROUPBY學(xué)號(hào)2.7定義、刪除與修改視圖2.7.1查詢視圖例:在計(jì)算機(jī)應(yīng)用的視圖中找出電話號(hào)碼以’22’開頭的學(xué)生,查詢結(jié)果包括學(xué)號(hào),姓名,電話。

select學(xué)號(hào),姓名,電話

from計(jì)算機(jī)應(yīng)用

where電話like’22%’[例2-77]將信息系學(xué)生視圖“計(jì)算機(jī)應(yīng)用”中學(xué)號(hào)為030101001的學(xué)生姓名改為“歐陽毅”。

UPDATE計(jì)算機(jī)應(yīng)用

SET姓名=‘歐陽毅’

WHERE學(xué)號(hào)=‘030101001’2.7.2更新視圖[例2-80]刪除視圖“選課1“。

DROPVIEW選課12.7.3刪除視圖第3章存儲(chǔ)過程和觸發(fā)器重點(diǎn)存儲(chǔ)過程的使用(包括創(chuàng)建存儲(chǔ)過程、執(zhí)行存儲(chǔ)過程、查看和修改存儲(chǔ)過程、重命名和刪除存儲(chǔ)過程);觸發(fā)器的使用(包括創(chuàng)建觸發(fā)器,使用觸發(fā)器,查看、修改和刪除觸發(fā)器)。難點(diǎn)用SQL語言創(chuàng)建、執(zhí)行、查看、修改、重命名和刪除存儲(chǔ)過程的方法;用SQL語言創(chuàng)建、使用、查看、修改和刪除觸發(fā)器的方法。自學(xué)建議按順序閱讀并做練習(xí)。教學(xué)建議建議根據(jù)本章的結(jié)構(gòu),采用案例教學(xué),按照:舉例→語法→實(shí)例→練習(xí)的順序進(jìn)行講解;強(qiáng)調(diào)學(xué)生的實(shí)操能力,對(duì)于每個(gè)知識(shí)點(diǎn),讓學(xué)生在相關(guān)平臺(tái)上練習(xí)后直接把答案寫在教本上。[例3-1]實(shí)現(xiàn)在”學(xué)生成績管理”數(shù)據(jù)庫中新建名為:Stuproc的存儲(chǔ)過程,用來查詢學(xué)生表中的學(xué)號(hào)、姓名、班級(jí)、性別列。CREATEPROCEDUREStuprocASSELECT學(xué)號(hào),姓名,班級(jí),性別FROM學(xué)生3.1存儲(chǔ)過程[例3-2]創(chuàng)建一個(gè)用于向課程表中插入記錄的存儲(chǔ)過程:Add_course。

CREATEPROCAdd_course(@課程號(hào)CHAR(3),@課程名VARCHAR(30),@學(xué)時(shí)SMALLINT,@學(xué)分DECIMAL)ASINSERTINTO課程

(課程號(hào),課程名,學(xué)時(shí),學(xué)分)VALUES(@課程號(hào),@課程名,@學(xué)時(shí),@學(xué)分)3.1.1存儲(chǔ)過程[例3-3]創(chuàng)建一個(gè)用于向?qū)W生表中刪除記錄的存儲(chǔ)過程:Delete_stu。

CREATEPROCDelete_stu(@學(xué)號(hào)CHAR(9))ASDELETEFROM學(xué)生

WHERE(學(xué)號(hào)=@學(xué)號(hào))3.1.1存儲(chǔ)過程[例3-4]創(chuàng)建一個(gè)用于向選修表中修改成績記錄的存儲(chǔ)過程:Update_sc。

CREATEPROCUpdate_sc(@學(xué)號(hào)CHAR(9),@課程號(hào)CHAR(3),@成績INT)ASUPDATE選修SET成績=@成績WHERE(學(xué)號(hào)=@學(xué)號(hào)

AND課程號(hào)=@課程號(hào))3.1.1存儲(chǔ)過程3.1.2執(zhí)行存儲(chǔ)過程[例3-5]執(zhí)行例3-1的存儲(chǔ)過程Stuproc。

EXECStuproc

3.1.3刪除存儲(chǔ)過程[例3-12]要?jiǎng)h除Update_sc存儲(chǔ)過程,可執(zhí)行下面的SQL語句:

DROPPROCEDUREUpdate_sc

我們再創(chuàng)建一個(gè)名為:delete_stu的觸發(fā)器,當(dāng)刪除學(xué)生表的某一條記錄時(shí),觸發(fā)器生效,顯示”學(xué)生表中的記錄已被刪除”的信息。Createtriggerdelete_stuOn學(xué)生FordeleteAsPrint‘學(xué)生表中的記錄已被刪除’3.2觸發(fā)器(1)INSERT觸發(fā)器在數(shù)據(jù)庫“學(xué)生成績管理”中創(chuàng)建一觸發(fā)器,名為:stu_course_sc當(dāng)向選修表插入一條記錄時(shí),檢查該記錄的學(xué)號(hào)在學(xué)生表中是否存在且課程號(hào)在課程表中是否存在,如有一項(xiàng)不成立,則不允許插入,并提示出錯(cuò)信息:‘學(xué)生表或課程表中沒有相關(guān)的記錄’。

CREATETRIGGERstu_course_scON選修

FORINSERTASIFEXISTS(SELECT*FROMinsertedWHEREinserted.學(xué)號(hào)NOTIN(SELECT學(xué)號(hào)FROM學(xué)生)ORinserted.課程號(hào)NOTIN(SELECT課程號(hào)FROM課程))BEGINRAISERROR(‘學(xué)生表或課程表中沒有相關(guān)的記錄’,16,1)ROLLBACKEND(2)DELETE觸發(fā)器[例3-16]在”學(xué)生成績管理”數(shù)據(jù)庫中的三個(gè)表,我們可以這樣想,當(dāng)某個(gè)學(xué)生退學(xué)不讀書了,那么它在選修表中的信息也應(yīng)該刪除,所以現(xiàn)今創(chuàng)建一個(gè)觸發(fā)器,名為:Delete_sc。如果要?jiǎng)h除學(xué)生表中的記錄,則與該記錄學(xué)號(hào)對(duì)應(yīng)的選修表中的選修記錄也應(yīng)該刪除。程序清單如下:CREATETRIGGERDelete_scON學(xué)生FORDELETEASDELETE選修WHERE選修.學(xué)號(hào)IN(SELECT學(xué)號(hào)FROMdeleted)3.2.1刪除觸發(fā)器[例3-20]刪除觸發(fā)器Update_課程。

DROPTRIGGERUpdate_課程第4章并發(fā)與事務(wù)4.1事務(wù)(Transaction)所謂的事務(wù)指的是一個(gè)元的工作,就好比我們現(xiàn)實(shí)生活中要做的每一件事。在數(shù)據(jù)庫的概念中,事務(wù)可以只有一條語句,也可以有多條語句,但有一個(gè)很重要的特征:這些語句的所有操作,要么全做,要么全都取消。這是事務(wù)和我們平時(shí)所說的事件或程序的區(qū)別。在數(shù)據(jù)庫備份和恢復(fù)過程中,事務(wù)具有重要意義。[例4-1]假設(shè)在選修表中,學(xué)號(hào)為030101001的學(xué)生由于某些原因不選004號(hào)課程而改選002號(hào)課程,并且考試的成績?yōu)?8分,如果我們把這兩個(gè)操作當(dāng)作一個(gè)事務(wù)的話,則代碼如下:BEGINTRANSACTIONUPDATE選修SET課程號(hào)=‘002’WHERE學(xué)號(hào)=‘030101001’AND課程名=‘004’GOUPDATE選修SET成績=88WHERE學(xué)號(hào)=‘030101001’AND課程名=‘002’COMMIT第4章并發(fā)與事務(wù)但由于編程人員在寫上面的代碼時(shí)忽略了成績字段的匹配,找88分誤寫為某個(gè)字符串型的‘a(chǎn)bc’(雖然這種情況不多見)而導(dǎo)致事務(wù)內(nèi)部故障:BEGINTRANSACTIONUPDATE選修SET課程號(hào)=‘002’WHERE學(xué)號(hào)=‘030101001’AND課程名=‘004’GOUPDATE選修SET成績=‘a(chǎn)bc’

WHERE學(xué)號(hào)=‘030101001’AND課程名=‘002’ROLLBACK第4章并發(fā)與事務(wù)4.1.1事務(wù)的特征原子性一致性隔離性持續(xù)性4.1.2故障的種類事務(wù)內(nèi)部的故障系統(tǒng)故障介質(zhì)故障此外,還有計(jì)算機(jī)病毒等對(duì)數(shù)據(jù)庫也構(gòu)成危害。數(shù)據(jù)恢復(fù)技術(shù)的基本原理十分簡單??梢允且粋€(gè)詞來概括:冗余。數(shù)據(jù)庫中任何一部分被破壞的或不正確的數(shù)據(jù)可以根據(jù)存儲(chǔ)在系統(tǒng)別處的冗余數(shù)據(jù)來重建。建立冗余數(shù)據(jù)最常用的技術(shù)是數(shù)據(jù)轉(zhuǎn)儲(chǔ)和登陸日志文件。通常在一個(gè)數(shù)據(jù)庫系統(tǒng)中,這兩種方法是一起使用的。4.1.3事務(wù)恢復(fù)的實(shí)現(xiàn)技術(shù)數(shù)據(jù)轉(zhuǎn)儲(chǔ):是數(shù)據(jù)庫恢復(fù)中采用的基本技術(shù)。所謂轉(zhuǎn)儲(chǔ)即數(shù)據(jù)庫管理員定期地將整個(gè)數(shù)據(jù)庫恢復(fù)到磁盤或另一個(gè)磁盤上保存起來的過程。這些備用的數(shù)據(jù)文本稱為后備副本或后援副本。轉(zhuǎn)儲(chǔ)可以分為靜態(tài)轉(zhuǎn)儲(chǔ)和動(dòng)態(tài)轉(zhuǎn)儲(chǔ)。4.1.3事務(wù)恢復(fù)的實(shí)現(xiàn)技術(shù)靜態(tài)轉(zhuǎn)儲(chǔ)是在系統(tǒng)中無運(yùn)行事務(wù)時(shí)進(jìn)行的轉(zhuǎn)儲(chǔ)操作。動(dòng)態(tài)轉(zhuǎn)儲(chǔ)是指轉(zhuǎn)儲(chǔ)期間允許對(duì)數(shù)據(jù)進(jìn)行存取或修改。4.1.3事務(wù)恢復(fù)的實(shí)現(xiàn)技術(shù)轉(zhuǎn)儲(chǔ)還可以分為海量轉(zhuǎn)儲(chǔ)和增量轉(zhuǎn)儲(chǔ)兩種方式。海量轉(zhuǎn)儲(chǔ)是指每次轉(zhuǎn)儲(chǔ)全部數(shù)據(jù)庫。增量轉(zhuǎn)儲(chǔ)則指每次只轉(zhuǎn)儲(chǔ)上一次轉(zhuǎn)儲(chǔ)后更新過的數(shù)據(jù)。4.1.3事務(wù)恢復(fù)的實(shí)現(xiàn)技術(shù)數(shù)據(jù)轉(zhuǎn)儲(chǔ)有兩種方式,分別可以在兩種狀態(tài)下進(jìn)行,因此數(shù)據(jù)轉(zhuǎn)儲(chǔ)方法可以分為四類:動(dòng)態(tài)海量轉(zhuǎn)儲(chǔ)動(dòng)態(tài)增量轉(zhuǎn)儲(chǔ)靜態(tài)海量轉(zhuǎn)儲(chǔ)靜態(tài)增量轉(zhuǎn)儲(chǔ)4.1.3事務(wù)恢復(fù)的實(shí)現(xiàn)技術(shù)4.2登記日志文件日志文件是用來記錄事務(wù)對(duì)數(shù)據(jù)庫的更新操作的文件。不同數(shù)據(jù)庫系統(tǒng)采用的日志文件格式并不完全相同。概括起來日志文件主要有兩種格式:以記錄為單位的日志文件和以數(shù)據(jù)為單位的日志文件。對(duì)于以記錄為單位的日志文件,日志文件中需要登記的內(nèi)容包括:各個(gè)事務(wù)的開始(BEGINTRANSACTION)標(biāo)記各個(gè)事務(wù)的結(jié)束(COMMIT或ROLLBACK)標(biāo)記各個(gè)事務(wù)的所有更新操作先把原始數(shù)據(jù)備份到備份服務(wù)器,然后服務(wù)器減少1000元。把各種操作寫入日志文件ATM用戶日志文件備份服務(wù)器服務(wù)器取款1000元傳輸命令:(1)密碼驗(yàn)證,(2)取1000元4.2登記日志文件ATM的功能簡化圖:4.3并發(fā)控制假設(shè)住在佛山的小強(qiáng)想乘飛機(jī)去上海,同時(shí)住在廣州的小明也想乘飛機(jī)去上海,他們都在同一時(shí)間內(nèi)打電話去各自的售票點(diǎn)訂票,訂票系統(tǒng)中的一個(gè)活動(dòng)序列:

佛山售票點(diǎn)(佛山事務(wù))讀出廣州白云機(jī)場售票中心某航班的機(jī)票余額A,A=20張;

廣州售票點(diǎn)(廣州事務(wù))讀出廣州白云機(jī)場售票中心同一航班的機(jī)票余額也A,A=20張;

佛山售票點(diǎn)賣出一張機(jī)票,修改余額A-1=19,把A寫回?cái)?shù)據(jù)庫;

同時(shí),廣州售票點(diǎn)也賣出一張機(jī)票,修改余額A-1,所以A為19,把A寫回?cái)?shù)據(jù)庫。

4.3并發(fā)控制由上圖我們可以看到,結(jié)果明明賣出兩張機(jī)票,但數(shù)據(jù)庫中機(jī)票余額只減少1。我們把這種情況稱為數(shù)據(jù)庫的不一致性。由于佛山售票點(diǎn)和廣州售票點(diǎn)都同時(shí)讀取和修改售票中心的數(shù)據(jù)庫,而這種讀取和修改是隨機(jī)調(diào)度的,當(dāng)佛山售票點(diǎn)在讀取數(shù)據(jù)A(A=20)時(shí),廣州售票點(diǎn)又讀取數(shù)據(jù)A(A=20),這時(shí)兩個(gè)售票點(diǎn)同時(shí)修改A(A-1),然后,佛山售票點(diǎn)把A=19寫回?cái)?shù)據(jù)庫,廣州售票點(diǎn)又把A=19寫回?cái)?shù)據(jù)庫,把佛山售票點(diǎn)所修改的數(shù)據(jù)覆蓋了。導(dǎo)致數(shù)據(jù)不一致的問題出現(xiàn)。通常我們把這種情況稱為丟失修改。4.3并發(fā)控制

4.4封鎖(Locking)當(dāng)兩個(gè)事務(wù)同時(shí)對(duì)某個(gè)對(duì)象發(fā)出請求時(shí),最好的方法就是任何時(shí)候只讓一個(gè)事務(wù)對(duì)該對(duì)象進(jìn)行操作,另外一個(gè)事務(wù)只能等待而不能對(duì)該對(duì)象進(jìn)行操作,只有當(dāng)正在操作的事務(wù)操作完才讓另外一事務(wù)對(duì)該對(duì)象進(jìn)行操作。這樣就不會(huì)出現(xiàn)數(shù)據(jù)不一致性問題,這就是封鎖的基本思想。解決這種并發(fā)問題,我們通常用封鎖技術(shù):

4.4封鎖(Locking)4.4.1封鎖實(shí)例[例4-3]我們建立兩個(gè)事務(wù),一個(gè)是把課程表中課程號(hào)為:001的學(xué)時(shí)改為90;另一個(gè)是把課程表中課程號(hào)為:001的學(xué)時(shí)改為80。我們先分析一下這兩個(gè)事務(wù),它們都想修改同一條記錄(課程號(hào)為001的記錄),如果把這兩個(gè)事務(wù)同時(shí)進(jìn)行,則會(huì)產(chǎn)生并發(fā)問題:事務(wù)T1:SETTRANSACTIONISOLATIONLEVELREPEATABLEREADBEGINTRANUPDATE課程SET學(xué)時(shí)=90WHERE課程號(hào)='001'WAITFORDELAY'00:00:10'COMMIT5.1數(shù)據(jù)依賴有了X,便確定了唯一的Y,稱Y依賴X,記為X→Y。例如:有以下方程:

y=3x當(dāng)x某個(gè)值時(shí),y便能確定下來那么,我們就說:y依賴于x,或說:x決定y第五章數(shù)據(jù)庫設(shè)計(jì)在這個(gè)關(guān)系中,有了職工號(hào),就可以唯一地確定一條記錄。各字段依賴關(guān)系如下:綜上所述:則有(姓名,性別,年齡,職務(wù))依賴于職工號(hào)。或說:職工號(hào)決定(姓名,性別,年齡,職務(wù))姓名,性別,年齡,職務(wù)職工號(hào)第五章數(shù)據(jù)庫設(shè)計(jì)5.1.1完全依賴,部分依賴設(shè)一個(gè)教師任課關(guān)系為:教師任課,該關(guān)系給出某個(gè)學(xué)校每個(gè)教師在一個(gè)學(xué)期內(nèi)任課安排的情況。假定每個(gè)教師可以講授多門課程,每門課程可以由不同教師來講授,不同的教師教同一門課有不同的課時(shí)費(fèi),同一門課不同的老師教亦有不同的課時(shí)費(fèi)。課程上多門課多個(gè)老師上課時(shí)費(fèi)5.1.1完全依賴,部分依賴主鍵可設(shè)為(教工號(hào),課程號(hào)),并有如下依賴:(教工號(hào),課程號(hào))(姓名,職稱,課程名,課時(shí)數(shù),課時(shí)費(fèi))教工號(hào)(姓名,職稱)課程號(hào)(課程名,課時(shí)數(shù))(教工號(hào),課程號(hào))(課時(shí)費(fèi))出現(xiàn)了部分依賴5.1.1完全依賴,部分依賴由于“教工號(hào)”和“課程號(hào)”皆為主鍵(教工號(hào),課程號(hào))的一部分,故稱(教工號(hào),課程號(hào))(姓名,職稱,課程名,課時(shí)數(shù))為部分依賴。顯然,對(duì)于課時(shí)費(fèi),則必須是:(教工號(hào),課程號(hào))課時(shí)費(fèi),這種需要整個(gè)復(fù)合鍵才能決定的依賴稱作完全依賴。5.1.1完全依賴,部分依賴5.1.2直接依賴,傳遞依賴設(shè)一個(gè)學(xué)生關(guān)系為(學(xué)號(hào),姓名,性別,系號(hào),系名,系主任名)通常每個(gè)學(xué)生只屬于一個(gè)系每個(gè)系有許多學(xué)生每個(gè)系都對(duì)應(yīng)唯一的系名和系主任名,其中系名唯一。學(xué)號(hào)(姓名,性別,系號(hào),系名,系主任名)學(xué)號(hào)(姓名,性別,系號(hào))學(xué)號(hào)系號(hào)(系名,系主任名)其中,系名、系主任名直接依賴于系號(hào),對(duì)學(xué)號(hào)則是傳遞依賴。5.1.1完全依賴,部分依賴5.2.1第一范式第一范式:每個(gè)字段是最小單位。不滿足第一范式通常有以下三種情況:多成分字段多值字段計(jì)算字段5.2范式多成分字段(又稱復(fù)合字段),它的值中包含兩個(gè)或多個(gè)不同的項(xiàng)。如表5-10所示,地址中包含省份、城市等信息,便是一個(gè)多成份字段。5.2范式多值字段,包含相同類型的多個(gè)實(shí)例如表5-11和5-12所示,學(xué)生表中的字段“參加的社團(tuán)編號(hào)”,便包含了多個(gè)社團(tuán)編號(hào)。5.2范式計(jì)算字段,包含由其他字段計(jì)算的結(jié)果比如,在表5-13進(jìn)貨明細(xì)表中,金額字段是計(jì)算字段,金額=數(shù)量*進(jìn)貨單價(jià)5.2范式解決方法多成分字段5.2范式多值字段5.2范式3.計(jì)算字段5.2范式5.2.2第二范式第二范式:在滿足第一范式的基礎(chǔ)上;所有非主鍵字段完全依賴于主鍵,而不能部分依賴。記住關(guān)鍵字:完全依賴,不能部分依賴由此我們在設(shè)計(jì)數(shù)據(jù)庫表時(shí)包括

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論