數(shù)據(jù)庫(kù)系統(tǒng)課件:第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言_第1頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)課件:第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言_第2頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)課件:第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言_第3頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)課件:第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言_第4頁(yè)
數(shù)據(jù)庫(kù)系統(tǒng)課件:第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言_第5頁(yè)
已閱讀5頁(yè),還剩269頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言本章重要概念(1)SQL語(yǔ)言簡(jiǎn)介:SQL發(fā)展歷史與特點(diǎn)、組成結(jié)構(gòu)(2)SQL的數(shù)據(jù)定義:SQL模式、基本表和索引的創(chuàng)建和撤銷。(3)SQL的數(shù)據(jù)查詢;SELECT語(yǔ)句的句法,SELECT語(yǔ)句的三種形式及各種限定,基本表的聯(lián)接操作,SQL3中的遞歸查詢。本章重要概念(4)SQL的數(shù)據(jù)操縱:添加、更新和刪除記錄。(5)SQL數(shù)據(jù)控制:對(duì)數(shù)據(jù)庫(kù)用戶或角色授權(quán)、收權(quán)(6)視圖管理:創(chuàng)建、修改和刪除視圖,對(duì)視圖更新操作的限制。(7)嵌入式SQL:運(yùn)行環(huán)境,使用規(guī)定,使用技術(shù),卷游標(biāo),動(dòng)態(tài)SQL語(yǔ)句。本章內(nèi)容概述SQL全稱是“結(jié)構(gòu)化查詢語(yǔ)言(Structured Query La

2、nguage)”,是一種通用的功能極強(qiáng)的關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言。 SQL語(yǔ)言具有結(jié)構(gòu)簡(jiǎn)潔,功能強(qiáng)大,簡(jiǎn)單易學(xué),被確定為關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)的國(guó)際標(biāo)準(zhǔn)。本章詳細(xì)介紹SQL的核心部分內(nèi)容:數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)更新和嵌入式SQL。 3.1 SQL語(yǔ)言簡(jiǎn)介SQL發(fā)展歷史與特點(diǎn)SQL語(yǔ)言特點(diǎn)3.1.1 SQL語(yǔ)言簡(jiǎn)介SQL語(yǔ)言是當(dāng)前最為成功、應(yīng)用最為廣泛的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,其發(fā)展主要經(jīng)歷了以下幾個(gè)階段:1) 1974年由CHAMBERLIN和BOYEE提出,當(dāng)時(shí)稱為SEQUEL(STUCTURED ENGLISH QUERY LANGUAGE);2) IBM公司對(duì)其進(jìn)行了修改,并用于其SYSTEM R關(guān)系數(shù)據(jù)庫(kù)

3、系統(tǒng)中;3) 1981年 IBM推出其商用關(guān)系關(guān)系數(shù)據(jù)庫(kù)SQL/DS,并將其名字改為SQL,由于SQL語(yǔ)言功能強(qiáng)大,簡(jiǎn)潔易用,因此得到了廣泛的使用; 4)今天廣泛應(yīng)用于各種大型數(shù)據(jù)庫(kù),如SYBASE、Microsoft SQL Server、 ORACLE、DB2等,也用于各種小型數(shù)據(jù)庫(kù),如FOXPRO、ACCESS。3.1.1 SQL語(yǔ)言簡(jiǎn)介SQL語(yǔ)言特點(diǎn)非過(guò)程化語(yǔ)言 SQL是一個(gè)非過(guò)程化的語(yǔ)言,因?yàn)樗淮翁幚硪粋€(gè)記錄,對(duì)數(shù)據(jù)提供自動(dòng)導(dǎo)航。SQL允許用戶在高層的數(shù)據(jù)結(jié)構(gòu)上工作,而不對(duì)單個(gè)記錄進(jìn)行操作,可操作記錄集。統(tǒng)一的語(yǔ)法結(jié)構(gòu) SQL為許多任務(wù)提供了命令,包括: 查詢數(shù)據(jù) 在表中插入、修改

4、和刪除記錄 建立、修改和刪除數(shù)據(jù)對(duì)象 控制對(duì)數(shù)據(jù)和數(shù)據(jù)對(duì)象的存取 保證數(shù)據(jù)庫(kù)一致性和完整性 是所有關(guān)系數(shù)據(jù)庫(kù)的公共語(yǔ)言3.1.2 SQL的組成結(jié)構(gòu) SQL 事實(shí)上是操作和檢索關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,它允許程序員和數(shù)據(jù)庫(kù)管理員做如下的工作:更改數(shù)據(jù)庫(kù)的結(jié)構(gòu);更改系統(tǒng)的安全設(shè)置;增加用戶對(duì)數(shù)據(jù)庫(kù)或表的許可權(quán)限;在數(shù)據(jù)庫(kù)中檢索需要的信息;對(duì)數(shù)據(jù)庫(kù)的信息進(jìn)行更新;1.數(shù)據(jù)定義語(yǔ)言(Data Definition Language,簡(jiǎn)稱DDL),DDL用于定義數(shù)據(jù)庫(kù)的邏輯結(jié)構(gòu),是對(duì)關(guān)系模式一級(jí)的定義,包括基本表、視圖及索引的定義。2. 數(shù)據(jù)查詢語(yǔ)言(Data Query Language,簡(jiǎn)稱DQL),

5、DQL用于查詢數(shù)據(jù)。SQL主要定義了以下四類語(yǔ)言:3.1.2 SQL的組成結(jié)構(gòu)3.數(shù)據(jù)操縱語(yǔ)言(Data Manipulation Language,簡(jiǎn)稱DML),DML用于對(duì)關(guān)系模式中的具體數(shù)據(jù)的增、刪、改等操作。4. 數(shù)據(jù)控制語(yǔ)言(Data Control Language,簡(jiǎn)稱DCL),DCL用于數(shù)據(jù)訪問(wèn)權(quán)限的控制。 SQL 語(yǔ)言的組成對(duì)應(yīng)的命令動(dòng)詞建表 SQL的組成結(jié)構(gòu)SQL的各部分對(duì)應(yīng)的命令動(dòng)詞表SQL組成部分 命令動(dòng)詞數(shù)據(jù)定義(DDL)CREATE, DROP, ALTER數(shù)據(jù)查詢(DQL)SELECT數(shù)據(jù)操縱(DML)INSERT, UPDATE, DELETE數(shù)

