關(guān)系數(shù)據(jù)庫標準語言——SQL課件_第1頁
關(guān)系數(shù)據(jù)庫標準語言——SQL課件_第2頁
關(guān)系數(shù)據(jù)庫標準語言——SQL課件_第3頁
關(guān)系數(shù)據(jù)庫標準語言——SQL課件_第4頁
關(guān)系數(shù)據(jù)庫標準語言——SQL課件_第5頁
已閱讀5頁,還剩88頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章 關(guān)系數(shù)據(jù)庫標準語言SQL本章教學目標、重點和難點 本章教學目標:使學生了解SQL的功能和語言特點;熟練掌握用SQL進行表的定義、數(shù)據(jù)查詢和數(shù)據(jù)更新,掌握SQL的數(shù)據(jù)控制方法。 2. 教學重點:SQL的數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)維護和數(shù)據(jù)控制表示方法 3. 教學難點:用SQL實現(xiàn)嵌套查詢、組合查詢、使用分組和SQL函數(shù)查詢。本章內(nèi)容SQL的功能及特點數(shù)據(jù)定義語句數(shù)據(jù)查詢語句數(shù)據(jù)更新語句嵌入式SQL數(shù)據(jù)控制機制和語句SQL的功能及特點19741975-19791986-198719921999由Boyce和Chamberlin提出IBM公司研制了關(guān)系DBMS原型,并實現(xiàn)該語言美國批準SQL作

2、為美國標準,隨后ISO也通過這一標準公布了SQL-92標準公布了SQL-99,也稱作SQL3SQL的功能及特點數(shù)據(jù)定義數(shù)據(jù)控制數(shù)據(jù)操縱SQL語句分類SQL的功能及特點SQL語句分類數(shù)據(jù)定義數(shù)據(jù)操縱數(shù)據(jù)控制定義關(guān)系數(shù)據(jù)庫的模式、外模式和內(nèi)模式,以實現(xiàn)對基本表、視圖以及索引文件的定義、修改和刪除等操作。包括數(shù)據(jù)查詢和數(shù)據(jù)更新兩種數(shù)據(jù)操作語句:數(shù)據(jù)查詢指對數(shù)據(jù)庫中的數(shù)據(jù)查詢、統(tǒng)計、分組、排序操作;數(shù)據(jù)更新指數(shù)據(jù)的插入、刪除、修改等數(shù)據(jù)維護操作。通過對數(shù)據(jù)庫用戶的授權(quán)和收權(quán)命令來實現(xiàn)有關(guān)數(shù)據(jù)的存取控制,以保證數(shù)據(jù)庫的安全性。SQL的功能及特點SQL的特點1)SQL具有自主式語言和嵌入式語言兩種使用方式

3、;2)SQL具有語言簡潔、易學易用的特點;SQL功能命令動詞數(shù)據(jù)定義(數(shù)據(jù)模式定義、刪除、修改)Create、Drop、Alter數(shù)據(jù)操縱(數(shù)據(jù)查詢和維護)Select、Insert、Update、Delete數(shù)據(jù)控制(數(shù)據(jù)存取控制權(quán)和收權(quán))Grant、RemoveSQL的功能及特點SQL的特點3) SQL支持三級模式結(jié)構(gòu)存儲文件1存儲文件2基本表1基本表2基本表3基本表4視圖1視圖2SQL外模式模式內(nèi)模式數(shù)據(jù)定義語句操作對象創(chuàng)建語句刪除語句修改語句基本表Create tableDrop tableAlter table索引Create indexDrop index視圖Create view

4、Drop view數(shù)據(jù)庫Create databaseDrop databaseAlter database1. 語句格式約定符號尖括號中括號大括號或分隔符|,n實際語義任選項必選項,必選其中一項前面的項可重復多次數(shù)據(jù)定義語句2. 一般語法規(guī)定SQL中的數(shù)據(jù)項(包括列項、表和視圖)分隔符為“,”,其字符串常數(shù)的定界符用單引號“”表示3. SQL特殊語法規(guī)定SQL的關(guān)鍵詞一般使用大寫字母表示;語句的結(jié)束符為“;”語句一般應采用格式化書寫方式數(shù)據(jù)定義語句基本表的定義和維護1. 基本表的定義定義基本表語句的一般格式為: CREATE TABLE 庫名表名( 列名數(shù)據(jù)類型列級完整性約束條件 ,列名數(shù)據(jù)

5、類型列級完整性約束條件 ,n ,表級完整性約束條件 ,n );數(shù)據(jù)定義語句建立基本表: 學生(學號,姓名,年齡,性別,所在系);課程(課程號,課程名,先行課); 選課(學號,課程號,成績).CREATE TABLE 課程(課程號 CHAR(5) PRIMARY KEY, 課程名 CHAR(20), 先行課 CHAR(5) );數(shù)據(jù)定義語句(1)SQL支持的數(shù)據(jù)類型類型表示類型說明數(shù)值型數(shù)據(jù)SMALLINT半字長二進制證書,15bit數(shù)據(jù)INTEGER或INT全字長(4字長)整數(shù),31bit數(shù)據(jù)DECIMAL(p,q)十進制數(shù),共p位,其中小數(shù)點后q位,0qp,q=0時可省略不寫FLOAT雙字長

