版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
數(shù)據(jù)庫基礎SQL數(shù)據(jù)定義第9章數(shù)據(jù)庫語言SQLSQL特點129.2.1SQL模式的創(chuàng)建和撤銷9.2.2SQL的基本數(shù)據(jù)類型9.2.3基本的表的創(chuàng)建和撤銷9.2.4索引的創(chuàng)建和撤銷3SQL數(shù)據(jù)查詢39.3.1SELECT基本句型9.3.2SELECT語句的使用技術(shù)9.3.3SELECT語句完整的結(jié)構(gòu)9.3.4數(shù)據(jù)查詢的改進寫法9.3.5嵌套查詢的改進寫法9.3.6基本表的連接操作9.4.1數(shù)據(jù)插入
9.4.2數(shù)據(jù)刪除9.4.3數(shù)據(jù)修改SQL數(shù)據(jù)更新44嵌入式SQL6視圖的定義及操作59.5.1視圖的創(chuàng)建和撤銷9.5.2對視圖的操作9.6.1嵌入式SQL的實現(xiàn)方式9.6.2嵌入式SQL的使用規(guī)定9.6.3SQL的集合處理方式的主語言
單記錄處理方式之間的協(xié)調(diào)9.6.4嵌入式SQL的使用技術(shù)第9章數(shù)據(jù)庫語言SQLSQL(StructuredQueryLanguage)是一種結(jié)構(gòu)化查詢語言。59.1SQL特點通常核心SQL主要有四個部分:(1)數(shù)據(jù)定義語言,即SQLDDL,用于定義SQL模式、基本表、視圖、索引等結(jié)構(gòu);(2)數(shù)據(jù)操縱語言,即SQLDML,數(shù)據(jù)操縱分成數(shù)據(jù)查詢和數(shù)據(jù)更新兩類,而數(shù)據(jù)更新又分為插入、刪除和修改三種操作;(3)嵌入式SQL語言的使用規(guī)定,這一部分內(nèi)容涉及到SQL語句嵌入在主語言程序中的規(guī)則;(4)數(shù)據(jù)庫控制語言,即SQLDCL,這一部分包括對基本表和視圖的授權(quán)、完整性規(guī)則的描述、事務控制等內(nèi)容。6SQL具有如下特點:(1)SQL具有十分靈活和強大的查詢功能,其SELECT語句能完成相當復雜的查詢操作,包括各種關(guān)系代數(shù)操作、統(tǒng)計、排序等操作;(2)SQL不是一個應用開發(fā)語言,它只提供對數(shù)據(jù)庫的操作功能,不能完成屏幕控制、菜單管理、報表生成等功能,但SQL既可作為交互式語言獨立使用,也可作為子語言嵌入在主語言中使用,成為應用開發(fā)語言的一部分;(3)SQL是國際標準語言,有利于各種數(shù)據(jù)庫之間交換數(shù)據(jù),有利于程序的移植,有利于實現(xiàn)高度的數(shù)據(jù)獨立性,有利于實現(xiàn)標準化;(4)SQL的詞匯不多,完成核心功能只用了9個英語動詞,它的語法結(jié)構(gòu)接近英語,因此容易學習和使用。79.2SQL數(shù)據(jù)定義本節(jié)介紹對SQL模式、基本表和索引的創(chuàng)建和撤銷等操作。89.2.1SQL模式的創(chuàng)建和撤銷SQL模式的創(chuàng)建在SQL中,一個SQL模式定義為基本表的集合。一個SQL模式由模式名和模式擁有者的用戶名或賬號來確定,并包含模式中每一個元素(基本表、視圖、索引等)的定義。創(chuàng)建SQL模式,就是定義了一個存儲空間。9SQL模式的創(chuàng)建可用CREATESCHEMA語句定義,其基本語法如下:CREATESCHEMA<模式名>AUTHORIZATION<用戶名>例如,下面語句定義了教學數(shù)據(jù)庫的SQL模式:CREATESCHEMAST_COAUTHORIZATIONLISMITH;該模式名為ST_CO,擁有者為LISMITH。10SQL模式的撤銷當一個SQL模式及其所屬的基本表、視圖等元素都不需要時,可以用DROP語句撤銷這個SQL模式。DROP語句的語法如下:DROPSCHEMA<模式名>[ CASCADE|RESTRICT]其方式有兩種:CASCADE(級聯(lián)式)方式:執(zhí)行DROP語句時,把SQL模式及其下屬的基本表、視圖、索引等所有元素全部撤銷。11RESTRICT(約束式)方式:執(zhí)行DROP語句時,只有當SQL模式中沒有任何下屬元素時,才能撤銷SQL模式,否則拒絕執(zhí)行DROP語句。例如,要撤銷SQL模式ST_CO及其下屬所有的元素時,可用下列語句實現(xiàn):DROPSCHEMAST_COCASCADE;由于“SQL模式”這個名詞學術(shù)味太重,因此大多數(shù)DBMS中不愿采用這個名詞,而是采用“數(shù)據(jù)庫”(DATABASE)這個名詞。也就是大多數(shù)系統(tǒng)中把“創(chuàng)建SQL模式”按慣例稱為“創(chuàng)建數(shù)據(jù)庫”,語句采用“CREATEDATABASE…”和“DROPDATABASE”等字樣。129.2.2SQL的基本數(shù)據(jù)類型SQL提供的主要數(shù)據(jù)類型(也稱為“域類型”)有:1.數(shù)值型INTEGER 長整數(shù)(也可寫成INT)SMALLINT 短整數(shù)REAL 浮點數(shù)DOUBLEPRECISION 雙精度浮點數(shù)FLOAT(n) 浮點數(shù),精度至少為n為數(shù)字NUMERIC(p,d) 定點數(shù),有p位數(shù)字(不包括符號、小數(shù)點)組成,小數(shù)點后面有d位數(shù)字(也可寫成DECIMAL(p,d)或DEC(p,d))132.字符串型CHAR(n) 長度為n的定長字符串VARCHAR(n) 具有最大長度為n的變長字符串3.位串型BIT(n) 長度為n的二進制位串BITVARYING(n) 最大長度為n的變長二進制位串4.時間型DATE 日期,包含年、月、日,形為YYYY-MM-DDTIME 時間,包含一日的時、分、秒,形為HH:MM:SS14SQL允許在上面列出的類型的值上進行比較操作,但算術(shù)操作只限于數(shù)值類型。SQL還提供一種時間間隔(INTERVAL)的數(shù)據(jù)類型,例如兩個日期類型值的差,就是一個間隔類型的值。如果一個日期類型值加上一個間隔型的值,或減去一個間隔型的值,就可得到另外一個日期。SQL允許用戶使用“CREATEDOMAIN”語句定義新的域,例如定義一個新的域PERSON_NAME:CREATEDOMAINPERSON_NAMECHAR(8);這樣我們就可以像使用基本類型一樣,用域名PERSON_NAME來定性屬性的類型。159.2.3基本表的創(chuàng)建和撤銷如果在系統(tǒng)中創(chuàng)建了一個數(shù)據(jù)庫,那么就可以在數(shù)據(jù)庫中定義基本表。對基本表結(jié)構(gòu)的操作有創(chuàng)建、修改和撤銷三種操作。1.基本表的創(chuàng)建創(chuàng)建基本表,可用CREATETABLE語句實現(xiàn):CREATETABLE<基本表名>(<列名
類型>,……<完整性約束>,……)16表中每個列的類型可以是基本數(shù)據(jù)類型,也可以是用戶預先定義好的域名。完整性約束主要有三種子句:主鍵子句(PRIMARYKEY)、外鍵子句(FOREIGNKEY)和檢查子句(CHECK)。每個基本表的創(chuàng)建定義中包含了若干列的定義和若干個完整性約束。下面舉例說明。例9.1:對于教學數(shù)據(jù)庫中的四個關(guān)系:教師信息表(工號,姓名,性別,職稱,所屬院系,郵箱,參加工作年月,基本工資,崗位津貼,照片)選課表(課程代碼,課程名稱,開課院系,學分,工號,時間,教室,課程類型)學生信息表(學號,姓名,性別,院系,出生年月,戶籍地,是否黨員,當前績點(GPA),備注)成績表(學號,課程代碼,成績)17基本表教師信息表可用下列語句創(chuàng)建:CREATETABLE教師信息表(工號 CHAR(4) NOTNULL,姓名 CHAR(10) NOTNULL,性別 CHAR(2),職稱 CHAR(6),所屬院系 CHAR(20),郵箱 CHAR(36),參加工作年月DATE,基本工資 REAL,崗位津貼 REAL,照片 CHAR(255),PRIMARYKEY(工號));18SQL允許列值是空值,但當要求某一列的值不允許空值時就應在定義該列時寫上“NOTNULL”,就像這里的工號和姓名后有“NOTNULL”字樣。但在此處,由于主鍵子句(PRIMARYKEY)已定義工號是主鍵,因此列工號的定義中“NOTNULL”是冗余的,可以不寫。但為了提高可讀性,寫上也不妨。19對于基本表選課表、學生信息表和成績表可以用下列語句創(chuàng)建:CREATETABLE選課表(課程代碼 CHAR(12) NOTNULL,課程名稱 CHAR(10) NOTNULL,開課院系 CHAR(20),學分 SMALLINT工號 CHAR(4),時間 DATE,教室 CHAR(12),課程類型 CHAR(10),PRIMARYKEY(課程代碼),FOREIGNKEY(工號)REFERENCES教師信息表(工號));20在基本表“選課表”的定義中說明了主鍵是課程代碼,外鍵是工號,并指出外鍵工號和基本表“教師信息表”中工號列對應,此處對應的列名恰好同名,實際上也可以不同名,只要指出其對應性即可。外鍵體現(xiàn)了關(guān)系數(shù)據(jù)庫的參照完整性。21CREATETABLE學生信息表(學號 CHAR(5) NOTNULL,姓名 CHAR(10) NOTNULL,性別 CHAR(2),院系 CHAR(20),出生年月 DATE,戶籍地 CHAR(10),是否黨員 CHAR(2)當前績點(GPA)REAL,備注 CHAR(255),PRIMARYKEY(學號));22CREATETABLE成績表(學號 CHAR(5),課程代碼 CHAR(12),成績 REAL,PRIMARYKEY(學號,課程代碼),FOREIGNKEY(學號)REFERENCES學生信息表(學號),FOREIGNKEY(課程代碼)REFERENCES選課表(課程代碼));23在基本表成績表的定義中說明了主鍵是(學號,課程代碼),還定義了兩個外鍵,并指出外鍵學號和學生信息表中學號列對應,外鍵課程代碼和選課表中的課程代碼列相對應。在上例中,每個語句結(jié)束時加了分號“;”。但讀者應注意,在SQL標準中,分號不是語句的組成部分。在具體DBMS中,有的系統(tǒng)規(guī)定必須加分號,表示語句結(jié)束,有的系統(tǒng)規(guī)定不加。本書為了醒目,特在每個語句結(jié)束后加分號。在用CREATE語句創(chuàng)建基本表中,最初只是一個空的框架,接下來,用戶可使用INSERT命令把數(shù)據(jù)插入基本表中。關(guān)系數(shù)據(jù)庫產(chǎn)品都有數(shù)據(jù)裝載程序,可以把大量原始數(shù)據(jù)載入基本表。242.基本表結(jié)構(gòu)的修改在基本表建立并使用一段時期后,可以根據(jù)實際需要對基本表的結(jié)構(gòu)進行修改,即增加新的列、刪除原有的列或修改數(shù)據(jù)類型、寬度等。(1)增加新的列用“ALTER…ADD…”語句,其語法如下:ALTERTABLE<基本表名>ADD<列名><類型>25例9.2:在基本表學生信息表中增加一個地址(ADDRESS)列,可用下列語句:ALTERTABLE學生信息表ADDADDRESSVARCHAR(30);應注意,新增加的列不能定義為“NOTNULL”?;颈碓谠黾右涣泻?,原有元組在新增加的列上的值都被定義為空值(NULL)。(2)刪除原有的列用“ALTER…DROP…”語句,其句法如下:ALTERTABLE<基本表名>DROP<列名>[CASCADE|RESTRICT]此處CASCADE方式表示:在基本表中刪除某列時,所有引用到該列的視圖和約束也要一起自動地被刪除。而RESTRICT方式表示在沒有視圖或約束引用該屬性時,才能在基本表中刪除該列,否則拒絕刪除操作。26例9.3:在基本表學生信息表中刪除備注列,并且把引用該列的所有視圖和約束一起刪除,可用下列語句:ALTERTABLE學生信息表DROP備注CASCADE;(3)修改原有列的類型、寬度用“ALTER…MODIFY…”語句,其句法如下:ALTERTABLE<基本表名>MODIFY<列名><類型>例9.4:在基本表學生信息表中學號的長度修改為6,可用下列語句:ALTERTABLE學生信息表MODIFY學號CHAR(6);273.基本表的撤銷
在基本表不需要時,可以用“DROPTABLE”語句撤銷。在一個基本表撤銷后,其所有數(shù)據(jù)也就丟失了。撤銷語句的句法如下:DROPTABLE<基本表名>[CASCADE|RESTRICT]此處的CASCADE、RESTRICT的語義同前面句法中的語義一樣。例9.5:需要撤銷基本表學生信息表。但只有在沒有視圖或約束引用學生信息表中的列時才能撤銷,否則拒絕撤銷??捎孟铝姓Z句實現(xiàn):DROPTABLE學生信息表RESTRICT;289.2.4索引的創(chuàng)建和撤銷在SQL86和SQL89標準中,基本表沒有關(guān)鍵碼概念,用索引機制彌補。索引屬于物理存儲的路徑概念,而不是邏輯的概念。在定義基本表時,還要定義索引,就把數(shù)據(jù)庫的物理結(jié)構(gòu)和邏輯結(jié)構(gòu)混在一起了。因此在SQL2中引入了主鍵概念,用戶在創(chuàng)建基本表時用主鍵子句直接定義主鍵。291.索引的創(chuàng)建創(chuàng)建索引可用“CREATEINDEX”語句實現(xiàn)。其方法如下:CREATE[UNIQUE]INDEX<索引名>ON<基本表名>(<列名序列>)30例9.6:如果創(chuàng)建學生基本表時,未使用主鍵子句,那么可用建索引的方法來起到主鍵的作用:CREATEUNIQUEINDEXS#_INDEXON學生信息表(學號);此處關(guān)鍵字UNIQUE表示每個索引項對應唯一的數(shù)據(jù)記錄。SQL中的索引是非顯式索引,也就是在索引創(chuàng)建以后,用戶在索引撤銷前不會再用到該索引鍵的名,但是索引在用戶查詢時會自動起作用。一個索引鍵也可以對應多個列。索引排列時可以升序,也可以降序,升序排列用ASC表示,降序排列用DESC表示,默認時表示升序排序。譬如,可以對基本表成績表中的(學號,課程代碼)建立索引:CREATEUNIQUEINDEXSC_INDEXON成績表(學號ASC,課程代碼DESC)。312.索引的撤銷當索引不需要時,可以用“DROPINDEX”語句撤銷,其句法如下:DROPINDEX<索引名>32例9.7:撤銷索引S#_INDEX和SC_INDEX,可用下列語句:DROPINDEXS#_INDEX,SC_INDEX;339.3.1SELECT基本句型SQL的SELECT-FROM-WHERE句型:SELECTA1,…,AnFROMR1,…,RmWHEREF34在WHERE子句的條件表達式F中可使用下列運算符:算術(shù)比較運算符:<,<=,>,>=,=,<>或!=。邏輯運算符:AND,OR,NOT。集合成員資格運算符:IN,NOTIN。謂詞:EXISTS(存在量詞),ALL,SOME,UNIQUE。集合函數(shù):AVG(平均值),MIN(最小值),MAX(最大值),SUM(和),COUNT(計數(shù))。F中運算對象還可以是另一個SELECT語句,即SELECT語句可以嵌套。另外,SELECT語句的查詢結(jié)果之間還可以進行集合的并、交、差操作,其運算符是集合運算符:UNION(并),INTERSECT(交),EXCEPT(差)。359.3.2SELECT語句的使用技術(shù)SELECT語句使用時有三種寫法:連接查詢嵌套查詢帶存在量詞的嵌套查詢。36例9.8:對于教學數(shù)據(jù)庫中的四個關(guān)系:教師信息表(工號,姓名,性別,職稱,所屬院系,郵箱,參加工作年月,基本工資,崗位津貼,照片)選課表(課程代碼,課程名稱,開課院系,學分,工號,時間,教室,課程類型)學生信息表(學號,姓名,性別,院系,出生年月,戶籍地,是否黨員,當前績點(GPA),備注)成績表(學號,課程代碼,成績)用戶有一個查詢語句:檢索教學高等數(shù)學的教師工號和姓名。這個查詢要從基本表“教師信息表”和“選課表”中檢索數(shù)據(jù),因此可以有下面三種寫法。37(1)第一種寫法(連接查詢):SELECT教師信息表.工號,姓名FROM教師信息表,選課表WHERE教師信息表.工號=選課表.工號AND課程名稱=’高等數(shù)學’;這個語句執(zhí)行時,要先對FROM后的基本表“教師信息表”和“選課表”做笛卡爾積操作,然后再做等值連接(教師信息表.工號=選課表.工號)、選擇(課程名稱=’高等數(shù)學’)和投影等操作。由于工號在“教師信息表”和“選課表”中都出現(xiàn),因此引用時需注上基本表名,如教師信息表.工號、選課表.工號等。382)第二種寫法(嵌套查詢):SELECT工號,姓名FROM教師信息表WHERE工號IN(SELECT工號FROM選課表WHERE課程名稱=’高等數(shù)學’);這里外層WHERE子句中嵌有一個SELECT語句,SQL允許多層嵌套。這里嵌套的子查詢在外層查詢處理之前執(zhí)行。即先在基本表“選課表”中求出教高等數(shù)學的工號值,然后再在表“教師信息表”中據(jù)工號值求姓名值。39由此可見,查詢涉及到多個基本表時用嵌套結(jié)構(gòu)逐次求解層次分明,具有結(jié)構(gòu)程序設計特點。并且嵌套查詢的執(zhí)行效率也比連接查詢的笛卡爾積效率高。在嵌套查詢中,IN是常用到的謂詞,其結(jié)構(gòu)為“元組IN(集合)”,表示元組在集合內(nèi)。40這個查詢的嵌套寫法還可以有另外一種:SELECT工號,姓名FROM教師信息表WHERE’高等數(shù)學’IN(SELECT課程名稱FROM選課表WHERE選課表.工號=教師信息表.工號);此處內(nèi)層查詢稱為“相關(guān)子查詢”,子查詢中查詢條件依賴于外層查詢中的某個值,所以子查詢的處理不止一次,要反復求值,以供外層查詢使用。41(3)第三種寫法(使用存在量詞的嵌套查詢)SELECT工號,姓名FROM教師信息表WHEREEXISTS(SELECT*FROM選課表WHERE選課表.工號=教師信息表.工號AND課程名稱=’高等數(shù)學’);此處”SELECT*”表示從表中取出所有列。謂詞EXISTS表示存在量詞符號?,其語義是內(nèi)層查詢的結(jié)果應該為非空(即至少存在一個元組)。42例9.9:對于教學數(shù)據(jù)庫中四個基本表教師信息表、選課表、學生信息表、成績表,下面用SELECT語句表達下面各個查詢語句。(1)檢索學習課程代碼為ENGL11004.01的學生學號與成績SELECT學號,成績FROM成績表WHERE課程代碼=‘ENGL11004.01’;43(2)檢索至少選修劉老師所授課程中一門課程的學生學號與姓名。SELECT學生信息表.學號,姓名FROM成績表,學生信息表,選課表,教師信息表WHERE成績表.學號=學生信息表.學號AND成績表.課程代碼=選課表.課程代碼AND教師信息表.工號=選課表.工號AND教師信息表.姓名=‘劉’;44(3)檢索學習課程代碼為ENGL11004.01或PEDU11009.01的學生學號。SELECT學號FROM成績表WHERE課程代碼=‘ENGL11004.01’OR課程代碼=‘PEDU11009.01’;45(4)檢索至少選修課程號為ENGL11004.01和PEDU11009.01的學生學號。SELECTX.學號FROM成績表ASX,成績表ASYWHEREX.學號=Y.學號ANDX.課程代碼=‘ENGL11004.01’ANDY.課程代碼=‘PEDU11009.01’;同一個基本表成績表在一層中出現(xiàn)了兩次,為加以區(qū)別,引入別名X和Y。在語句中應用表名對列名加以限定,譬如X.學號、Y.學號等。書寫時,保留字AS在語句中可省略,可直接寫成“成績表X,成績表Y”。46(5)檢索不學PEDU11009.01課程的學生姓名與院系。SELECT姓名,院系FROM學生信息表WHERE學號NOTIN(SELECT學號FROM成績表WHERE課程代碼=‘PEDU11009.01’);或者:SELECT姓名,院系FROM學生信息表WHERENOTEXISTS(SELECT*FROM成績表WHERE成績表.學號=學生信息表.學號AND課程代碼=‘PEDU11009.01’);這個查詢不能使用連接查詢寫法。47(6)檢索學習全部課程的學生姓名。在表學生信息表中找學生,要求這個學生學了全部課程。換言之,在表學生信息表中找學生,在選課表中不存在一門課程,這個學生沒有學。按照此語義,就可寫出查詢語句的SELECT表達方式:SELECT姓名FROM學生信息表WHERENOTEXISTS(SELECT*FROM選課表WHERENOTEXISTS(SELECT*FROM成績表WHERE成績表.課程代碼=選課表.課程代碼AND學生信息表.學號=成績表.學號));48(7)檢索所學課程包含學號為00001學生所學課程的學生學號。這一查詢的寫法類似于(6)的寫法,其思路如下:在學生信息表中找一個學生(學號),/*在學生信息表中找*/對于00001學的每一門課(課程代碼), /*在成績表中找*/該學生都學了。 /*在成績表中存在一個元組*/然后,改成雙重否定形式在學生信息表中找一個學生(學號),不存在00001學的一門課(課程代碼),該學生沒有學。這樣就很容易的寫出SELECT語句:49SELECT學號FROM學生信息表WHERENOTEXISTS /*不存在00001學的一門課*/(SELECT*FROM成績表ASXWHEREX.學號=‘00001’ANDNOTEXISTS /*該學生沒有學*/(SELECT*FROM成績表ASYWHEREY.學號=學生信息表.學號ANDY.課程代碼=X.課程代碼));509.3.3SELECT語句完整的結(jié)構(gòu)1.聚合函數(shù)SQL提供了下列聚合函數(shù):COUNT(*) 計算元組的個數(shù)COUNT(<列名>) 對一列中的值計算個數(shù)SUM(<列名>) 求某一列值的綜合(此列的值必須是數(shù)值型)AVG(<列名>) 求某一列值的平均值(此列的值必須是數(shù)值型)MAX(<列名>) 求某一列值的最大值MIN(<列名>) 求某一列值的最小值51例9.10:對教學數(shù)據(jù)庫中的數(shù)據(jù)進行查詢和計算。(1)求男學生的總?cè)藬?shù)和平均績點。SELECTCOUNT(*),AVG(當前績點(GPA))FROM學生信息表WHERE性別=‘男’;52(2)統(tǒng)計選修了課程的學生人數(shù)SELECTCOUNT(DISTINCT學號)FROM成績表;這里如果不加保留字DISTINCT,那么統(tǒng)計出表的值是選修課程的學生人次數(shù)。由于有的學生選修了多門課,在統(tǒng)計時只能計作一人,因此在COUNT函數(shù)的列名前面要加DISTINCT,統(tǒng)計出來的值才是學生人數(shù)。532.SELECT語句完整地句法SELECT語句完整地句法如下:SELECT<目標表的列名或列表達式序列>FROM<基本表名和(或)視圖序列>[WHERE<行條件表達式>][GROUPBY<列名序列>] [HAVING<組條件表達式>]][ORDERBY[列名ASC|DESC],…]句法中[]表示該成分可有也可無。54整個語句的執(zhí)行過程如下:讀取FROM子句中基本表、視圖的數(shù)據(jù),執(zhí)行笛卡爾積操作。選取滿足WHERE子句中給出的條件表達式的元組。按GROUP子句中指定列的值分組,同時提取滿足HAVING子句中組條件表達式的那些組。按SELECT子句中給出的列名或列表達式求值輸出。ORDER子句對輸出的目標表進行排序,按附加說明ASC升序排列,或按DESC降序排列。55SELECT語句中,WHERE子句稱為“行條件子句”,GROUP子句稱為“分組子句”,HAVING子句稱為“組條件子句”,ORDER子句稱為“排序子句”。下面舉例說明分組子句和排序子句的用法。56例9.11:對教學數(shù)據(jù)庫中四個基本表教師信息表、選課表、學生信息表、成績表中數(shù)據(jù)進行查詢和計算。(1)統(tǒng)計每門課程的學生選修人數(shù)SELECT選課表.課程代碼,課程名稱,COUNT(學號)FROM選課表,成績表WHERE選課表.課程代碼=成績表.課程代碼GROUPBY選課表.課程代碼;57由于要統(tǒng)計每一門課程的學生人數(shù),因此要把滿足WHERE子句種條件的查詢結(jié)果按課程代碼分組,在每一組中的課程代碼相同。此時的SELECT子句應對每一分組進行操作,在每一組中,選課表.課程代碼只有一個值,統(tǒng)計出的學號值個數(shù)就是這一組中的學生人數(shù)。58(2)求每一教師每一課程的學生選修人數(shù)(超過50人),要求顯示教師工號、課程代碼和學生人數(shù)。顯示時,查詢結(jié)果按人數(shù)升序排序,人數(shù)相同按工號升序、課程代碼降序排序。SELECT工號,課程信息表.課程代碼,COUNT(學號)FROM選課表,成績表WHERE選課表.課程代碼=成績表.課程代碼GROUPBY工號,選課表.課程代碼HAVINGCOUNT(*)>50ORDERBY3,工號,選課表.課程代碼DESC;59該語句先求出選課表和成績表中學生選修教師課程的那些元組,然后根據(jù)教師工號和課程代碼分組,去掉小于等于50人的組,對余下的組統(tǒng)計元組個數(shù),再顯示余下組的教師工號、課程代碼和人數(shù)。ORDERBY子句中數(shù)字3表示對SELECT子句中第3個列值(學生人數(shù))進行升序排列,若人數(shù)相同,則按工號升序、課程號降序排列。60在Access2010數(shù)據(jù)庫中,使用SQL查詢功能的過程如圖9.1所示。(1)啟動數(shù)據(jù)庫:啟動Access2010,創(chuàng)建一個空的數(shù)據(jù)庫,或者啟動一個已經(jīng)既存的數(shù)據(jù)庫;(2)創(chuàng)建查詢:在“創(chuàng)建”選項卡中,單擊“查詢”組的“查詢設計”按鈕
;(3)創(chuàng)建SQL查詢:在彈出的“顯示表”對話框中,單擊“關(guān)閉”按鈕
,這時在“設計”選項卡中,出現(xiàn)“SQL視圖”等選項,單擊“SQL視圖”按鈕
,就可以在SQL的輸入?yún)^(qū)域中輸入SQL語句;(4)運行SQL:在輸入?yún)^(qū)域中輸入正確的SQL語句后,單擊“運行”按鈕
,就執(zhí)行所寫的SQL語句。61629.3.4數(shù)據(jù)查詢中的限制和規(guī)定在SELECT語句具體使用時,還有許多限制和規(guī)定,下面分別敘述。1.SELECT子句的規(guī)定SELECT子句用于描述查詢輸出的表格結(jié)構(gòu),即輸出值的列名或表達式。其形式如下:SELECT[ALL|DISTINCT]<列名或列表達式序列>|*63DISTINCT選項保證重復的行將從結(jié)果中去除;而ALL選項是默認的,將保證重復的行留在結(jié)果中,一般就不必寫出。(1)星號*是對于在FROM子句中命名表的所有列的簡寫。(2)列表達式是對于一個單列求聚合值的表達式。(3)允許表達式中出現(xiàn)包含+、-、*和/以及列名、常數(shù)的算式術(shù)表達式。64例9.12:對基本表教師信息表、選課表、學生信息表、成績表進行查詢。(1)在基本表成績表中檢索男同學選修的課程的課程代碼SELECTDISTINCT課程代碼FROM學生信息表,成績表WHERE學生信息表.學號=成績表.學號AND性別=‘男’;由于一門課程可以有許多男同學選修,因此為避免輸出重復的課程代碼,需在SELECT后面加上DISTINCT。65(2)檢索每個教師的總工資SELECT工號,姓名,基本工資+崗位津貼FROM教師信息表;這里“基本工資+崗位津貼”不是列名,而是一個表達式。662.列和基本表的改名操作有時,一個基本表在SELECT語句中多次出現(xiàn),即這個表被多次調(diào)用。為區(qū)別不同的引用,應給每次的引用標上不同的名字。有時,用戶也可以要求輸出的列名和基本表的列名不一致,可在SELECT子句用“舊名AS新名”形式改名,下例說明了這點。67例9.13:在基本表學生信息表中檢索每個學生的姓名和出生年月,輸出的列名為STUDENT_NAME和BIRTH_DAY。SELECT姓名ASSTUDENT_NAME,出生年月ASBIRTH_DAYFROM學生信息表;在實際應用時,AS字樣可省略。683.集合的并、交、差操作當兩個子查詢結(jié)果的結(jié)構(gòu)完全一致時,可以讓這兩個子查詢執(zhí)行并、交、差操作。并、交、差的運算符為UNION、INTERSECT和EXCEPT。(SELECT查詢語句1)UNION[ALL](SELECT查詢語句2)69(SELECT查詢語句1)INTERSECT[ALL](SELECT查詢語句2)
(SELECT查詢語句1)EXCEPT[ALL](SELECT查詢語句2)
上述操作中不帶關(guān)鍵字ALL時,返回結(jié)果消除了重復元組;而帶ALL時,返回結(jié)果中未消除重復元組。704.條件表達式中的比較操作條件表達式可以用各種運算符組合而成,常用的比較運算符見表9.1.下面分別介紹。(1)算術(shù)比較操作條件表達式中可出現(xiàn)算術(shù)比較運算符(<、<=、>、>=、=、!=),也可以用“BETWEEN…AND…”比較運算符限定一個范圍。71例9.14:在基本表學生信息表中檢索1990年到1995年出生的學生姓名,可用下列語句實現(xiàn):SELECT姓名FROM學生信息表WHERE出生年月>=’1990-1-1’AND出生年月<=‘1995-12-31’;若使用“BETWEEN…AND…”,就更容易理解了72SELECT姓名FROM學生信息表WHERE出生年月BETWEEN’1990-1-1’AND‘1995-12-31’;類似的,不在某個范圍內(nèi)可用“NOTBETWEEN…AND…”比較運算符。73運算符名稱符號及格式說明算術(shù)比較判斷<表達式1>θ<表達式2>θ為算術(shù)比較運算符比較兩個表達式的值之間判斷<表達式1>[NOT]BETWEEN<表達式2>AND<表達式3>搜索(不)在給定范圍內(nèi)的數(shù)據(jù)相同判斷<字符串>[NOT]LIKE<匹配模式>查找(不)包含給定模式的值空值判斷<表達式>IS[NOT]NULL判斷某值是否為空值之內(nèi)判斷<元組>[NOT]IN(<集合>)判斷某元組是否在某集合內(nèi)限定比較判斷<元組>θALL|SOME|ANY(<集合>)元組與集合中每(某)一個元組滿足θ比較存在判斷[NOT]EXISTS(<集合>)判斷集合是否至少存在一個元組唯一判斷[NOT]UNIQUE(<集合>)判斷集合是否沒有重復元組74字符串的匹配操作條件表達式中字符串匹配操作符是“LIKE”。在表達式中可使用兩個通配符:百分號(%):與零個或多個字符組成的字符串匹配。下劃線(_):與單個字符匹配。例9.15:在基本表學生信息表中檢索姓名以‘張’打頭的學生姓名。SELECT姓名FROM學生信息表WHERE姓名LIKE‘張%’;在需要時,也可使用“NOTLIKE”比較運算符。75為了使字符串中包含特殊字符(即%和_),SQL允許定義轉(zhuǎn)義字符。轉(zhuǎn)義字符緊靠特殊字符并放在它前面,表示該特殊字符將被當成普通字符。在LIKE比較中使用ESCAPE保留字來定義轉(zhuǎn)義字符。如果使用反斜線(\)作為轉(zhuǎn)義字符,那么:LIKE‘a(chǎn)b\%cd%‘ESCAPE’\’匹配所有以“ab%cd”開頭的字符串。LIKE‘a(chǎn)b\\cd%‘ESCAPE’\’匹配所有以“ab\cd”開頭的字符串。SQL允許使用NOTLIKE比較運算符搜尋不匹配項。SQL還允許在字符上使用多種函數(shù),例如連接(“||”)、提取子串、計算字符串長度、大小寫轉(zhuǎn)換操作。76(3)空值的比較操作SQL中允許列值為空,空值用保留字NULL表示。例9.16:在基本表學生信息表中搜索出生年月為空值的學生姓名。SELECT姓名FROM學生信息表WHERE出生年月ISNULL;77這里“ISNULL”測試列值是否為空。如果要測試非空值,可用短語“ISNOTNULL”。空值的存在增加了算術(shù)操作和比較操作的復雜性。SQL中規(guī)定,涉及到+、-、*、/的算術(shù)表達式中有一個值是空值時,表達式的值也是空值。涉及到空值的比較操作的結(jié)果認為是“false”。在聚合函數(shù)中遇到空值,除了COUNT(*)外,都跳過空值而去處理非空值。78(4)集合成員資格的比較SQL提供SELECT語句的嵌套子查詢機制。子查詢是嵌套在另一個查詢中的SELECT語句。判斷元組是否在子查詢的結(jié)果(即集合)中的操作,稱為“集合成員資格比較”。其形式如下:<元組>[NOT]IN(<集合>)這里的集合可以是一個SELECT查詢語句,或者是元組的集合,但其結(jié)構(gòu)應與前面元組的結(jié)構(gòu)相同。IN操作符表示:如果元組在集合內(nèi),那么其邏輯值為true,否則為false。79例9.17:在基本表學生信息表和成績表中檢索至少不學PEDU11009.01和COMP11003.02兩門課程的學生學號,可用下列形式表示:SELECT學號FROM學生信息表WHERE學號NOTIN(SELECT學號FROM成績表WHERE課程代碼IN(‘PEDU11009.01’,’COMP11003.02’))上式中子查詢表示選修PEDU11009.01和COMP11003.02課程的學生學號。這個查詢的否定是表示至少不學PEDU11009.01和COMP11003.02兩門課程的學生學號,就是外層查詢的形式。80(5)集合成員的算數(shù)比較其形式如下<元組>θALL|SOME|ANY(<集合>)這里要求“元組”與集合中“元組”的結(jié)構(gòu)一致。θ是算數(shù)比較運算符,“θALL”操作表示左邊那個元組與右邊集合中每一個元組滿足θ運算,“θSOME”操作表示左邊那個元組與右邊集合中至少一個元組滿足θ運算。ANY和SOME是同義詞,早期的SQL標準用ANY,為避免與英語中ANY意思混淆,后來的標準都改為SOME。這里應該注意,元組比較操作與字符串比較類似。例如(a1,a2)<=(b1,b2),其意義與a1<b1OR((a1=b1)AND(a2<=b2))等價。兩個元組相等,則要求其對應的列值都相等。81例9.18:對基本表教師信息表、選課表、學生信息表、成績表進行檢索。(1)檢索學習課程代碼為COMP11003.02課程的學生學號和姓名。此查詢在例9.8中用IN表達。實際上IN可用“=SOME”代替:SELECT學號,姓名FROM學生信息表WHERE學號=SOME(SELECT學號FROM成績表WHERE課程代碼=‘COMP11003.02’);82(2)檢索至少有一門成績超過學生00006一門成績的學生學號。SELECTDISTINCT學號FROM成績表WHERE成績>=SOME(SELECT成績FROM成績表WHERE學號=‘00006’);83(3)索不學COMP11003.02課程的學生姓名和出生年月。SELECT學生姓名,出生年月FROM學生信息表WHERE學號<>ALL(SELECT學號FROM成績表WHERE課程代碼=‘COMP11003.02’);84(4)檢索平均成績最高的學生學號SELECT學號FROM成績表GROUPBY學號HAVINGAVG(成績)>=ALL(SELECTAVG(成績)FROM成績表GROUPBY學號);在SQL中,不允許對聚合函數(shù)進行復合運算,因此不能寫成“SELECTMAX(AVG(成績))”形式。85(6)集合空否的測試可以用謂詞EXISTS來測試一個集合是否為非空,或空。其形式如下:[NOT]EXISTS(<集合>)不帶NOT的操作,當集合非空時(即至少存在一個元組),其邏輯值為true,否則為false。帶NOT的操作,當集合為空時,其值為true,否則為false。86(7)集合中重復元組存在與否的測試可以用謂詞UNIQUE來測試一個集合里是否有重復元組存在。形式如下:[NOT]UNIQUE(<集合>)不帶NOT的操作,當集合中不存在重復元組時,其邏輯值為true,否則為false。帶NOT的操作,當集合中存在重復元組時,其邏輯值為true,否則為false。87例9.19:在基本表教師信息表和選課表中檢索只開設了一門課程的教師工號和姓名。SELECT教師工號,姓名FROM教師信息表WHEREUNIQUE(SELECT工號FROM選課表WHERE選課表.工號=教師信息表.工號);889.3.5嵌套查詢的改進寫法由于SELECT語句中可以嵌套,使得查詢非常復雜,并且難于理解。為降低復雜度,SQL標準提供了兩個方法來改進:導出表和臨時視圖。這兩種數(shù)據(jù)結(jié)構(gòu)只在自身的語句中有效。891.導出表的使用SQL2允許在FROM子句中使用子查詢。如果在FROM子句中使用了子查詢,那么要給子查詢的結(jié)果起個表名和相應的列名。90例9.20:在基本表成績表中檢索平均成績最高的學生學號。這個查詢在例9.18(4)中使用嵌套的方法書寫?,F(xiàn)在可以把子查詢定義為導出表(命名為RESULT),移到外層查詢的FROM子句,得到如下形式:SELECT成績表.學號FROM成績表,(SELECTAVG(成績)FROM成績表GROUPBY學號)ASRESULT(AVG_SCORE)GROUPBY成績表.學號HAVINGAVG(成績)>=ALL(RESULT.AVG_SCORE);912.WITH子句和臨時視圖SQL3允許用戶用WITH子句定義一個臨時視圖(即子查詢),置于SELECT語句的開始處。而臨時視圖本身是用SELECT語句定義的。92例9.21:例9.20的SELECT語句還可以改寫成使用WITH子句的形式。也就是把子查詢定義成臨時視圖(RESULT),置于SELECT語句的開始處,得到如下形式:WITHRESULT(AVG_SCORE)ASSELECTAVG(成績)FROM成績表GROUPBY學號SELECT學號FROM成績表,RESULTGROUPBY學號HAVINGAVG(成績)>=ALL(RESULT.AVG_SCORE);用FROM子句或WHERE子句中的嵌套子查詢,在閱讀時有些難懂。把子查詢組織成WITH子句可以使查詢在邏輯上更加清晰。939.3.6基本表的連接操作現(xiàn)在的SQL標準可以用較為直接的形式表示各式各樣的連接操作(包括自然連接操作),這些操作可在FROM子句中以直接的形式指出。在書寫兩個關(guān)系的連接操作時,SQL2把連接操作符分成連接類型和連接條件兩部分(如表9.2)。連接類型決定了如何處理連接條件中不匹配的元組。連接條件決定了兩個關(guān)系中哪些元組應該匹配,以及連接結(jié)果中出現(xiàn)哪些屬性。94連接類型INNERJOIN(內(nèi)連接)LEFTOUTERJOIN(左外連接)RIGHTOUTERJOIN(右外連接)FULLOUTERJOIN(完全外連接)95連接條件NATURAL(應寫在連接類型的左邊)ON等值連接條件(應寫在連接類型的右邊)USING(A1,A2,…An)(應寫在連接類型的右邊)表9.2連接類型和連接條件
下面是與連接操作有關(guān)的解釋和說明:連接類型分成內(nèi)連接和外連接兩種。內(nèi)連接是等值連接,外連接又分成左、右、完全外連接三種。連接類型中INNER、OUTER字樣可不寫。連接條件分成三種:(1)NATURAL:表示兩個關(guān)系執(zhí)行自然連接操作,即在兩個關(guān)系的公共屬性上作等值連接,運算結(jié)果中公共屬性只出現(xiàn)一次。(2)ON等值連接條件:具體列出兩個關(guān)系在哪些相應屬性上做等值連接。(3)USING(A1,A2,…An):類似于NATURAL形式,這里A1,A2,…An是兩個關(guān)系上的公共屬性,但可以不是全部公共屬性。在連接的結(jié)果中,公共屬性A1,A2,…An只出現(xiàn)一次。96若連接操作是“INNERJOIN”,未提及連接條件,那么這個操作等價于笛卡兒積,SQL2把此操作定義為“CROSSJOIN”操作。若連接操作是“FULLOUTERJOINONfalse”,這里連接的條件總是false,操作結(jié)果要把兩個關(guān)系的屬性全部包括進去。SQL2把此操作定義為“UNIONJOIN”操作。97例9.22:設有關(guān)系R和S(表9.3的(a)和(b))。表9.3的(c),(d),(e)分別表示下面三個連接操作的結(jié)果:E1:RNATURALLEFTOUTERJOINSE2:RLEFTOUTERJOINSONR.B=S.BANDR.C=S.CE3:RLEFTOUTERJOINSUSING(B)98999.4SQL數(shù)據(jù)更新SQL的數(shù)據(jù)更新包括數(shù)據(jù)插入、刪除和修改等三種操作,下面分別介紹。1009.4.1數(shù)據(jù)插入往SQL基本表中插入數(shù)據(jù)的語句是INSERT語句。在SQL3中,有以下四種方式:(1)單元組的插入INSERTINTO<基本表名>[(<列名序列>)]VALUES(<元組值>)(2)多元組的插入INSERTINTO<基本表名>[(<列名序列>)]VALUES(<元組值>),(<元組值>),…,(<元組值>)101(3)查詢結(jié)果的插入INSERTINTO<基本表名>[(<列名序列>)]<SELECT查詢語句>這個語句可把一個SELECT語句的查詢結(jié)果插到某個基本表中。102(4)表的插入INSERTINTO<基本表名1>[(<列名序列>)]TABLE<基本表名2>這個語句可把基本表2的值插入到基本表1中。在上述各種插入語句中,如果插入的值在屬性個數(shù)、順序與基本表的結(jié)構(gòu)完全一致,那么基本表后的(<列名序列>)可省略,否則必須詳細列出。103例9.23:下面是往教學數(shù)據(jù)庫的基本表中插入元組的若干例子。(1)往基本表學生信息表中插入一個元組(‘00001’,’秦書琴’,’女’,’中文學院’,’1991-4-7)INSERTINTO學生信息表(學號,姓名,性別,院系,出生年月)VALUES(‘00001’,’秦書琴’,’女’,’中文學院’,’1991-4-7’);104(2)往基本表成績表中插入一個選課元組(‘00001’,’PEDU11009.01’),此處成績值為空值,可用下列語句實現(xiàn):INSERTINTO成績表(學號,課程代碼)VALUES(‘00001’,’PEDU11009.01’)105(3)往成績表連續(xù)插三個元組,可用下列語句實現(xiàn):INSERTINTO成績表VALUES(‘00001’,’PEDU11009.01’,75),(‘00002’,’COMP11003.02’,90),(‘00003’,’ENGL11004.01’,86);106(4)在基本表成績表中,把平均成績大于80分的男學生的學號和平均成績存入另一個已存在的基本表優(yōu)秀成績表(學號,平均成績)中,可用下列語句實現(xiàn):INSERTINTO優(yōu)秀成績表(學號,平均成績)SELECT學號,AVG(成績)FROM成績表WHERE學號IN(SELECT學號FROM學生信息表WHERE性別=‘男’)GROUPBY學號HAVINGAVG(成績)>80;107(5)某一個班級的選課情況已在基本表班級選課表(學號,課程代碼)中,把班級選課表的數(shù)據(jù)插入到成績表中,可用下列語句:INSERTINTO成績表(學號,課程代碼)TABLE班級選課表;1089.4.2數(shù)據(jù)刪除SQL的刪除操作是指從基本表中刪除元組,其句法如下:DELETEFROM<基本表名>[WHERE<條件表達式>]該語句與SELECT查詢語句非常類似。刪除語句實際上是“SELECT*FROM<基本表名>109[WHERE<條件表達式>]”操作和DELETE操作的結(jié)合,執(zhí)行時首先從基本表中找出所有滿足條件的元組,然后把他們從基本表中刪去。應該注意,DELETE語句只能從一個基本表中刪除元組。如果想從多個基本表中刪除元組,則必須為每一個基本表寫一條DELETE語句。WHERE子句中的條件可以和SELECT語句的WHERE子句中條件一樣復雜,可以嵌套,也可以是來自幾個基本表的復合條件。如果省略WHERE子句,則基本表中所有元組被刪除,用戶使用起來要慎重,現(xiàn)在大多數(shù)系統(tǒng)在此時還要用戶再次確認后才執(zhí)行。110例9.24:(1)把課程代碼為ENGL11004.01的成績從基本表成績表中刪除,DELETEFROM成績表WHERE課程代碼=‘ENGL11004.01’);111(2)把ENGL11004.01課程中小于該課程平均成績的成績元組從基本表成績表中刪除。DELETEFROM成績表WHERE課程代碼=ENGL11004.01AND成績<(SELECTAVG(成績)FROM成績表WHERE課程代碼=’ENGL11004.01’);這里,在WHERE子句中又引用了一次DELETE子句中出現(xiàn)的基本表成績表,但這兩次引用是不相關(guān)的。也就是說,刪除語句執(zhí)行時,先執(zhí)行WHERE子句中子查詢,然后再對查找到的元組執(zhí)行刪除操作。這樣的刪除操作在語義上是不會出問題的。1129.4.3數(shù)據(jù)修改當需要修改基本表中元組的某些列值時,可以用UPDATE語句實現(xiàn),其句法如下:UPDATE<基本表名>SET<列名>=<值表達式>[,<列名>=<值表達式>…]|ROW=(<元組>)[WHERE<條件表達式>]其語義是:修改基本表中滿足條件表達式的那些元組中的列值,需修改的列值在SET子句中指出。SET子句中第一種格式是對符合條件元組中的列值進行修改,第二種格式是可對符合條件的元組中每個列值進行修改。113例9.25:對基本表成績表和選課表中的值進行修改。(1)把ENGL11004.01課程的課程名稱改為DB。UPDATE選課表SET課程名稱=‘DB’WHERE課程代碼=‘ENGL11004.01’;114(2)把女同學的成績提高10%。UPDATE成績表SET成績=成績*1.1WHERE學號IN(SELECT學號FROM學生信息表WHERE性別=‘女’);115(3)當ENGL11004.01的課程成績低于該門課程平均成績時,將成績提高5%。UPDATE成績表SET成績=成績*1.05WHERE課程代碼=‘ENGL11004.01’AND成績<(SELECTAVG(成績)FROM成績表WHERE課程代碼=‘ENGL11004.01’);此處兩次引用成績表是不相關(guān)的。也就是說,內(nèi)層SELECT語句在初始時做了一次,隨后對成績的修改都以初始平均成績?yōu)橐罁?jù)。116(4)在成績表中,把課程代碼為ENGL11004.01,學號為00096的元組修改為(‘ENGL11004.01’,‘00006’,95):UPDATE成績表SETROW=(‘ENGL11004.01’,‘00006’,95)WHERE課程代碼=‘ENGL11004.01’AND學號=’00096’;1179.5.1視圖的創(chuàng)建和撤銷在SQL中,外模式這級的數(shù)據(jù)結(jié)構(gòu)的基本單位是視圖(view),視圖是從若干基本表和(或)其他視圖構(gòu)造出來的表。這種構(gòu)造方法采用SELECT語句實現(xiàn)。在我們創(chuàng)建一個視圖時,只是把其視圖的定義存放在數(shù)據(jù)字典中,而不存儲視圖對應的數(shù)據(jù),在用戶使用視圖時才去求對應的數(shù)據(jù)。因此,視圖被稱為“虛表”,基本表就稱為“實表”。1181.視圖的創(chuàng)建創(chuàng)建視圖可用“CREATEVIEW”語句實現(xiàn)。其句法如下:CREATEVIEW<視圖名>(<列表序列>)AS<SELECT查詢語句>119例9.26:對于教學數(shù)據(jù)庫中四個基本表教師信息表、選課表、學生信息表、成績表,用戶經(jīng)常要用到學號、姓名、課程名稱、成績等列的數(shù)據(jù),那么可用下列語句建立視圖:CREATEVIEWSTUDENT_SCORE(學號,姓名,課程名稱,成績)ASSELECT學生信息表.學號,姓名,課程名稱,成績FROM學生信息表,成績表,選課表WHERE學生信息表.學號=成績表.學號AND成績表.課程代碼=選課表.課程代碼;此處,視圖中列名、順序與SELECT子句中的列名、順序一致,因此視圖名STUDENT_SCORE后的列名可省略。1202.視圖的撤銷在視圖不需要時,可以用“DROPVIEW”語句把其從系統(tǒng)中撤銷,其句法如下:DROPVIEW<視圖名>121例9.27:撤銷STUDENT_SCORE視圖,可用下列語句實現(xiàn):DROPVIEWSTUDENT_SCORE;1229.5.2對視圖的操作在視圖定義以后,對于視圖的查詢(SELECT)操作,與基本表一樣,沒有什么區(qū)別。但對于視圖中元組的更新操作就不一樣了。由于視圖并不像基本表那樣實際存在,因此如何將對視圖的更新轉(zhuǎn)換成對基本表的更新,是系統(tǒng)應該解決的問題。為簡單起見現(xiàn)在一般只對“行列子集視圖”才能更新。123定義9.1如果視圖是從單個基本表只使用選擇、投影操作導出的,并且包含了基本表的主鍵,那么這樣的視圖稱為“行列子集視圖”,并且可以被執(zhí)行更新操作。允許用戶更新的視圖在定義時必須加上“WITHCHECKOPTION”短語。據(jù)上述定義可知,定義在多個基本表上的視圖,或者使用聚合操作的視圖,或者不包含基本表主鍵的視圖都是不允許更新的。124例9.28:如果定義了一個有關(guān)男學生的視圖:CREATEVIEWS_MALEASSELECT學號,姓名,出生年月FROM學生信息表WHERE性別=’男’WITHCHECKOPTION;125由于這個視圖是從單個關(guān)系只使用選擇和投影導出的,并且包含主鍵學號,因此是行列子集視圖,是可更新的。此時,定義中又加上“WITHCHECKOPTION”短語,就能允許用戶對視圖進行插入、刪除和修改操作。譬如,執(zhí)行插入操作:INSERTINTOS_MALEVALUES(‘00001’,’秦書琴’,’1991-4-7’);系統(tǒng)自動會把它轉(zhuǎn)變成下列語句:INSERTINTOS_MALEVALUES(‘00001’,’秦書琴’,’1991-4-7’,’男’);1269.6嵌入式SQLSQL是一種強有力的說明性查詢語言。實現(xiàn)同樣的查詢用SQL書寫比單純用通用編程語言(如C)編碼要簡單得多。然而,使用通用編程語言訪問數(shù)據(jù)庫仍是必要的。SQL不能提供屏幕控制、菜單管理、圖像管理、報表生成等動作。而這些功能要靠C、COBOL、PASCAL、Java、PL/I、FORTRAN等語言實現(xiàn)。這些語言稱為主語言。在主語言中使用的SQL結(jié)構(gòu)稱為嵌入式SQL。1279.6.1嵌入式SQL的實現(xiàn)方式SQL語言有兩種使用方式:一種是在終端交互方式下使用,稱為交互式SQL;另一種是嵌入在主語言的程序中使用,稱為嵌入式SQL。嵌入式SQL的實現(xiàn),有兩種處理方式:一種是擴充主語言的編譯程序,使之能處理SQL語句;另一種是采用預處理方式。目前多數(shù)系統(tǒng)采用后一種方式。128129預處理方式是先用預處理程序?qū)υ闯绦蜻M行掃描,識別出SQL語句,并處理成主語言的函數(shù)調(diào)用形式;然后再用主語言的編譯程序編譯成目標程序。通常DBMS制造商提供一個SQL函數(shù)定義庫,共編譯時使用。源程序的預處理和編譯的具體過程如圖9.2所示。存儲設備上的數(shù)據(jù)庫是用SQL語句存放的,數(shù)據(jù)庫和主語言程序間信息的傳遞是通過共享變量實現(xiàn)的。這些共享變量要用SQL的DECLARE語句說明,隨后SQL語句就可引用這些變量。共享變量也就成了SQL和主語言的接口。130SQL2規(guī)定,SQL_STATE是一個特殊的共享變量,起著解釋SQL語句執(zhí)行狀況的作用,它是一個由5個字符組成的字符數(shù)組。當一個SQL語句執(zhí)行成功時,系統(tǒng)自動給,SQL_STATE附上全零值(即“00000”),表示未發(fā)生錯誤;否則其值為非全零,表示執(zhí)行SQL語句時發(fā)生的各種錯誤情況。譬如“02000”用來表示未找到元組。在執(zhí)行一個SQL語句后,程序可根據(jù)SQL_STATE的值轉(zhuǎn)向不同的分支,以控制程序的流向。1319.6.2嵌入式SQL的使用規(guī)定在主語言的程序中使用SQL語句有以下規(guī)定:1.在程序中要區(qū)分SQL語句與主語言語句所有SQL語句前必須加上前綴標識“EXECSQL”,并以“END_EXEC”作為語句結(jié)束標志。嵌入的SQL語句的格式如下:EXECSQL<SQL語句>END_EXEC結(jié)束標志在不同的主語言中是不同的,在C和PASCAL語言程序中規(guī)定結(jié)束標志不用END_EXEC,而使用分號“;”。1322.允許嵌入的SQL語句引用主語言的程序變量(稱為共享變量)允許嵌入的SQL語句引用主語句的程序變量。但有兩條規(guī)定:(1)引用時,這些變量前必須加冒號“:”作為前綴標識,以示與數(shù)據(jù)庫中變量(如屬性名)有區(qū)別。(2)這些變量要用SQL的DECLARE語句說明。例如,在C語言程序中可用下列形式說明共享變量:133EXECSQLBEGINDECLARESECTION;charsno[5],name[9];charSQL_STATE[6];EXECSQLENDDECLARESECTION;上面四行語句組成一個說明節(jié),第二行和第三行說明了三個共享變量。其中,共享變量SQL_STATE的長度為6,而不是5,這是由于C語言中規(guī)定變量值在作字符串使用時應有結(jié)束符”\0”引起的。1349.6.3SQL的集合處理方式與主語言單記錄處理方式之間的協(xié)調(diào)由于SQL語句處理的是記錄集合,而主語言語句一次只能處理一個記錄,因此需要用游標(cursor)機制,把集合操作轉(zhuǎn)換成單記錄處理方式。與游標有關(guān)的SQL語句有下列四個:135(1)游標定義語句(DECLARE)。游標是與某一查詢結(jié)果相聯(lián)系的符號名,游標用SQL的DECLARE語句定義,句法如下:EXECSQLBEGINDECLARE<游標名>CURSORFOR<SELECT語句>END_EXEC游標定義語句是一個說明語句,定義中的SELECT語句并不立即執(zhí)行。136(2)游標打開語句(OPEN)。該語句執(zhí)行游標定義中的SELECT語句,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度互聯(lián)網(wǎng)數(shù)據(jù)中心服務合同范本4篇
- 二零二五版幼兒園教師勞動權(quán)益保障及勞動合同續(xù)簽規(guī)范協(xié)議3篇
- 二零二五版化工園區(qū)安全與環(huán)境治理合同3篇
- 二零二五年度出租車租賃合同司機休息時間與調(diào)休協(xié)議
- 2025年度文化傳承贈與合同范本
- 2025年度考研政治理論強化輔導個人合同
- 二零二五年度航空貨運代理及清關(guān)合同3篇
- 個人信用擔保合同:2024年專屬貸款保障合同版B版
- 2025年度知識產(chǎn)權(quán)質(zhì)押合同生效期限及知識產(chǎn)權(quán)許可方式
- 二零二五年度自建房買賣合同打印、備案及稅務申報服務合同
- 2024年紀檢監(jiān)察綜合業(yè)務知識題庫含答案(研優(yōu)卷)
- 科室醫(yī)療質(zhì)量與安全管理小組工作制度
- 中華民族共同體概論課件第五講大一統(tǒng)與中華民族共同體初步形成(秦漢時期)
- 初二生地會考試卷及答案-文檔
- 私營企業(yè)廉潔培訓課件
- 施工單位值班人員安全交底和要求
- 中國保險用戶需求趨勢洞察報告
- 數(shù)字化轉(zhuǎn)型指南 星展銀行如何成為“全球最佳銀行”
- 中餐烹飪技法大全
- 靈芝孢子油減毒作用課件
- 現(xiàn)場工藝紀律檢查表
評論
0/150
提交評論