6、據(jù)控制(DCL)GRANT, REVOKESQL語(yǔ)言的組成對(duì)應(yīng)的命令動(dòng)詞 表3.13.2 SQL數(shù)據(jù)定義 SQL支持關(guān)系數(shù)據(jù)庫(kù)的外模式、模式、內(nèi)模式這三級(jí) 模式結(jié)構(gòu),如圖3.1所示。 外模式:由視圖和部分基本表構(gòu)成。視圖是為滿足用戶和應(yīng)用程序的數(shù)據(jù)格式要求而定義的,當(dāng)基本表不適合于用戶直接查詢的操作要求時(shí),需要定義視圖,以便用戶的查詢操作。 模式:由全體基本表構(gòu)成?;颈硎潜旧愍?dú)立的表,SQL中一個(gè)關(guān)系對(duì)應(yīng)一個(gè)基本表。 內(nèi)模式:由數(shù)據(jù)庫(kù)的存儲(chǔ)文件和他們的索引文件構(gòu)成。在SQL中,一個(gè)關(guān)系對(duì)應(yīng)一個(gè)表;一個(gè)或多個(gè)表對(duì)應(yīng)一個(gè)存儲(chǔ)文件;一個(gè)表可以帶若干個(gè)索引。存儲(chǔ)文件的邏輯結(jié)構(gòu)組成了關(guān)系數(shù)據(jù)庫(kù)的內(nèi)模式

7、。3.2 SQL數(shù)據(jù)定義SQL基本表b3基本表b4存儲(chǔ)文件f2存儲(chǔ)文件f3視圖v1視圖v2基本表b1基本表b2存儲(chǔ)文件f1外模式模式內(nèi)模式圖3.1 數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)3.2.1 數(shù)據(jù)庫(kù)模式的定義 1.數(shù)據(jù)庫(kù)模式的創(chuàng)建 對(duì)于SQL,數(shù)據(jù)庫(kù)的創(chuàng)建用CREATE語(yǔ)句實(shí)現(xiàn),典型的數(shù)據(jù)庫(kù)創(chuàng)建語(yǔ)句如下: CREATE DATABASE 數(shù)據(jù)庫(kù)名 【參數(shù)】 例3.1 創(chuàng)建一個(gè)名稱為“教務(wù)管理系統(tǒng)”的數(shù)據(jù)庫(kù),參 數(shù)保持系統(tǒng)默認(rèn)。 解: CREATE DATABASE 教務(wù)管理系統(tǒng)2. 數(shù)據(jù)庫(kù)的刪除原先所建數(shù)據(jù)庫(kù)進(jìn)行刪除,此時(shí)對(duì)應(yīng)的語(yǔ)句為DROP語(yǔ)句,具體語(yǔ)法如下:DROP DATABASE 數(shù)據(jù)庫(kù)名例3.2

8、 刪除”教務(wù)管理系統(tǒng)”數(shù)據(jù)庫(kù). 解: DROP DATABASE 教務(wù)管理系統(tǒng)3.2.1 數(shù)據(jù)庫(kù)模式的定義 1. 創(chuàng)建基本表 SQL語(yǔ)言創(chuàng)建基本表的一般格式為: CREATE TABLE (列級(jí)完整性約束, ); 3.2.2基本表的定義完整性約束 列級(jí)完整性約束僅作用在該列上,表級(jí)完整性約束是作用在整個(gè)表的,這些完整性約束條件都保存在系統(tǒng)的數(shù)據(jù)字典中,并由關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)自動(dòng)檢查 。 例3.3 創(chuàng)建一個(gè)學(xué)生表S,包括如下幾個(gè)字段Snum、Sname、Ssex、Sage、Sphone、Dnum,其中Snum是學(xué)號(hào),Sname是姓名,Ssex是性別, Sage是年齡,Sphone是電話,Dnum