6、浮點數(shù)字符型數(shù)據(jù)CHARTER(n)或CHAR(n)長度為n的定長圖形字符串VARCHAR(n)最大長度為n的變長字符串特殊數(shù)據(jù)類型GRAPHIC(n)長度為n的定長圖形字符串VARGRAPHIC(n)最大長度為n的變長圖形字符串日期時間型DATE日期型,格式為YYYY-MM-DDTIME時間型,格式為HH.MM.SSTIMESTAMP日期加時間數(shù)據(jù)定義語句(2)列級完整性的約束條件1)NOT NULL或NULL約束NOT NULL約束不允許字段值為空而NULL約束允許字段值為空。2)UNIQUE約束UNIQUE約束是惟一性約束,即不允許列中出現(xiàn)重復的屬性值。3)DEFAULT約束DEFAUL

7、T為默認值約束。DEFAULT約束名默認值FOR列名4)CHECK約束CHECK為檢查約束。CONSTRAINT約束名CHECK (約束條件表達式)數(shù)據(jù)定義語句建立基本表: 學生(學號,姓名,年齡,性別,所在系);課程(課程號,課程名,先行課); 選課(學號,課程號,成績).CREATE TABLE 學生(學號 CHAR(5) NOT NULL UNIQUE, 姓名 CHAR(8) NOT NULL, 年齡 SMALLINT, 性別 CHAR(2), 所在系 CHAR(20), DEFAULT C1 20 FOR 年齡, CONSTRAINT C2 CHECK(性別 IN (男,女);數(shù)據(jù)定義

8、語句(3)表級完整性的約束條件1)UNIQUE約束UNIQUE約束是惟一性約束,當要求列祖的值不能有重復值時,使用UNIQUE約束定義。2)PRIMARY KEY約束定義主碼,保證惟一性和非空性。CONTRAINT約束名PRIMARY KEY CLUSTERED (列組)3)FOREIGN KEY約束用于定義參照完整性。 CONTRAINT約束名FOREIGN KEY(外碼) REFERENCES被參照表名(與外碼對應的主碼名)數(shù)據(jù)定義語句建立基本表: 學生(學號,姓名,年齡,性別,所在系);課程(課程號,課程名,先行課); 選課(學號,課程號,成績).CREATE TABLE 選課(學號 C

9、HAR(5), 課程號 CHAR(5), 成績 SMALLINT, CONSTRAINT C3 CHECK(成績 BETWEEN 0 AND 100), CONSTRAINT C4 PRIMARY KEY(學號,課程號), CONSTRAINT C5 FOREIGN KEY(學號) REFERENCES 學生(學號), CONSTRAINT C6 FOREIGN KEY(課程號) REFERENCES 課程(課程號); 數(shù)據(jù)定義語句2.修改基本表ALTER TABLE表名 ADD(新列名數(shù)據(jù)類型完整性約束 ,n) DROP完整性約束名 MODIFY(列名數(shù)據(jù)類型,n);使用ADD子句增加新列【

10、例5-2】向課程表中增加“學時”字段。 ALTER TABLE 課程 ADD 學時 SMALLINT;使用MODIFY子句修改列的原定義:MODIFY子句主要用于加寬原列的寬度使用DROP子句刪除指定的完整性約束條件【例5-3】刪除學生表中對年齡的默認值的定義。 ALTER TABLE 學生 DROP C1;數(shù)據(jù)定義語句3.刪除基本表刪除基本表的一般格式為: DROP TABLE表名;數(shù)據(jù)定義語句索引的定義和維護1.索引的作用使用索引可以明顯地加快數(shù)據(jù)查詢的速度;先將索引文件讀入內(nèi)存,根據(jù)索引項找到元組的地址,然后再根據(jù)地址將元組數(shù)據(jù)直接讀入計算機。由于索引文件中只含有索引項和元組地址,所以文

11、件小,一般可一次讀入內(nèi)存索引文件中的索引項是經(jīng)過排序的,可以很快地找到索引項值和元組地址數(shù)據(jù)定義語句索引的定義和維護1.索引的作用使用索引可以明顯地加快數(shù)據(jù)查詢的速度; 使用索引可保證數(shù)據(jù)的惟一性;使用索引可以加快連接速度。2.建立索引的原則索引的建立和維護由DBA和DBMS完成;大表應當建索引,小表則不必建索引;對于一個基本表,不要建立過多的索引;根據(jù)查詢要求建索引。數(shù)據(jù)定義語句3.建立索引的格式建立格式為:CREATE UNIQUE CLUSTER INDEX索引名 ON表名(列名次序,列名次序);是要建索引的基本表的名字;每個后面還可以用指定索引值的排列次序,次序可選ASC(升序)或DE

12、SC(降序),默認值為ASC;UNIQUE表示該索引的每一個索引值只對應唯一的數(shù)據(jù)記錄;CLUSTER表示要建立的索引是聚簇索引,使基本表中數(shù)據(jù)的物理順序與索引項的排列順序一致。數(shù)據(jù)定義語句3.建立索引的格式 【例5-4】為學生_課程數(shù)據(jù)庫中的學生、課程和選課三個表建立索引。其中,學生表按學號升序建立索引;課程表按課程號升序建惟一索引;選課表按學號升序和課程號降序建惟一索引。CREATE UNIQUE INDEX 學號 ON 學生(學號);CREATE UNIQUE INDEX 課程號 ON 課程(課程號);CREATE UNIQUE INDEX 選課號 ON 選課(學號 ASC,課程號 DE

13、SC);數(shù)據(jù)定義語句4.刪除索引刪除索引格式為: DROP INDEX 索引名;例:刪除學生表的學生姓名索引DROP INDEX 學生姓名數(shù)據(jù)定義語句視圖的定義和維護1.視圖的優(yōu)點視圖是根據(jù)子模式設(shè)計的關(guān)系,由一個或幾個基本表導出的虛表。視圖能夠簡化用戶的操作;視圖機制可以減少用戶對數(shù)據(jù)庫中數(shù)據(jù)結(jié)構(gòu)的調(diào)整操作,使用戶將注意力集中在所關(guān)心的數(shù)據(jù)上。2)視圖機制可以使用戶以不同的方式看待同一數(shù)據(jù);當多用戶共享同一個數(shù)據(jù)庫的數(shù)據(jù)時,通過視圖機制可以實現(xiàn)各個用戶對數(shù)據(jù)的不同使用要求。3)視圖可以對機密的數(shù)據(jù)提供安全保護數(shù)據(jù)定義語句1.視圖的優(yōu)點4)視圖對數(shù)據(jù)庫的重構(gòu)提供了一定程度的邏輯獨立性;在關(guān)系數(shù)

14、據(jù)庫中,數(shù)據(jù)庫的重構(gòu)往往是不可避免的。但由于視圖機制,將為應用程序提供了原來使用的關(guān)系,保持外模式。原表:學生(學號,姓名,性別,年齡,所在系)分成:SX(學號,姓名,年齡) SY(學號,性別,所在系)CREATE VIEW 學生 (學號,姓名,性別,年齡,所在系)AS SELECT SX.學號,SX.姓名,SX.性別,SY.年齡,SY.所在系FROM SX,SYWHERE SX.學號=SY.學號;數(shù)據(jù)定義語句2.視圖定義的格式一般格式為: CREATE VIEW視圖名(列名組) AS子查詢 WITH CHECK OPTION;(1)WITH CHECK OPTION選項 表示在對視圖進行UP

15、DATE、INSERT和DELETE操作時,要保證操作的數(shù)據(jù)滿足視圖定義中的謂詞條件。該謂詞條件是視圖子查詢中的WHERE子句的條件。數(shù)據(jù)定義語句2.視圖定義的格式一般格式為: CREATE VIEW視圖名(列名組) AS子查詢 WITH CHECK OPTION;(2)組成視圖的屬性列名全部省略或者全部指定 若省略了視圖的各個屬性列名,則由子查詢中的SELECT子句的目標列代替 必須明確指定列名的情況某個目標列是集函數(shù)或列表達式;子查詢中使用多個表(或視圖),并且目標列中含有相同的屬性名;需要在視圖中改用新的、更合適的列名。數(shù)據(jù)定義語句2.視圖定義的格式【例5-6】建立計算機系學生的視圖。

16、CREATE VIEW 計算機系學生 AS SELECT 學號,姓名,年齡 FROM 學生 WHERE 所在系=計算機系;數(shù)據(jù)定義語句2.視圖定義的格式【例5-7】由學生、課程和選課三個表,定義一個計算機系的學生成績視圖,其屬性包括學號、姓名、課程名和成績CREATE VIEW 學生成績(學號,姓名,課程名,成績) AS SELECT 學生.學號,學生.姓名,課程.課程名,選課.成績 FORM 學生,課程,選課 WHERE 學生.學號=選課.學號 AND 程.課程名=選課.課程號 AND 學生.所在系=計算機系;數(shù)據(jù)定義語句2.視圖定義的格式【例5-8】將學生的學號、總成績、平均成績定義成一個