9、是學(xué)生所在的院系編號(hào)。Snum是主碼,不能為空值且是唯一 。 解:CREATE TABLE S(Snum CHAR(10) NOT NULL UNIQUE, Sname VARCHAR(8), Ssex CHAR(2), Sage SMALLINT, Sphone VARCHAR(20), Dnum CHAR(4), PRIMARY KEY (Snum),FOREIGN KEY(Dnum) REFERENCES D(Dnum); 這里定義的學(xué)生表有六個(gè)屬性,其中NOT NULL和UNIQUE是列級(jí)完整性約束,作用在Snum上,NOT NULL要求Snum不能為空值,UNIQUE要求Snum取值

10、唯一,而PRIMARY KEY(Snum)是表級(jí)完整性約束,F(xiàn)OREIGN KEY(Dnum) REFERENCES D(Dnum)則說(shuō)明該學(xué)生表S的字段Dnum為院系表D的外鍵。 一個(gè)課程表C(Cnum,Cname,Cfreq)和一個(gè)選修表SC(Snum,Cnum,score),其中Cnum是課程號(hào),Cname是課程名稱, Cfreq是該門(mén)課程的學(xué)分,Snum是學(xué)號(hào), score是成績(jī)。Cnum是C表的主碼,(Snum,Cnum)是SC表的主碼。要求學(xué)分Cfreq可以是空值或者是0到10之間的定點(diǎn)數(shù)。而SC表中的Cnum和Snum分別是課程表C和學(xué)生表S的外碼。 例3.4CREATE TAB

11、LE C(Cnum CHAR(4),Cname VARCHAR(20),Cfreq NUMERIC(2,1),PRIMARY KEY (Cnum),CHECK(Cfreq IS NULL) OR (Cfreq BETWEEN 0 AND 10);解:CREATE TABLE SC(Snum CHAR(10),Cnum CHAR(4),Score SMALLINT,PRIMARY KEY (Snum,Cnum),FOREIGN KEY(Snum) REFERENCES S(Snum),FOREIGN KEY(Cnum) REFERENCES C(Cnum);ALTER TABLE 語(yǔ)句的語(yǔ)法如下

12、: ALTER TABLE ADD COLUMN 完整性約束ADD ,DROP COLUMN ,DROP ,ALTER COLUMN ;2. 修改基本表 12. 修改基本表 2ALTER TABLE 語(yǔ)句可以實(shí)現(xiàn)如下三種功能: (1)加入一列到已經(jīng)存在的表中; (2)修改已經(jīng)存在的表中的某一列; (3)刪除表中已經(jīng)存在的一列。 例3.6 在已存在的學(xué)生表S中增加一個(gè)家庭地址Saddress的新的屬性列: 解:ALTER TABLE S ADD Saddress VARCHAR(50);要注意的是,新增加的屬性列的值都是空值。(1) 增加一列 例3.7 修改學(xué)生表S中Sname的數(shù)據(jù)類型,變?yōu)镃

13、HAR類型。 解:ALTER TABLE S ALTER COLUMN Sname CHAR(15); (2)修改列的屬性(3)刪除列例3.8 刪除學(xué)生表S中的Sage字段。解:ALTER TABLE S DROP COLUMN Sage; 例3.8 在學(xué)生表S中限定年齡Sage小于100大于0. 解: ALTER TABLE S ADD CONSTRAINT Chk_Sage CHECK (Sage0 and Sage100);(4)增加完整性約束 (5) 刪除完整性約束 例3.9 刪除學(xué)生表S中完整性約束 Uni_Snum 和Chk_Sage. 解: ALTER TABLE S DROP

14、Uni_Snum, Chk_Sage; SQL 提供了一個(gè)可以從數(shù)據(jù)庫(kù)徹底地移去某個(gè)表的命令DROP TABLE,它可以從數(shù)據(jù)庫(kù)中刪除一個(gè)指定的表以及與之相關(guān)聯(lián)的索引和視圖,需要注意的是,一旦這個(gè)命令發(fā)出以后就沒(méi)有辦法可以取消它。SQL語(yǔ)言刪除基本表的一般格式為: DROP TABLE CASCADE|RESTRICT; 例3.11 刪除學(xué)生表S。 DROP TABLE S3. 刪除基本表1. 建立索引 SQL語(yǔ)言建立索引的一般格式為: CREATE UNIQUECLUSTER INDEX ON (,);3.2.3索引的定義建立索引示例例3.12 在學(xué)生表S的姓名列Sname上建索引 CREA

15、TE INDEX idx_Sname ON S(Sname);例3.13 在選修表SC的課程號(hào)Cnum和成績(jī)Score上建索引,要求課程號(hào)為主索引且為升序,課程號(hào)相同時(shí)成績(jī)?yōu)榻敌颉?CREATE INDEX idx_sc_s ON SC(Cnum, Score DESC); SQL語(yǔ)言刪除索引的一般格式為: DROP INDEX ; 例3.13 在學(xué)生表S上的索引idx_Sname。 DROP INDEX idx_Sname ON S ;2. 刪除索引3.2.3 索引的定義3.3 SQL數(shù)據(jù)查詢 SELECT命令的格式與基本使用SELECT語(yǔ)句是SQL語(yǔ)言中功能最強(qiáng)大、用途最廣泛的數(shù)據(jù)庫(kù)操縱語(yǔ)

16、句,也是關(guān)系運(yùn)算理論在SQL語(yǔ)言中的主要體現(xiàn)。一個(gè)完整的SELECT語(yǔ)句包括SELECT,F(xiàn)ROM,WHERE,GROUP BY和ORDER BY共五個(gè)子句,前兩個(gè)必不可少,后面三個(gè)可以省略。SELECT語(yǔ)句的完整格式為:SELECT DISTINCTFROM WHERE GROUP BY HAVINGORDER BY ASC|DESC3.3 SQL數(shù)據(jù)查詢 該SELECT格式的含義是: 根據(jù) WHERE 子句的行條件表達(dá)式 , 從 FROM 子句指定的基本表或視圖中找出滿足條件的行 , 再按 SELECT 子句中的目標(biāo)列表達(dá)式選出元組中的屬性值形成結(jié)果表。3.3 SQL數(shù)據(jù)查詢 如果有 GR

17、OUP 子句 ,則將結(jié)果按 的值進(jìn)行分組 , 該屬性列值相等的元組為一個(gè)組 , 每個(gè)組產(chǎn)生結(jié)果表中的一條記錄。通常會(huì)在每組中進(jìn)行聚合操作。如果 GROUP 子句帶 HAVING 短語(yǔ) , 則只有滿足指定條件的組才予輸出。如果有 ORDER 子句 , 則結(jié)果表還要按的值的升序或降序排序。 3.3 SQL數(shù)據(jù)查詢 我們接下來(lái)列出本章所舉的各個(gè)例子中要用到的教學(xué)數(shù)據(jù)庫(kù)中各個(gè)基本表的結(jié)構(gòu),表中加下劃線的字段為表的主碼,其中表S、T、D、C、SC的示范數(shù)據(jù)請(qǐng)讀者參看第二章圖2.6,新增加的授課表TC示范數(shù)據(jù)如下所示:3.3 SQL數(shù)據(jù)查詢 學(xué)生S (學(xué)號(hào)Snum, 姓名Sname , 性別Ssex ,

18、年齡Sage , 聯(lián)系電話Sphone, 系編號(hào)Dnum )教師T (教師號(hào)Tnum, 姓名Tname , 性別Tsex , 出生日期Tbirth , 職稱Ttitle , 工資Tsalary ,聯(lián)系電話Tphone, 系編號(hào)Dnum )本章數(shù)據(jù)表用例本章數(shù)據(jù)表用例院系D(系編號(hào)Dnum,系名稱Dname,負(fù)責(zé)人Ddirector)課程C (課程號(hào)Cnum, 課程名Cname , 課時(shí)Cfreq )選課SC (學(xué)號(hào)Snum , 課程號(hào)Cnum , 成績(jī)Score )授課TC ( 教師號(hào)Tnum , 課程號(hào)Cnum )例 3.15 查詢學(xué)生關(guān)系表S中所有年齡大于等于18歲的學(xué)生的姓名、性別和年齡

19、。 解: SELECT Sname, Ssex, Sage FROM S WHERE Sage=18;3.3.1 簡(jiǎn)單查詢執(zhí)行的結(jié)果見(jiàn)表3.3:SnameSsexSage張山男18李波濤男22王勁松男24表3.3例3.15 的運(yùn)行結(jié)果1.SELECT 子句SELECT 子句的基本功能是選擇表中的全部列或部分列 , 類似關(guān)系代數(shù)中的投影運(yùn)算 ,其語(yǔ)法格式為: SELECT SELECT-FROM-WHERE的具體功能 例 3.16 查詢課程表D中的全部列。 解:SELECT Dnum, Dname, Director FROM D; 也可以簡(jiǎn)單的寫(xiě)成 : SELECT * FROM D;(1)

20、查詢?nèi)苛?執(zhí)行結(jié)果:Dnum Dname DirectorD001計(jì)算機(jī)王森林D002通信 方維偉D003自控張小龍D004外語(yǔ)葉文 也可以是常量 , 此時(shí)查詢結(jié)果中對(duì)應(yīng)列位置的值就都是該常量值。 例3.17 SELECT 子句目標(biāo)列為常量示例。 SELECT Tname, 工資:,Tsalary FROM T;(2) 常量執(zhí)行結(jié)果見(jiàn)表3.5Tname(無(wú)列名)Tsalary梁文博工資:2600王芳工資:3200李剛工資:2200王森林工資:3500余雪梅工資:1880方維偉工資:2680表3.5例3.17 的運(yùn)行結(jié)果SELECT 子句中的 還可以是與屬性列有關(guān)的表達(dá)式 , 即可以是查詢出來(lái)

21、的屬性列經(jīng)過(guò)一定的計(jì)算后列出結(jié)果。 例 3.18 查詢所有老師的稅后工資情況,為簡(jiǎn)單起見(jiàn),我們假定對(duì)不同的工資的個(gè)人所得稅征收比率都為6%。 SELECT Tname, Tsalary*(1-0.06) FROM T; (3) 計(jì)算列執(zhí)行結(jié)果見(jiàn)表3.6Tname(無(wú)列名)梁文博2444王芳3008李剛2068王森林3290余雪梅1767.2方維偉2519.2表3.6例3.18 的運(yùn)行結(jié)果SELECT 子句中的第二項(xiàng)為T(mén)salary*(1-0.06), 這是一個(gè)表達(dá)式 ,即把查詢結(jié)果中每一行的 Tsalary 列的值乘以 (1-0.06), 并將計(jì)算的結(jié)果值作為查詢的結(jié)果。顯然 , 查詢結(jié)果中有