17、視圖。 CREATE VIEW 學生成績統(tǒng)計(學號,總成績,平均成績) AS SELECT 學號,SUM(成績),AVG(成績) FORM 選課 GROUP BY 學號;3.視圖的刪除 DROP VIEW數(shù)據(jù)定義語句4.視圖的查詢和維護視圖可以和基本表一樣被查詢,其使用方法與基本表相同,但利用視圖進行數(shù)據(jù)增、刪、改操作,會受到一定的限制。一般的數(shù)據(jù)庫系統(tǒng)不支持對下列幾種情況的視圖進行數(shù)據(jù)更新操作。1)由兩個以上基本表導出的視圖2)視圖的字段來自字段表達式函數(shù)3)視圖中有分組子句或使用了DISTINCT短語4)視圖定義中有嵌套查詢,且內(nèi)層查詢中涉及了與外層一樣的導出該視圖的基本表5)在一個不允許

18、更新的視圖上定義的視圖數(shù)據(jù)查詢語句數(shù)據(jù)查詢的基本語法1.SELECT語句的語法SELECT目標列組 FROM數(shù)據(jù)源 WHERE元組選擇條件 GROUP BY分列組HAVING 組選擇條件 ORDER BY排序列1排序要求1 ,n;數(shù)據(jù)查詢語句1.SELECT語句的語法SELECT子句:指明目標列(字段、表達式、函數(shù)表達式、常量)?;颈碇邢嗤牧忻硎緸椋罕砻?列名FROM子句:指明數(shù)據(jù)源。表間用“,”分割。數(shù)據(jù)源不在當前數(shù)據(jù)庫中,使用“數(shù)據(jù)庫名.表名”表示。一表多用,用別名標識。定義表別名:表名.別名WHERE子句:元組選擇條件。數(shù)據(jù)查詢語句1.SELECT語句的語法學生課程庫結(jié)構(gòu)為:學生(

19、學號,姓名,年齡,所在系); 課程(課程號,課程名,先行課); 選課(學號,課程號,成績).【例5-9】求數(shù)學系學生的學號和姓名。 SELECT 學號,姓名 FROM 學生 WHERE 所在系=數(shù)學系;【例5-10】求選修了課程的學生學號。 SELECT DISTINCT 學號 FROM 選課;數(shù)據(jù)查詢語句1.SELECT語句的語法(4) GROUP BY子句:結(jié)果集分組。當目標列中有統(tǒng)計函數(shù),則統(tǒng)計為分組統(tǒng)計,否則為對整個結(jié)果集統(tǒng)計。子句后帶上HAVING子句表達組選擇條件(帶函數(shù)的表達式)。(5) ORDER BY子句:排序。當排序要求為ASC時升序排序;排序要求為DESC時降序排列。【例

20、5-11】求選修C1課程的學生學號和成績,并要求對查詢結(jié)果按成績的降序排列,如果成績相同則按學號的升序排列。 SELECT 學號,成績 FROM 選課 WHERE 課程號=C1 ORDER BY 成績 DESC,學號 ASC;數(shù)據(jù)查詢語句2.SELECT語句的操作符(1) 算術(shù)操作符+(加號)、(減號)、*(乘號)和 /(除號)。(2) 比較操作符=(等于)、(大于)、(小于)、=(大于等于)、!=(不等于)、(小于大于)、!(不大于)和 ! ANY(數(shù)據(jù)表|子查詢)全部(每個)ALL字段比較符ALL (數(shù)據(jù)表|子查詢)例:字段 ALL (數(shù)據(jù)表|子查詢)不存在EXISTSEXISTS (子查

21、詢)在不在范圍NOT BETWEENAND字段NOT BETWEEN 小值 AND 大值是不是空值IS NOT NULL字段 IS NOT NULL模式比較NOT LIKE字段 NOT LIKE 字符常數(shù) 其中, “_” 單字符通配符和 “%” 多字符通配符與運算AND條件1AND條件2或運算OR條件1OR條件2非運算NOTNOT條件數(shù)據(jù)查詢語句(4) 組合查詢操作符SQL的組合查詢操作符是針對傳統(tǒng)關(guān)系運算的操作符,包括UNION(并查詢)、MINUS(差查詢)和INTERSECT(交查詢)其格式為:1)UNION:并查詢,并在結(jié)果集中去掉重復行。2) MINUS:差查詢操作。3) INTER

22、SECT:交查詢操作。4) *:取全部字段。格式為: * 或表名.*5) ALL:全部。保留重復值(有統(tǒng)計函數(shù)時要求計算重復值)。 格式為: ALL字段或 ALL字段組6) DISTINCT:去掉重復值。在結(jié)果集中去掉重復值,或在統(tǒng)計函數(shù)中不計重復值。 格式為: DISTINCT字段或 DISTINCT字段組數(shù)據(jù)查詢語句【例5-12】求選修課程C1且成績在8090之間的學生學號和成績,并將成績乘以系數(shù)0.8輸出。 SELECT 學號,成績*0.8 FROM 選課 WHERE 課程號 = C1 AND 成績 BETWEEN 80 AND 90;【例5-13】求數(shù)學系或計算機系姓張的學生的信息。

23、SELECT * FROM 學生 WHERE 所在系 IN ( 數(shù)學系,計算機系 ) AND 姓名 LIKE 張%;1.簡單查詢實例數(shù)據(jù)查詢語句【例5-14】求缺少了成績的學生的學號和課程號。 SELECT 學號,課程號 FROM 選課 WHERE 成績 IS NULL;數(shù)據(jù)查詢語句2.連接查詢實例連接查詢中的連接條件通過WHERE子句表達,連接條件和元組選擇條件之間用AND(與)操作符銜接(1) 等值連接和非等值連接 表名1.列名1比較運算符表名2.列名2比較運算符:=、=、90;數(shù)據(jù)查詢語句(2) 自身連接操作例如,課程表中的先行課是在上學期應開設(shè)的,先行課的先行課,即間接先行課應提前一學

24、年開設(shè)。如果求查詢某門課的間接先行課或全部課程的間接先行課,就需要對課程表進行自身連接。 課程號課程名先行課C1計算機引論C2PASCAL語言C1C3數(shù)據(jù)結(jié)構(gòu)C2C4數(shù)據(jù)庫C3C5軟件工程C4課程的先行關(guān)系鏈為:C5C4C3C2C1,課程的間接關(guān)系鏈為:C5C3C1。 數(shù)據(jù)查詢語句(2) 自身連接操作【例5-18】查詢每一門課的間接先行課。 SELECT A.課程號,A.課程名,B.先行課 FROM 課程 A,課程 B WHERE A.先行課=B.課程號 課程號課程名先行課課程號課程名先行課C1計算機引論C1計算機引論C2Pascal語言C1C2Pascal語言C1C3數(shù)據(jù)結(jié)構(gòu)C2C3數(shù)據(jù)結(jié)構(gòu)

25、C2C4數(shù)據(jù)庫C3C4數(shù)據(jù)庫C3C5軟件工程C4C5軟件工程C4數(shù)據(jù)查詢語句(2) 自身連接操作【例5-18】查詢每一門課的間接先行課。 SELECT A.課程號,A.課程名,B.先行課 FROM 課程 A,課程 B WHERE A.先行課=B.課程號 A.課程號A.課程名B.先行課C2Pascal語言C3數(shù)據(jù)結(jié)構(gòu)C1C4數(shù)據(jù)庫C2C5軟件工程C3數(shù)據(jù)查詢語句(3) 外部連接操作 左外部連接操作是在結(jié)果集中保留連接表達式左表中的非匹配記錄;右外部連接操作是在結(jié)果集中保留連接表達式右表中的非匹配記錄。外部連接符號為“*=”,右外部連接符號為“=*”。外部連接中不匹配的分量用NULL表示。職工號姓

26、名性別年齡所在部門部門號部門名稱電話1010李勇男201111生產(chǎn)科5661011劉晨女1912計劃科5781012王敏女221213一車間4671014張立男211314科研所數(shù)據(jù)查詢語句(3) 外部連接操作職工號姓名性別年齡所在部門部門名稱電話1010李勇男2011生產(chǎn)科5661012王敏女2212計劃科5781014張立男2113一車間467內(nèi)連接的結(jié)果集數(shù)據(jù)查詢語句(3) 外部連接操作左連接的結(jié)果集職工號姓名性別年齡所在部門部門名稱電話1010李勇男2011生產(chǎn)科5661011劉晨女191012王敏女2212計劃科5781014張立男2113一車間467數(shù)據(jù)查詢語句(3) 外部連接操作

27、右連接的結(jié)果集職工號姓名性別年齡所在部門部門名稱電話1010李勇男2011生產(chǎn)科5661012王敏女2212計劃科5781014張立男2113一車間467科研所數(shù)據(jù)查詢語句(3) 外部連接操作【例5-19】用SQL表達職工和部門之間的內(nèi)連接、左外部連接和右外部連接的語句內(nèi)連接: SELECT 職工.*,部門名稱,電話 FROM 職工,部門 WHERE 職工.所在部門= 部門.部門號;左外部連接: SELECT 職工.*,部門名稱,電話 FROM 職工,部門 WHERE 職工.所在部門*= 部門.部門號;右外部連接: SELECT 職工.*,部門名稱,電話 FROM 職工,部門 WHERE 職工