22、多少行 , 該表達(dá)式就有多少個(gè)計(jì)算結(jié)果 , 所以這種計(jì)算有時(shí)也被稱為 水平計(jì)算 或 按行計(jì)算 。 (3) 計(jì)算列1) 算術(shù)運(yùn)算符:算術(shù)操作符在 SQL 語(yǔ)句中表達(dá)數(shù)學(xué)運(yùn)算操作 , 參與運(yùn)算的值都是數(shù)值型的。 SQL 的數(shù)學(xué)運(yùn)算操作符只有四種 , 它們是 :+( 加 ) 、 -( 減 ) 、 *( 乘 ) 和 /( 除 ) 。SQL Server 中的常用運(yùn)算符 2) 字符運(yùn)算符:字符運(yùn)算符在 SQL 語(yǔ)句中表達(dá)字符運(yùn)算操作 , 參與運(yùn)算的值必須都是字符串類型的。在 SQL Server 中 , 最常見(jiàn)的字符運(yùn)算符是 +( 字符串連接 ), 該運(yùn)算可以把兩個(gè)字符串連接成一個(gè)字符串。SQL Ser

23、ver 中的常用運(yùn)算符 例319 選出老師工資情況,但對(duì)每位老師都帶上稱呼:老師。SELECT Tname老師, Tsalary FROM T;執(zhí)行結(jié)果見(jiàn)表3.17Tname(無(wú)列名)梁文博老師2600王芳老師3200李剛老師2200王森林老師3500余雪梅老師1880方維偉老師2680例3.19 的運(yùn)行結(jié)果表3.17SQL Server 中的常用運(yùn)算符 日期運(yùn)算符在SQL 語(yǔ)句中表示日期運(yùn)算操作。常用的日期運(yùn)算符是 +, 該運(yùn)算允許一個(gè)日期值 d和一個(gè) n 相加 , 運(yùn)算結(jié)果為一個(gè)日期 d 后 第 n天的日期值 , 也就是說(shuō) , 若 x 的值為日期值2009-1-15, 則 x+10 的值為