28、.所在部門 =*部門.部門號; 數(shù)據(jù)查詢語句3.嵌套查詢在SQL語言中,一個SELECTFROMWHERE語句稱為一個查詢塊。將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為嵌套查詢。(1) 使用IN操作符的嵌套查詢【例5-20】求選修了高等數(shù)學的學生學號和姓名。 SELECT 學號,姓名 FROM 學生 WHERE 學號 IN ( SELECT 學號 FROM 選課 WHERE 課程號 IN ( SELECT 課程號 FROM 課程 WHERE 課程名=高等數(shù)學 );數(shù)據(jù)查詢語句3.嵌套查詢在SQL語言中,一個SELECTFROMWHERE語句稱為一個查詢塊

29、。將一個查詢塊嵌套在另一個查詢塊的WHERE子句或HAVING短語的條件中的查詢稱為嵌套查詢。(1) 使用IN操作符的嵌套查詢【例5-20】求選修了高等數(shù)學的學生學號和姓名。 該題也可以使用下面的連接查詢表達。 SELECT 學生.學號,姓名 FROM 學生,課程,選課 WHERE 學生.學號=課程.學號 AND 課程.課程號=選課.課程號 AND 課程.課程名=高等數(shù)學;數(shù)據(jù)查詢語句3.嵌套查詢(2) 使用比較符的嵌套查詢【例5-21】求C1課程的成績高于張三的學生學號和成績。 SELECT 學號,成績 FROM 選課 WHERE 課程號=C1 AND 成績 ( SELEC 成績 FROM

30、選課 WHERE 課程號=C1AND 學號= (SELECT 學號 FROM 學生 WHERE 姓名=張三);數(shù)據(jù)查詢語句(3) 使用ANY或ALL操作符的嵌套查詢其格式為:ANY|ALL 操作符語意ANY大于子查詢結(jié)果中的某個值,即表示大于查詢結(jié)果中最小值A(chǔ)LL大于子查詢結(jié)果中的所有值,即表示大于查詢結(jié)果中最大值A(chǔ)NY小于子查詢結(jié)果中的某個值,即表示小于查詢結(jié)果中最大值=ANY大于等于子查詢結(jié)果中的某個值,即表示大于等于結(jié)果集中最小值=ALL大于等于子查詢結(jié)果中的所有值,即表示大于等于結(jié)果集中最大值數(shù)據(jù)查詢語句(3) 使用ANY或ALL操作符的嵌套查詢其格式為:ANY|ALL 操作符語意=A

31、NY小于等于子查詢結(jié)果中的某個值,即表示小于等于結(jié)果集中最大值=ALL小于等于子查詢結(jié)果中的所有值,即表示小于等于結(jié)果集中最小值=ANY等于子查詢結(jié)果中的某個值,即相當于IN=ALL等于子查詢結(jié)果中的所有值(通常沒有實際意義)!=(或)ANY不等于子查詢結(jié)果中的某個值,!=(或)ALL不等于子查詢結(jié)果中的任何一個值,即相當于NOT IN數(shù)據(jù)查詢語句(3) 使用ANY或ALL操作符的嵌套查詢其格式為:ANY|ALL 【例5-22】求其他系中比計算機系某一學生年齡小的學生。 SELECT * FROM 學生 WHERE 年齡 ANY (SELECT 年齡 FROM 學生 WHERE 所在系=計算機

32、系 ) AND 所在系計算機系;數(shù)據(jù)查詢語句(3) 使用ANY或ALL操作符的嵌套查詢其格式為:ANY|ALL 【例5-23】求其他系中比計算機系學生年齡都小的學生。 SELECT * FROM 學生 WHERE 年齡 ALL (SELECT 年齡 FROM 學生 WHERE 所在系=計算機系) AND 所在系 計算機系;數(shù)據(jù)查詢語句(4) 使用EXISTS操作符的嵌套查詢【例5-24】求選修了C2課程的學生姓名。 SELECT 姓名 FROM 學生 WHERE EXISTS (SELECT * FROM 選課 WHERE 學生.學號=學號 AND 課程號=C2);Select 姓名From

33、學生,選課Where 學生.學號=選課.學號 and 課程號=c2數(shù)據(jù)查詢語句(4) 使用EXISTS操作符的嵌套查詢【例5-25】求沒有選修C2課程的學生姓名。 SELECT 姓名 FROM 學生 WHERE NOT EXISTS (SELECT * FROM 選課 WHERE 學生.學號=學號 AND 課程號=C2);不能寫成以下:Select 姓名From 學生,選課Where 學生.學號=選課.學號 and 課程號c2數(shù)據(jù)查詢語句(4) 使用EXISTS操作符的嵌套查詢【例5-26】查詢選修了全部課程的學生的姓名。 SELECT 姓名 FROM 學生 WHERE NOT EXISTS

34、(SELECT * FROM 課程 WHERE NOT EXISTS (SELECT * FROM 選課 WHERE 學生.學號=學號 AND 課程.課程號=課程號);由于SQL沒有全稱量詞的操作符,該題轉(zhuǎn)換為查詢這樣的學生:沒有一門課他不選修。數(shù)據(jù)查詢語句(4) 使用EXISTS操作符的嵌套查詢【例5-27】求至少選修了學號為“S2”的學生所選修的全部課程的學生學號和姓名。 SELECT 學號,姓名 FROM 學生 WHERE NOT EXISTS (SELECT * FROM 選課 選課1 WHERE 選課1.學號=S2 AND NOT EXISTS (SELECT * FROM 選課 選

35、課2 WHERE 學生.學號=選課2.學號 AND 選課2.課程號=選課1.課程號);數(shù)據(jù)查詢語句4.組合查詢Union并操作,Intersect交操作,MINUS差操作【例5-28】求選修了C1課程或選修了C2課程的學生學號。 SELECT 學號 FROM 選課 WHERE 課程號=C1 UNION SELECT 學號 FROM 選課 WHERE 課程號=C2;Select 學號From選課Where 課程號=C1 or 課程號=C2數(shù)據(jù)查詢語句4.組合查詢【例5-29】求選修C1課程,并且也選修C2課程的學生學號。 SELECT 學號 FROM 選課 WHERE 課程號=C1 INTERS

36、ECT SELECT 學號 FROM 選課 WHERE 課程號=C2;數(shù)據(jù)查詢語句4.組合查詢【例5-30】求選修了C1課程但沒有選修C2課程的學生學號。SELECT 學號 FROM 選課 WHERE 課程號=C1 MINUS SELECT 學號 FROM 選課 WHERE 課程號=C2;數(shù)據(jù)查詢語句4.組合查詢【例5-30】求選修了C1課程但沒有選修C2課程的學生學號。 本例也可以用下面的EXISTS嵌套查詢表示。 SELECT 學號 FROM 選課 選課1 WHERE 課程號=C1 AND NOT EXISTS (SELECT 學號 FROM 選課 選課2 WHERE 選課1.學號=選課2

37、.學號 AND 選課2.課程號=C2);數(shù)據(jù)查詢語句5.使用分組和SQL函數(shù)查詢函數(shù)功能AVG(數(shù)值表達式)求與字段相關(guān)的數(shù)值表達式的平均值SUM(數(shù)值表達式)求與字段相關(guān)的數(shù)值表達式的和值MIN(字段表達式)求字段表達式的最小值MAX(字段表達式)求字段表達式的最大值COUNT(*|字段)求記錄行數(shù)(*),或求不是NULL的字段的行數(shù)數(shù)據(jù)查詢語句5.使用分組和SQL函數(shù)查詢【例5-31】求學生的總?cè)藬?shù)。 SELECT COUNT (*) FROM 學生;【例5-32】求選修了課程的學生人數(shù)。 SELECT COUNT(DISTINCT 學號) FROM 選課;數(shù)據(jù)查詢語句5.使用分組和SQL

38、函數(shù)查詢【例5-33】求課程和選修該課程的人數(shù)。 SELECT 課程號,COUNT(學號) FROM 選課 GROUP BY 課程號;【例5-34】求選修課超過3門課的學生學號。 SELECT 學號 FROM 選課 GROUP BY 學號 HAVING COUNT(*)3;數(shù)據(jù)更新語句SQL的數(shù)據(jù)插入功能1. 使用常量插入單個元組格式為: INSERT INTO表名(屬性列1,屬性列2) VALUES (常量1,常量2);數(shù)據(jù)更新語句SQL的數(shù)據(jù)插入功能1. 使用常量插入單個元組【例5-35】將一個新學生記錄(學號:98010,姓名:張三,年齡:20,所在系:計算機系 )插入到學生表中。INS

39、ERTINTO 學生VALUES (98010,張三,20,計算機系);【例5-36】插入一條選課記錄(學號:98011,課程號:C10,成績不詳)。 INSERT INTO 選課 (學號,課程號) VALUES (98011,C10);數(shù)據(jù)更新語句2.在表中插入子查詢的結(jié)果集INSERT INTO表名(屬性列1,屬性列2) 子查詢;【例5-37】求每個系學生的平均年齡,并把結(jié)果存入數(shù)據(jù)庫中。 CREATE TABLE 系平均年齡 (系名稱CHAR(20), 平均年齡SMALLINT); INSERT INTO 系平均年齡 SELECT 所在系,AVG(ALL年齡) FROM 學生 GROUP

40、 BY 所在系;數(shù)據(jù)更新語句3.SQL的數(shù)據(jù)修改功能UPDATE表名 SET列名=表達式,列名=表達式,n WHERE條件;【例5-38】將學生表中全部學生的年齡加上2歲。 UPDATE 學生 SET 年齡=年齡+2;【例5-39】將選課表中的數(shù)據(jù)庫課程的成績乘以1.2。 UPDATE 選課 SET 成績= 成績*1.2 WHERE 課程號= (SELECT 課程號 FROM 課程 WHERE 課程名= 數(shù)據(jù)庫 );數(shù)據(jù)更新語句3.SQL的數(shù)據(jù)刪除功能DELETE FROM表名 WHERE條件;【例5-40】刪除藝術(shù)系的學生記錄及選課記錄。 DELETE FROM 選課 WHERE 學號 IN

41、 (SELECT 學號 FROM 學生 WHERE 所在系=藝術(shù)系); DELETE FROM 學生 WHERE 所在系=藝術(shù)系;嵌入式SQL嵌入式SQL的特點1. 嵌入式SQL應注意的問題 1) SQL和主語言的配合問題。 2) 合理選擇主語言。2. SQL嵌入主語言時必須解決的三個問題 (1) 如何區(qū)別SQL和主語言 在所有的SQL語句前面加上前綴EXEC SQL;SQL語句的結(jié)束標志隨主語言的不同而不同嵌入式SQL嵌入式SQL的特點2. SQL嵌入主語言時必須解決的三個問題 (2) 使數(shù)據(jù)庫的工作單元與程序工作單元之間能夠通信 1) 主語言通過主變量向SQL語句提供參數(shù)。 2) SQL語