24、2009-1-25, 類 似的 ,x-10 的值為2009-1-5。(3) 日期運(yùn)算符 除了運(yùn)算符外 , 還可以在目標(biāo)列表達(dá)式中使用函數(shù)以支持更多的功能 ,常見(jiàn)的函數(shù)包括數(shù)學(xué)函數(shù)、字符函數(shù)、日期函數(shù)等,這部分函數(shù)往往依賴于具體的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),讀者可以依據(jù)自己所采用的系統(tǒng),查詢相關(guān)的技術(shù)手冊(cè)來(lái)使用。 用戶可以通過(guò)指定別名來(lái)改變查詢結(jié)果中的列標(biāo)題 ,這樣我們往往可以將表中英文列名轉(zhuǎn)換成相應(yīng)的中文名稱來(lái)顯示,同時(shí)這對(duì)于含計(jì)算列、常量的目標(biāo)列表達(dá)式尤為有用。 別名的定義格式為 : AS 其中AS可以省略(4) 列的別名 例3.20 在前面的例3., 可以看到其查詢結(jié)果中第二列( 計(jì)算列 Tsal

25、ary *(1-0.0) 的列標(biāo)題為 “ 無(wú)列名 ” ,現(xiàn)希望將其改為:稅后工資,同時(shí)將Tname列改為:教師姓名。 SELECT Tname AS 教師姓名, Tsalary*(1-0.0) AS 稅后工資 FROM T; 或 SELECTTname 教師姓名,Tsalary*(1-0.06)AS 稅后工資 FROMT T;(4) 列的別名執(zhí)行結(jié)果為見(jiàn)下表教師姓名稅后工資梁文博2444王芳3008李剛2068王森林3290余雪梅1767.2方維偉2519.2例3.20 的運(yùn)行結(jié)果 按照關(guān)系的一般理論,重復(fù)的元組是不會(huì)出現(xiàn)在關(guān)系 中的。但是,在實(shí)踐中重復(fù)元組的刪除是相當(dāng)費(fèi)時(shí)的,所以SQL允許在

26、關(guān)系和查詢結(jié)果中出現(xiàn)重復(fù)。在SELECT語(yǔ)句中缺省或ALL是保留重復(fù)元組的,因此一般ALL不寫(xiě)。如果想要強(qiáng)迫刪除重復(fù),則必須使用DISTINCT短語(yǔ)。重復(fù)元組的產(chǎn)生多數(shù)是在投影的情況下。(5) 取消重復(fù)行例3.21 列出已經(jīng)選課了的同學(xué)的學(xué)號(hào)。如果用語(yǔ)句 : SELECT Snum FROM SC;則執(zhí)行結(jié)果為 :Snum 0903330001 0903330001 0903330001 09033300020903330004 0903330005 0903330005 (5) 取消重復(fù)行 顯然,這不是我們希望得到的 結(jié)果,比如學(xué)號(hào)0903330001出現(xiàn)了3次,我們只是關(guān)心那位同學(xué)已經(jīng)選課

27、,而不是關(guān)心選了幾次課,所以,我們不應(yīng)該讓它重復(fù)出現(xiàn)。 于是代碼改為: SELECT DISTINCT Snum FROM SC; 這時(shí)執(zhí)行結(jié)果為:Snum0903330001090333000209033300040903330005(5) 取消重復(fù)行 DISTINCT 關(guān)鍵字的作用就是取消重復(fù)的行。 其語(yǔ)法格式為 : SELECT DISTINCT|ALL與DISTINCT相對(duì)應(yīng)的關(guān)鍵字是ALL, 表示在查詢結(jié)果中保留重復(fù)的行 , 如果 SELECT子句中沒(méi)有指明是DISTINCT 還是 ALL, 則默認(rèn)為 ALL。(5) 取消重復(fù)行FROM 子句的基本功能用于指明查詢所涉及的表 , 其語(yǔ)

28、法結(jié)為 : FROM , 如果FROM關(guān)鍵字后只有一個(gè)基本表名 , 這種查詢稱為單表查詢 , 即僅涉及一個(gè)基本表的查詢。2. FROM 選擇表如果 FROM 關(guān)鍵字后有多個(gè)基本表名 , 這種查詢往往稱為多表查詢 , 查詢結(jié)果中包括了多張基本表中的列 , 這幾張基本表之間還要進(jìn)行連接運(yùn)算 , 而連接條件則要寫(xiě)在WHERE 子句中。2. FROM 選擇表WHERE 子句的基本功能用于指明查詢的條件以選擇行 , 只有滿足查詢條件的行才會(huì)出現(xiàn)在查詢結(jié)果中。如前所述 ,WHERE 子句的功能類似于關(guān)系運(yùn)算中的選擇運(yùn)算。在例3.14中 , 使用的SQL 語(yǔ)句為 : SELECT Tname, Ttitle

29、, Tsalary FROM T WHERE Tsalary=2500; 3.WHERE 選擇行行選擇條件中常用的運(yùn)算符如下表:作用運(yùn)算符比較=,=,=,!=范圍BETWEEN AND, NOT BETWEEN AND集合IN,NOT IN模式匹配LIKE,NOT LIKE空值IS NULL,IS NOT NULL邏輯運(yùn)算NOT,AND,ORSQL提供的比較運(yùn)算符主要有:=、!=、 、=,以及 BETWEEN AND。注意: 和!=都表示不等于。SQL允許使用比較運(yùn)算符比較算術(shù)表達(dá)式和字符串以及特殊類型,如日期等。 例3.22 查詢所有男學(xué)生的信息。 解: SELECT * FROM S WH

30、ERE Ssex= 男;(1) 比較運(yùn)算SnumSnameSsexSageSphoneDnum0903330001張山男1845673434D0020903330002李波濤男2289457321D0030903330005王勁松男2413098765892D003表 3.10執(zhí)行結(jié)果見(jiàn)表3.10例3.22 的運(yùn)行結(jié)果(1) 比較運(yùn)算 例3.23 查詢成績(jī)大于80分的學(xué)生學(xué)號(hào),課程號(hào),成績(jī)。 解: SELECT Snum, Cnum, Score FROM SC WHERE Score80; 執(zhí)行結(jié)果見(jiàn)表3.11SnumCnumScore0903330001C004890903330004C0

31、01850903330005C00192表 3.11例3.23 的運(yùn)行結(jié)果(1) 比較運(yùn)算 例3.24 列出工資在20002600之間的老師姓名和工資情況。 解: SELECT Tname, Tsalary FROM T WHERE Tsalary BETWEEN 2000 AND 2600; 執(zhí)行結(jié)果見(jiàn)表3.12:TnameTsalary梁文博2600李剛2200表3.12例3.24 的運(yùn)行結(jié)果(1) 比較運(yùn)算SQL 中的邏輯運(yùn)算符有 :NOT非 ( 取反)AND與 ( 并且 )OR 或 ( 或者 )如果兩個(gè)邏輯運(yùn)算符同時(shí)出現(xiàn)在同一個(gè)WHERE子句中 , 則 NOT 的優(yōu)先級(jí)最高 ,AND的

32、優(yōu)先級(jí)高于 OR, 當(dāng)然也可以通過(guò)括號(hào)改變優(yōu)先級(jí)。(2) 邏輯運(yùn)算 例3.25 查出年齡不大于18歲的同學(xué)的學(xué)號(hào)、姓名、年齡。 解:SELECT Snum, Sname,SageFROM SWHERE NOT Sage18;執(zhí)行結(jié)果見(jiàn)表3.13SnumSnameSage0903330003岳嵐170903330004王燕170903330006趙玉蘭16表3.13例3.25 的運(yùn)行結(jié)果(2) 邏輯運(yùn)算 例3.26 查詢工資在1960年1月1日以前和1970年12月30 日以后出生的教師信息。 解: SELECT * FROM T WHERE Tbirth1970-12-31; 執(zhí)行結(jié)果見(jiàn)表3.

33、14:TnumTnameTsexTbirthTtitleTsalaryTphoneDnumT003李剛男1979-05-23講師220013809097865D003T004王森林男1950-11-03教授350056784325D001T005余雪梅女1979-03-23助教188013387650643D001表3.14例3.26 的運(yùn)行結(jié)果(2) 邏輯運(yùn)算 空值 NULL 是一個(gè)特殊的數(shù)據(jù) , 在基本表中 ,如果某個(gè)列中沒(méi)有輸入數(shù)據(jù) , 則它的值就為空。如果要判斷某一列的值是否為空 , 不能使用比較運(yùn)算符 = 和 , 而應(yīng)該使用 IS NULL 或 IS NOT NULL 運(yùn)算符。 (3

34、) 空值條件NULL的意義 再次說(shuō)明,空值NULL是一個(gè)特殊值,它看起來(lái)和任何其它值一樣,但它與一般意義上的值又不同: NULL的值是未知的,應(yīng)該有某個(gè)值屬于它, 但不知道。 NULL的值是無(wú)意義的,只是表示一種空缺。 NULL不是常量。盡管NULL值可以出現(xiàn)在元組 中,但不能顯式地將NULL作為操作數(shù)使用。 NULL值與其它任何值(包括另一個(gè)NULL值) 進(jìn)行算術(shù)運(yùn)算,其結(jié)果仍為NULL。 NULL值與其它任何值(包括另一個(gè)NULL值) 進(jìn)行比較運(yùn)算,其結(jié)果為FALSE。 即使兩個(gè)同名分量的值都是NULL值,也不 能認(rèn)為它們相等。例如,當(dāng)我們連接兩個(gè) 關(guān)系時(shí),并不認(rèn)為兩個(gè)NULL分量彼此相等

35、。NULL的意義SnumSname0903330003岳嵐0903330006趙玉蘭 例3.27 列出所有沒(méi)有登記聯(lián)系電話的同學(xué)的姓名和學(xué)號(hào)。 解: SELECT Snum, Sname FROM S WHRER Sphone IS NULL; 執(zhí)行結(jié)果見(jiàn)表3.15表3.15例3.27 的運(yùn)行結(jié)果NULL的意義運(yùn)算符 IN 可以用來(lái)表示數(shù)據(jù)是否屬于指定集合 ,其語(yǔ)法格式為 : NOT IN其中 的格式為 ( 元素值 , 元素值 ), 也就是說(shuō)在SQL中 , 集合的表示法是用圓括號(hào)括起來(lái)的一組元素值 , 元素值之間使用逗號(hào)隔開(kāi)。與 IN 相對(duì)的運(yùn)算符是 NOT IN, 用于表示數(shù)據(jù)不屬于指定集合

36、。 (4) 集合運(yùn)算例3.28 查詢 張山和李波濤兩位學(xué)生的年齡情況。SELECT Sname, Sage FROM SWHERE Sname IN (張山, 李波濤);等價(jià)于SELECT Sname, Sage FROM SWHERE Sname= 張山 OR Sname= 李波濤;執(zhí)行結(jié)果見(jiàn)表3.16。SnameSage張山18李波濤22表3.16例3.28 的運(yùn)行結(jié)果(4) 集合運(yùn)算運(yùn)算符 LIKE 可以用來(lái)進(jìn)行字符串的模式匹配 ,其語(yǔ)法格式為 : NOT LIKE 其含義是查找指定的屬性列值與 相匹配的行 , 可以是一個(gè)普通的字符串 ( 此時(shí)的 LIKE 運(yùn)算就等同于 = 運(yùn)算 , 也

37、可以含有通配符 % 和_。含義分別為:% ( 百分號(hào)):代表任意長(zhǎng)度的字符串。_ (下劃線): 代表任意的單個(gè)字符。(5) 字符串的模式匹配例3.29 列出所有姓王并且姓名為兩個(gè)字的學(xué)生的學(xué)號(hào)、姓名和年齡。解:SELECT Snum, Sname, Sage FROM SWHERE Sname LIKE 王_;執(zhí)行結(jié)果見(jiàn)表3.17SnumSnameSage0903330004王燕17表3.17例3.29 的運(yùn)行結(jié)果(5) 字符串的模式匹配例3.30 查詢聯(lián)系電話不是133開(kāi)頭的教師的姓名和電話。解:SELECT Tname, Tphone FROM TWHERE Tphone NOT LIKE

38、 133%;執(zhí)行結(jié)果見(jiàn)表3.18TnameTphone梁文博8765078王森林56784325表3.18例3.30 的運(yùn)行結(jié)果(5) 字符串的模式匹配 使用 ORDER BY 子句來(lái)指定按照一個(gè)或多個(gè)屬性列的升序(ASC) 或降序 (DESC) 重新排列查詢結(jié)果中的行 ,其中升序(ASC)為默認(rèn)值。格式如下: ORDER BY 列名1ASC|DESC, 列名2ASC|DESC, 首先排列按列名1的值,若列名1的值相等則按列名2的值排列,依次類推。 (6) ORDER BY排序例3.31 按照年齡從小到大列出所有學(xué)生的學(xué)號(hào)、姓名、年齡。SEL

39、ECT Snum,Sname, Sage FROM S ORDER BY Sage;執(zhí)行結(jié)果見(jiàn)表3.19Snum Sname Sage 0903330006趙玉蘭16 0903330003 岳嵐170903330004 王燕170903330001張山180903330002李波濤220903330005王勁松24表3.19例3.31 的運(yùn)行結(jié)果(6) ORDER BY排序例3.32 查詢教師的姓名、職稱和工資。查詢結(jié)果按照職稱排列,職稱相同的按照工資從多到少排列。SELECT Tname, Ttitle, Tsalary FROM TORDER BY Ttitle, Tsalary DESC

40、;執(zhí)行結(jié)果見(jiàn)表3.20TnameTtitleTsalary方維偉副教授2680梁文博副教授2600李剛講師2200王森林教授3500王芳教授3200余雪梅助教1880表3.20例3.32 的運(yùn)行結(jié)果(6) ORDER BY排序一個(gè)數(shù)據(jù)庫(kù)中的多個(gè)表之間一般都存在某種內(nèi)在聯(lián)系 , 它們共同提供有用的信息。前面介紹的簡(jiǎn)單查詢都是針對(duì)一個(gè)表進(jìn)行的, 而在實(shí)際使用中 , 許多有用的查詢要求從兩個(gè)或更多的表中取得數(shù)據(jù) , 這種查詢就被稱為多表查詢。 3.3.2 多表查詢 連接查詢是指兩個(gè)或兩個(gè)以上的基本表或視圖的連接操作來(lái)實(shí)現(xiàn)的查詢。SQL提供了一種簡(jiǎn)單的方法把幾個(gè)關(guān)系連到一個(gè)查詢中,即在FROM子句中列

41、出每個(gè)關(guān)系,然后在SELECT子句和WHERE子句中引用FROM子句中的關(guān)系的屬性,而WHERE子句中用來(lái)連接兩個(gè)關(guān)系的條件稱為連接條件。 FROM子句中多個(gè)表可以用逗號(hào)或者CROSSJOIN分隔。還有一種連接方式采用JOIN ON進(jìn)行條件連接。 1. 連接查詢 當(dāng)一個(gè)查詢請(qǐng)求涉及到數(shù)據(jù)庫(kù)中的多個(gè)表時(shí) , 必須按照一定的條件把這些表連接在一起 , 以便能夠共同提供用戶需要的信息。用來(lái)連接兩個(gè)表的條件稱為連接條件 , 其一般格式為:. 其中的比較運(yùn)算符主要有: = 、 、 = 、 = 、 。 1. 連接查詢例3.33 查詢各個(gè)系中所有老師的姓名和職稱。解:系的情況存放在院系表D中 , 而教師的情

42、況存放在表T中 , 所以本查詢實(shí)際上同時(shí)涉及 D 表和 T表。這兩張表的聯(lián)系是通過(guò)兩張表具有的屬性列Dnum和Dnum實(shí)現(xiàn)的。要查詢教師及其所在系的情況 , 就必須將這兩個(gè)表中Dnum和Dnum相同的行連接起來(lái)。 這是一個(gè)標(biāo)準(zhǔn)的等值連接 , 連接條件是D.Dnum=T.Dnum,在標(biāo)準(zhǔn) SQL 中 , 連接條件在WHERE 子句中給出 , 所以完成本查詢的 SQL 語(yǔ)句為: 1. 連接查詢SELECT D.Dname, T.Tname,T. TtitleFROM D, TWHERE D.Dnum=T.Dnum;執(zhí)行結(jié)果見(jiàn)表3.21DnameTnameTtitle計(jì)算機(jī)梁文博副教授自控王芳教授自

43、控李剛講師計(jì)算機(jī)王森林教授計(jì)算機(jī)余雪梅助教通信方維偉副教授表3.21 例3.33 的運(yùn)行結(jié)果 1. 連接查詢例3.33 中的T表和D表是通過(guò)“=”連接的,這種連接運(yùn)算符為“=”的連接稱為等值連接,若用其它比較運(yùn)算符(如、=、=、)連接,則稱為非等值連接。除了連接條件外,WHERE子句中還可以有其它限制條件,如例3.34。 1. 連接查詢例3.34 查詢自控系所有老師的工資情況。解: SELECT T.Tname, T. Tsalary FROM T, D WHERE T.Dnum=D.Dnum AND D.Dname=自控; 1. 連接查詢執(zhí)行結(jié)果見(jiàn)表3.22TnameTsalary王芳320

44、0李剛2200表3.22例3.34 運(yùn)行結(jié)果 1. 連接查詢例3.35 無(wú)條件連接院系表D 和教師表T。SELECT D.*, Tnum,Tname,Tsex, Tbirth,TtitleTsalary,TphoneFROM D ,T;執(zhí)行結(jié)果 1. 連接查詢DnumDnameDdirectorTnumTnameTsexTbirthTtitleTsalaryTphoneD001計(jì)算機(jī)王森林T001梁文博男1970-04-09副教授1600.087659078D001計(jì)算機(jī)王森林T002王芳女1967-08-05教授2200.013556789056D001計(jì)算機(jī)王森林T003李剛男1979-0

45、5-23講師1200.013809097865D001計(jì)算機(jī)王森林T004王森林男1950-11-03教授2500.056784325D001計(jì)算機(jī)王森林T005余雪梅女1979-03-23助教880.013387650643D001計(jì)算機(jī)王森林T006方維偉男1965-05-03副教授1680.013345678932D002通信方維偉T001梁文博男1970-04-09副教授1600.087659078D002通信方維偉T002王芳女1967-08-05教授2200.013556789056D002通信方維偉T003李剛男1979-05-23講師1200.013809097865D002通

46、信方維偉T004王森林男1950-11-03教授2500.056784325D002通信方維偉T005余雪梅女1979-03-23助教880.013387650643D002通信方維偉T006方維偉男1965-05-03副教授1680.013345678932D003自控王芳T001梁文博男1970-04-09副教授2200.087659078D003自控張小龍T002王芳女1967-08-05教授1200.013556789056D003自控張小龍T003李剛男1979-05-23講師2500.013809097865D003自控張小龍T004王森林男1950-11-03教授880.0567

47、84325D003自控張小龍T005余雪梅女1979-03-23助教1680.013387650643D0033自控張小龍T006方維偉男1965-05-03副教授2200.013345678932例3.36 從學(xué)生表S、課程表C和選修表SC三個(gè)表中,查詢學(xué)生姓名、所修課程及成績(jī)。解:SELECT Sname, Cname, scoreFROM S, C, SCWHERE S.Snum=SC.Snum AND SC.Cnum=C.Cnum;二個(gè)以上表的連接 執(zhí)行結(jié)果見(jiàn)表3.24 SnumSname Cname Score 0903330001張山 C程序設(shè)計(jì) 530903330001張山 自動(dòng)

48、控制原理 890903330001張山 數(shù)據(jù)結(jié)構(gòu) 650903330002李波濤 自動(dòng)控制原理 75 0903330004王燕 數(shù)據(jù)庫(kù)系統(tǒng)原理 85 0903330005王勁松數(shù)據(jù)庫(kù)系統(tǒng)原理92 0903330005王勁松計(jì)算機(jī)體系結(jié)構(gòu)76 表3.24例3.36 的運(yùn)行結(jié)果二個(gè)以上表的連接 例3.37 查詢所有年齡相同的學(xué)生的姓名和年齡。解:SELECT S1.Sname,S2.Sname,S1.SageFROM S S1,S S2WHERE S1. Sage=S2. SageAND S1.SnumS2.Snum;自身連接執(zhí)行結(jié)果見(jiàn)表3.25SnameSnameSage岳嵐王燕17表 3.25

49、例3.37 的運(yùn)行結(jié)果自身連接在前面的連接示例中 , 結(jié)果集中只保留了符合連接條件的元組 , 而排除了兩個(gè)表中沒(méi)有對(duì)應(yīng)的或匹配的元組情況 , 這種連接稱為內(nèi)連接。如果要求查詢結(jié)果集中保留非匹配的元組 , 就要執(zhí)行外部連接操作。外連接外連接分類 SQL 的外部連接分左外部連接和右外部連接和全外連接三種 : 左外部連接操作是在結(jié)果集中保留連接表達(dá)式左表中的非匹配記錄 ;右外部連接操作是在結(jié)果集中保留連接表達(dá)式右表中的非匹配記錄。外部連接中不匹配的列用NULl表示。SQL 中左外部連接符號(hào)為 *=,右外部連接符號(hào)為 =* 。外部連接中不匹 配的列用 NULL 表示。SQL-2006標(biāo)準(zhǔn)所定義的FRO

50、M子句的連接語(yǔ)法格式為:FROM join_table1 join_type join_table2 ON (join_condition)。其中join_table1和join_table2指出參與連接操作的表名,連接可以對(duì)同一個(gè)表操作,也可以對(duì)多表操作,對(duì)同一個(gè)表操作的連接就是自身連接。join_type 指出連接類型是內(nèi)連接還是外連接。 內(nèi)連接用INNER JOIN或者JOIN.外連接分類外連接分為左外連接(LEFT OUTER JOIN或LEFT JOIN)、右外連接(RIGHT OUTER JOIN或RIGHT JOIN)和全外連接(FULL OUTER JOIN或FULL JOIN

51、)三種。 連接操作中的ON (join_condition) 子句指出連接條件,它由被連接表中的列和比較運(yùn)算符、邏輯運(yùn)算符等構(gòu)成。 外連接分類例3.38 查詢各個(gè)系中所有老師的系名、系編號(hào)、姓名、教師號(hào)和職稱,用左連接完成。解:SELECT D.Dname,T.Tnum, T.Tname,T. TtitleFROM DLEFT OUTER JOIN ON TON D.Dnum=T.Dnum;外連接分類執(zhí)行結(jié)果見(jiàn)表3.25DnameTnumTnameTtitle計(jì)算機(jī)T001梁文博副教授計(jì)算機(jī)T004王森林教授計(jì)算機(jī)T005余雪梅助教通信T006方維偉副教授自控T002王芳教授自控T003李剛講

52、師外語(yǔ)NULLNULLNULL表3.25例3.38 的運(yùn)行結(jié)果外連接分類1. 聚合函數(shù)聚合(Aggregation)是指把關(guān)系中的某一列的一系列的值形成單一值的運(yùn)算。它是對(duì)關(guān)系整體的一種運(yùn)算。SQL提供了五個(gè)聚合函數(shù),可以用于列信息的統(tǒng)計(jì)或匯總。 COUNT(DISTINCT|ALL * ) 統(tǒng)計(jì)一列中的值的個(gè)數(shù) AVG(DISTINCT |ALL) 求某一列值的平均值 ( 此列必須是數(shù)值型 ) 3.3.3 聚合和分組 SUM(DISTINCT |ALL)求某一列值的總和 ( 此列必須是數(shù)值型 ) MIN(DISTINCT |ALL)求某一列值的最小值 MAX(DISTINCT |ALL)求某

53、一列值的最大值如果指定 DISTINCT, 則表示在計(jì)算時(shí)忽略指定列的重復(fù)值。如果不指定 DISTINCT或指定了 ALL (ALL 為默認(rèn)值 ), 則不忽略重復(fù)值。1. 聚合函數(shù)(無(wú)列名)6 例3.39 查詢學(xué)生總數(shù)。解: SELECT COUNT(distinct snum) FROM Sc; 執(zhí)行結(jié)果: 這里的星號(hào)(*)表示整個(gè)元組。這是COUNT()函數(shù)特有的,表示統(tǒng)計(jì)元組的個(gè)數(shù),其它聚合函數(shù)的作用超過(guò)一列則是沒(méi)有意義的。注意星號(hào)(*)和DISTINCT|ALL 不能同時(shí)出現(xiàn)。 1. 聚合函數(shù)例3.40 對(duì)教師的工資差異進(jìn)行比較,找到最高工資和最低工資。解: SELECT MAX(Ts

54、alary) AS 最高工資, MIN(Tsalary) AS 最低工資 FROM T;執(zhí)行結(jié)果如下:最高工資最低工資 350018801. 聚合函數(shù)前面的幾個(gè)例子完成的是對(duì)表中所有選出的元組進(jìn)行統(tǒng)計(jì)運(yùn)算,其計(jì)算結(jié)果中只有一行,但在實(shí)際應(yīng)用中,經(jīng)常需要將查詢結(jié)果進(jìn)行分組,然后再對(duì)每個(gè)分組進(jìn)行統(tǒng)計(jì),如:按系統(tǒng)計(jì)學(xué)生人數(shù),按工廠統(tǒng)計(jì)工人平均工資等。這些查詢的結(jié)果中一般都會(huì)有多行。SQL語(yǔ)言提供了GROUP BY子句和HAVING子句來(lái)實(shí)現(xiàn)分組統(tǒng)計(jì)。2.分組統(tǒng)計(jì)例3.41計(jì)算不同職稱的老師的工資情況。SELECT Ttitle AS 職稱, AVG(Tsalary) AS 平均工資,count(tn

55、um) as FROM TGROUP BY Ttitle;執(zhí)行結(jié)果見(jiàn)表3.27人數(shù)職稱平均工資2副教授26401講師22002教授33501助教1880表3.27例3.41 的運(yùn)行結(jié)果2.分組統(tǒng)計(jì)例3.42 按照性別統(tǒng)計(jì)學(xué)生人數(shù)。解: SELECT Ssex, COUNT(*) FROM S GROUP BY Ssex;執(zhí)行結(jié)果見(jiàn)表3.28Ssex(無(wú)列名)男3女3表3.28例3.42 的運(yùn)行結(jié)果2.分組統(tǒng)計(jì)例3.42 每個(gè)學(xué)生可能選了多門(mén)課程,查詢每個(gè)學(xué)生的學(xué)號(hào)、姓名和相應(yīng)的課程平均成績(jī)。SELECT S.Snum, Sname,AVG(score)FROM S,SCWHERE S.Snum

56、=SC.SnumGROUP BY S.Snum,sname;執(zhí)行結(jié)果:2.分組統(tǒng)計(jì)Snum Sname (無(wú)列名) S001 張山 69.0 S002李新 75.0 S004 王燕 85.0 S005 王力 84.0 2.分組統(tǒng)計(jì)例3.43 統(tǒng)計(jì)各系的學(xué)生人數(shù) , 顯示各系的名稱和學(xué)生人數(shù)。解: 本例需要使用多表查詢 ,SQL 語(yǔ)句為:SELECT D.Dname AS 系,COUNT(*) AS 學(xué)生人數(shù)FROM D,SWHERE D.Dnum=S.DnumGROUP BY D.Dname在分組查詢中使用多表連接 , 進(jìn)行統(tǒng)計(jì)2.分組統(tǒng)計(jì)執(zhí)行結(jié)果 系 學(xué)生人數(shù) 計(jì)算機(jī) 3通信 1自控 22.

57、分組統(tǒng)計(jì)有時(shí)我們希望對(duì)所分的組按某一條件進(jìn)行選擇,可以用HAVING子句實(shí)現(xiàn)。例3.44 查詢平均成績(jī)低于80分的學(xué)生學(xué)號(hào)。 SELECT Snum FROM SC GROUP BY Snum HAVING AVG(score) 、 = 、 = 、 等.2. 使用比較運(yùn)算符的子查詢例3.49 列出工資低于教師平均工資的老師的編號(hào)、姓名、工資情況。SELECT Tnum,Tname,Tsalary FROM T WHERE TsalaryANY R為真,否則為假;若s比R中至少一個(gè)值小,則sALL R為真,否則為假;若s比R中每個(gè)值小,則sALL R為真,否則為假。同理其它比較運(yùn)算符可與ALL搭

58、配。如sANY R和s NOT IN R是相同的,可以互相替換,但一般多采用NOT IN,因?yàn)槿菀桌斫狻?. 使用比較運(yùn)算符的子查詢例350 查詢教師中工資比自控系任一教師低的教師編號(hào)、姓名和工資。SELECT Tnum,Tname, Tsalary FROM T WHERE Tsalary ANY (SELECT Tsalary FROM T WHERE Dnum IN (SELECT Dnum FROM D WHERE Dname=自控 )2. 使用比較運(yùn)算符的子查詢執(zhí)行結(jié)果:TnumTnameTsalaryT001梁文博2600.0T003李剛2200.0T005余雪梅1880.0T00

59、6方維偉2680.02. 使用比較運(yùn)算符的子查詢例 3.51查詢年齡最低的學(xué)生的學(xué)號(hào),姓名和年齡 SELECT Snum,Sname,SageFROM SWHERE Sage 19) 5 組合查詢SnumSname0903330001張山0903330002李波濤0903330004王燕0903330005王勁松從上面的例子可以看出,UNION 對(duì)查詢塊 1 和查詢塊 2 的結(jié)果集合并為一個(gè)結(jié)果集 , 要求這兩個(gè)結(jié)果集的結(jié)構(gòu)相同。所謂結(jié)構(gòu)相同就是指集合中列的個(gè)數(shù)、類型和順序必須一樣。 5 組合查詢 (2) 交操作交操作(INTERSECT)是把同時(shí)出現(xiàn)在這些查詢結(jié)果中的元組取出。INTERSE

60、CT操作也會(huì)自動(dòng)去掉重復(fù)元組,如果要保留所有重復(fù),必須用INTERSECT ALL代替INTERSECT。因?yàn)榻徊僮骺梢栽赪HERE子句中加一邏輯運(yùn)算符AND簡(jiǎn)單實(shí)現(xiàn),所以實(shí)際上很少直接用到交操作。 5 組合查詢 (3) 差操作差操作(MINUS)是把出現(xiàn)在第一個(gè)查詢結(jié)果中,但不出現(xiàn)在第二個(gè)查詢結(jié)果中的元組取出。因?yàn)椴钜部梢栽赪HERE子句中加一邏輯運(yùn)算符AND簡(jiǎn)單實(shí)現(xiàn),只是將某個(gè)邏輯條件取反即可,所以實(shí)際上也很少直接用到交操作。 5 組合查詢遞歸查詢的概念是新標(biāo)準(zhǔn)SQL3中引入的,SQL3 實(shí)現(xiàn)遞歸查詢的方法是以關(guān)系邏輯為基礎(chǔ)的。在SQL3 中 , 可以通過(guò)關(guān)鍵字WITH 引導(dǎo)的語(yǔ)句來(lái)實(shí)現(xiàn)關(guān)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論