42、句的當前工作狀態(tài)和運行環(huán)境數(shù)據(jù)要返饋給應用程序。 (3) 使用游標解決SQL一次一集合的操作與主語言一次一記錄操作的矛盾 游標是系統(tǒng)為用戶開設(shè)的一個數(shù)據(jù)緩沖區(qū),存放SQL語句的執(zhí)行結(jié)果。嵌入式SQL不用游標的SQL語句1. 幾種不需要使用游標的SQL語句(1) 用于說明主變量的說明性語句 SQL的說明性語句主要有兩條: EXEC SQL BEGIN DECLARE SECTION; EXEC SQL END DECLARE SECTION;(2) 數(shù)據(jù)定義和數(shù)據(jù)控制語句(3) 查詢結(jié)果為單記錄的查詢語句(4) 數(shù)據(jù)的插入語句和某些數(shù)據(jù)刪除、修改語句 獨立的數(shù)據(jù)刪除和修改語句不需要使用游標;與查

43、詢語句配合,刪除或修改查詢到的當前記錄的操作,與游標有關(guān)。 嵌入式SQL2. 不用游標的查詢語句EXEC SQL SELECT ALL|DISTINCT目標列表達式,n INTO主變量指示變量,n FROM表名或視圖名,n WHERE條件表達式;1) 在語句開始前要加EXEC SQL前綴。2) 該查詢語句中又擴充了INTO子句。3) 在WHERE子句的條件表達式中可以使用主變量。嵌入式SQL2. 不用游標的查詢語句EXEC SQL SELECT ALL|DISTINCT目標列表達式,n INTO主變量指示變量,n FROM表名或視圖名,n WHERE條件表達式;4) 由于查詢的結(jié)果集中只有一條

44、記錄,該語句中不必有排序和分組子句。5) INTO子句中的主變量后面跟有指示變量時 如果查詢結(jié)果列值為NULL,指示變量為負值,結(jié)果列不向該主變量賦值; 如果傳遞正常,指示變量的值為0;如果主變量寬度不夠,則指示變量的值為數(shù)據(jù)截斷前的寬度。6) 如果查詢結(jié)果并不是單條記錄,則程序出錯。嵌入式SQL2. 不用游標的查詢語句EXEC SQL SELECT ALL|DISTINCT目標列表達式,n INTO主變量指示變量,n FROM表名或視圖名,n WHERE條件表達式;【例5-41】查詢學號為主變量givesno、課號為主變量givecno的值的學生選課記錄。 EXEC SQL SELECT 學

45、號,課程號,成績 INTO :Sno,:Cno,:grade :gradeid FROM 選課 WHERE 學號= :givesno AND 課程號= :givecno;嵌入式SQL2. 不用游標的數(shù)據(jù)維護語句 (1) 不用游標的數(shù)據(jù)刪除語句【例5-42】刪除學號由主變量Sno決定的學生記錄。 EXEC SQL DELETE FROM 學生 WHERE 學號= :Sno;嵌入式SQL2. 不用游標的數(shù)據(jù)維護語句 (2) 不用游標的數(shù)據(jù)維護語句 【例5-43】將計算機系所有學生的年齡都加上主變量Raise。 EXEC SQL UPDATE 學生 SET 年齡=年齡+:Raise WHERE 所在系=計算機系; 【例5-44】將計算機系學生的年齡置空。 Raiseid=-1 EXEC SQL UPDATE 學生 SET 年齡=年齡+:Raise :Raiseid;嵌入式SQL2. 不用游標的數(shù)據(jù)維護語句 (3) 不用游標的數(shù)據(jù)插入語句 【例5-45】將學號為主變量Sno、課程號為Cno的選課記錄,插到庫中。 EXEC SQL INSERT INTO 選課 VALUES (:Sno, :Cno);嵌入式SQL使用游標的SQL 游標機制用于解決SQL查詢結(jié)果為集合而主語言處理方式為記錄方式的矛盾。 在處理中,必須使用游標的SQL語句有兩種

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論