《數(shù)據(jù)庫(kù)技術(shù)與應(yīng)用》電子課件
《數(shù)據(jù)庫(kù)技術(shù)與應(yīng)用》電子課件,數(shù)據(jù)庫(kù)技術(shù)與應(yīng)用,數(shù)據(jù)庫(kù)技術(shù),應(yīng)用,電子,課件
第四章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL0本章學(xué)習(xí)目標(biāo)l 理解理解SQLSQL的基本概念,掌握的基本概念,掌握SQLSQL語(yǔ)言的功能、特點(diǎn)。語(yǔ)言的功能、特點(diǎn)。l 熟悉熟悉SQLSQL語(yǔ)言所支持的基本數(shù)據(jù)類型。語(yǔ)言所支持的基本數(shù)據(jù)類型。l 掌握如何定義基本表、模式和索引。掌握如何定義基本表、模式和索引。l 理解視圖的概念和作用,掌握視圖的定義和刪除方法。理解視圖的概念和作用,掌握視圖的定義和刪除方法。l 掌握掌握SQLSQL語(yǔ)言查詢語(yǔ)句的結(jié)構(gòu)并熟練掌握其用法。語(yǔ)言查詢語(yǔ)句的結(jié)構(gòu)并熟練掌握其用法。l 掌握數(shù)據(jù)更新語(yǔ)句的結(jié)構(gòu)并熟練掌握其用法。掌握數(shù)據(jù)更新語(yǔ)句的結(jié)構(gòu)并熟練掌握其用法。l 了解嵌入式了解嵌入式SQLSQL的作用及其需要解決的問(wèn)題。的作用及其需要解決的問(wèn)題。1本章概述 SQL(Structured Query Language)SQL(Structured Query Language),即結(jié)構(gòu)化查詢語(yǔ)言,是一種數(shù),即結(jié)構(gòu)化查詢語(yǔ)言,是一種數(shù)據(jù)庫(kù)查詢和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)查詢和程序設(shè)計(jì)語(yǔ)言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。據(jù)庫(kù)系統(tǒng)。SQLSQL功能極強(qiáng),具有通用性,目前已成為關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)功能極強(qiáng),具有通用性,目前已成為關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,幾乎所有的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)都支持語(yǔ)言,幾乎所有的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)都支持SQLSQL語(yǔ)言。語(yǔ)言。SQLSQL成為國(guó)際標(biāo)成為國(guó)際標(biāo)準(zhǔn)后,對(duì)數(shù)據(jù)庫(kù)以外的領(lǐng)域也產(chǎn)生了很大影響,有不少軟件產(chǎn)品將準(zhǔn)后,對(duì)數(shù)據(jù)庫(kù)以外的領(lǐng)域也產(chǎn)生了很大影響,有不少軟件產(chǎn)品將SQLSQL語(yǔ)言的數(shù)據(jù)查詢功能與圖形功能、軟件工程工具、軟件開(kāi)發(fā)工具、人工語(yǔ)言的數(shù)據(jù)查詢功能與圖形功能、軟件工程工具、軟件開(kāi)發(fā)工具、人工智能程序結(jié)合起來(lái)。因此,關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言智能程序結(jié)合起來(lái)。因此,關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSQL是本門(mén)課程的學(xué)習(xí)是本門(mén)課程的學(xué)習(xí)重點(diǎn)。重點(diǎn)。本章首先介紹本章首先介紹SQLSQL的產(chǎn)生背景、功能及特點(diǎn)、的產(chǎn)生背景、功能及特點(diǎn)、SQLSQL語(yǔ)言的數(shù)據(jù)定義功語(yǔ)言的數(shù)據(jù)定義功能,包括能,包括SQLSQL所支持的數(shù)據(jù)類型,如何定義基本表、索引和模式;接著所支持的數(shù)據(jù)類型,如何定義基本表、索引和模式;接著重點(diǎn)講解如何用重點(diǎn)講解如何用SQLSQL語(yǔ)言進(jìn)行數(shù)據(jù)庫(kù)查詢操作;然后討論視圖機(jī)制的作語(yǔ)言進(jìn)行數(shù)據(jù)庫(kù)查詢操作;然后討論視圖機(jī)制的作用,以及如何使用視圖進(jìn)行查詢;最后介紹嵌入式用,以及如何使用視圖進(jìn)行查詢;最后介紹嵌入式SQLSQL。2主要內(nèi)容4.1 SQL概述4.3 數(shù)據(jù)查詢4.4 數(shù)據(jù)更新4.5 視圖4.2 數(shù)據(jù)定義4.6嵌入式SQL34.1 SQL 概述4.1 SQL概述4.1.1 SQL4.1.1 SQL的產(chǎn)生與發(fā)展的產(chǎn)生與發(fā)展4.1.2 SQL4.1.2 SQL的功能的功能4.1.3 SQL4.1.3 SQL的特點(diǎn)的特點(diǎn)44.1.1 SQL的產(chǎn)生和發(fā)展1970-19801986-198719992003由由 IBM開(kāi)開(kāi) 發(fā)發(fā),最最 初初 叫叫SEQUEL。1980年年改改名名為為SQL美國(guó)批準(zhǔn)美國(guó)批準(zhǔn)SQL作為美國(guó)標(biāo)準(zhǔn),隨后作為美國(guó)標(biāo)準(zhǔn),隨后ISO也通過(guò)這一標(biāo)準(zhǔn)也通過(guò)這一標(biāo)準(zhǔn)1989年公布了年公布了SQL/89標(biāo)準(zhǔn)標(biāo)準(zhǔn)1992年公布了年公布了SQL/92(SQL2)標(biāo)準(zhǔn)標(biāo)準(zhǔn)公布了公布了SQL/99,也稱作,也稱作SQL3公布了公布了SQL/2003,也稱也稱作作SQL41989-1992發(fā)布日期標(biāo)準(zhǔn)大致頁(yè)數(shù)1986年SQL/861989年SQL/89120頁(yè)1992年SQL/92(SQL2)622頁(yè)1999年SQL/99(SQL3)1700頁(yè)2003年SQL2003(SQL4)3600頁(yè)SQL標(biāo)準(zhǔn)的發(fā)展過(guò)程54.1.1 SQL的產(chǎn)生和發(fā)展 作為關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,作為關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,SQLSQL是一種介于關(guān)系代數(shù)與關(guān)系演是一種介于關(guān)系代數(shù)與關(guān)系演算之間的結(jié)構(gòu)化查詢語(yǔ)言,但其功能并不僅僅是查詢。算之間的結(jié)構(gòu)化查詢語(yǔ)言,但其功能并不僅僅是查詢。SQLSQL是一個(gè)使是一個(gè)使用廣泛、功能強(qiáng)大的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言。它的功能涵蓋數(shù)據(jù)定義、數(shù)據(jù)用廣泛、功能強(qiáng)大的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言。它的功能涵蓋數(shù)據(jù)定義、數(shù)據(jù)操作操作(包括查詢和更新包括查詢和更新)和數(shù)據(jù)控制。和數(shù)據(jù)控制。如今無(wú)論是像如今無(wú)論是像OracleOracle、SybaseSybase、DB2DB2、InformixInformix、SQL ServerSQL Server這這些大型的數(shù)據(jù)庫(kù)管理系統(tǒng),還是像些大型的數(shù)據(jù)庫(kù)管理系統(tǒng),還是像Visual FoxproVisual Foxpro、PowerBuilderPowerBuilder這這些些PCPC上常用的數(shù)據(jù)庫(kù)開(kāi)發(fā)系統(tǒng),都支持上常用的數(shù)據(jù)庫(kù)開(kāi)發(fā)系統(tǒng),都支持SQLSQL語(yǔ)言作為查詢語(yǔ)言。語(yǔ)言作為查詢語(yǔ)言。64.1.2 SQL的功能 SQLSQL語(yǔ)言具有定義、查詢、更新、控制等功能,是一種綜合語(yǔ)言具有定義、查詢、更新、控制等功能,是一種綜合的、通用的、功能強(qiáng)大的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,其主要功能包括:的、通用的、功能強(qiáng)大的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,其主要功能包括:數(shù)據(jù)數(shù)據(jù)定義定義數(shù)據(jù)數(shù)據(jù)控制控制通過(guò)數(shù)據(jù)定義語(yǔ)言DDL來(lái)實(shí)現(xiàn),主要用于定義、刪除和修改關(guān)系數(shù)據(jù)庫(kù)中的對(duì)象,數(shù)據(jù)庫(kù)對(duì)象主要包括基本表、視圖等。CREATE、DROP、ALTERSQL的功能數(shù)據(jù)數(shù)據(jù)查詢查詢數(shù)據(jù)數(shù)據(jù)操縱操縱運(yùn)用SELECT語(yǔ)句實(shí)現(xiàn)查詢數(shù)據(jù)的功能,數(shù)據(jù)查詢功能是數(shù)據(jù)庫(kù)中使用最多的操作。SELECT通過(guò)數(shù)據(jù)操縱語(yǔ)言DML來(lái)實(shí)現(xiàn),主要用于增加、刪除和修改數(shù)據(jù)庫(kù)中的數(shù)據(jù)。INSERT、UPDATE、DELETE通過(guò)數(shù)據(jù)庫(kù)控制語(yǔ)言DCL來(lái)實(shí)現(xiàn),主要用來(lái)控制用戶對(duì)數(shù)據(jù)庫(kù)的操作權(quán)限,包括數(shù)據(jù)庫(kù)安全控制和事務(wù)管理兩部分。GRANT、REVOKE74.1.3 SQL的特點(diǎn)p1 1、綜合統(tǒng)一、綜合統(tǒng)一SQL語(yǔ)言集數(shù)據(jù)定義語(yǔ)言DDL、數(shù)據(jù)操縱語(yǔ)言DML、數(shù)據(jù)控制語(yǔ)言DCL的功能于一體,語(yǔ)言風(fēng)格統(tǒng)一,可以獨(dú)立完成數(shù)據(jù)庫(kù)生命周期中的全部活動(dòng)。p2 2、高度非過(guò)程化、高度非過(guò)程化用SQL進(jìn)行數(shù)據(jù)操作,用戶只需要指出“做什么”,而不需要指出“怎么做”,減輕了用戶負(fù)擔(dān),并且有利于提高數(shù)據(jù)獨(dú)立性。p3 3、面向集合的操作方式、面向集合的操作方式SQL采用集合操作方式。不僅查詢的結(jié)果可以是元組的集合,而且一次插入、更新、刪除操作的對(duì)象也可以是元組的集合。p4 4、支持關(guān)系數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)、支持關(guān)系數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)SQL語(yǔ)言支持?jǐn)?shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)。其中外模式對(duì)應(yīng)于視圖和部分基本表,模式對(duì)應(yīng)于基本表,內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件。p5 5、簡(jiǎn)潔易學(xué),靈活易用、簡(jiǎn)潔易學(xué),靈活易用語(yǔ)言簡(jiǎn)潔、語(yǔ)法簡(jiǎn)單,所有核心功能只需要9個(gè)動(dòng)詞。使用方式靈活,用戶不僅可以輸入SQL語(yǔ)句來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,還可以將SQL語(yǔ)句嵌入到其他高級(jí)語(yǔ)言程序中來(lái)使用。84.1.3 SQL的特點(diǎn) SQL SQL的數(shù)據(jù)定義語(yǔ)言的數(shù)據(jù)定義語(yǔ)言DDLDDL包括模式定義、表定義、視圖和索引的定義包括模式定義、表定義、視圖和索引的定義等。本節(jié)主要介紹如何定義模式、基本表和索引,視圖的概念及其定等。本節(jié)主要介紹如何定義模式、基本表和索引,視圖的概念及其定義方法將在義方法將在4.54.5節(jié)專門(mén)討論。節(jié)專門(mén)討論。操作對(duì)象操作方式創(chuàng)建刪除修改模式CREATE SCHEMADROP SCHEMA表CREATE TABLEDROP TABLEALTER TABLE視圖CREATE VIEWDROP VIEW索引CREATE INDEXDROP INDEXSQL的數(shù)據(jù)定義語(yǔ)句94.2 數(shù)據(jù)定義4.2 數(shù)據(jù)定義4.2.1 SQL4.2.1 SQL的數(shù)據(jù)類型的數(shù)據(jù)類型4.2.2 4.2.2 模式的定義和刪除模式的定義和刪除4.2.3 4.2.3 基本表的定義、修改和刪除基本表的定義、修改和刪除4.2.4 4.2.4 索引的建立和刪除索引的建立和刪除104.2.1 SQL的數(shù)據(jù)類型數(shù)據(jù)類型說(shuō)明CHAR(n)定義長(zhǎng)度為n的定長(zhǎng)字符串VARCHAR(n)定義長(zhǎng)度為n的變長(zhǎng)字符串INT長(zhǎng)整數(shù)SMALLINT短整數(shù)NUMERIC(p,d)定點(diǎn)數(shù),由p位數(shù)字組成,小數(shù)點(diǎn)后有d位數(shù)字REAL浮點(diǎn)數(shù)(取決于機(jī)器精度)Double Precision雙精度浮點(diǎn)數(shù)(取決于機(jī)器精度)FLOAT(n)浮點(diǎn)數(shù),精度至少為n位數(shù)字DATE日期,包含年、月、日,格式為YYYY-MM-DDTIME時(shí)間,包含時(shí)、分、秒,格式為:HH:MM:SSTIMESTAMP時(shí)間戳,包含年、月、日、時(shí)、分、秒數(shù)據(jù)類型是數(shù)據(jù)的一種屬性,表示數(shù)據(jù)所表示信息的類型。定義表的各個(gè)屬性數(shù)據(jù)類型是數(shù)據(jù)的一種屬性,表示數(shù)據(jù)所表示信息的類型。定義表的各個(gè)屬性時(shí)需要指明數(shù)據(jù)類型及長(zhǎng)度,下表列舉了時(shí)需要指明數(shù)據(jù)類型及長(zhǎng)度,下表列舉了SQLSQL提供的一些主要數(shù)據(jù)類型。提供的一些主要數(shù)據(jù)類型。一個(gè)屬性應(yīng)該選用哪種一個(gè)屬性應(yīng)該選用哪種數(shù)據(jù)類型要根據(jù)數(shù)據(jù)類型要根據(jù)實(shí)際情實(shí)際情況況來(lái)決定,一般從兩方來(lái)決定,一般從兩方面考慮,一是面考慮,一是取值范圍取值范圍,二是二是要做哪些運(yùn)算要做哪些運(yùn)算。注意:不同的注意:不同的RDBMSRDBMS中支持的數(shù)據(jù)類型不完全相同。中支持的數(shù)據(jù)類型不完全相同。114.2.1 SQL的數(shù)據(jù)類型本章用圖書(shū)-借閱數(shù)據(jù)庫(kù)作為例子來(lái)講解SQL語(yǔ)言,包括三張表:圖書(shū)表:圖書(shū)表:(圖書(shū)編號(hào),書(shū)名,圖書(shū)類別,作者圖書(shū)編號(hào),書(shū)名,圖書(shū)類別,作者)books(books(bnobno,bname,bname,btype,btype,author)author)讀者表:讀者表:(讀者編號(hào),姓名,性別,年齡,專業(yè)讀者編號(hào),姓名,性別,年齡,專業(yè))reader(reader(rnorno,rname,rname,sex,sex,age,age,dept)dept)借閱表:借閱表:(圖書(shū)編號(hào),讀者編號(hào),借閱天數(shù)圖書(shū)編號(hào),讀者編號(hào),借閱天數(shù))lend(lend(bno,rno,bno,rno,lendtime)lendtime)加下劃線表示的是關(guān)系的主碼。加下劃線表示的是關(guān)系的主碼。124.2.2 模式的定義和刪除l1.1.定義模式定義模式在在SQLSQL中,模式定義語(yǔ)句如下:中,模式定義語(yǔ)句如下:CREATE SCHEMA CREATE SCHEMA AUTHORIZATION AUTHORIZATION 如果沒(méi)有指定如果沒(méi)有指定 ,那么,那么 隱含為用戶名。隱含為用戶名。調(diào)用創(chuàng)建模式命令的用戶必須擁有調(diào)用創(chuàng)建模式命令的用戶必須擁有DBADBA權(quán)限,或者獲得了權(quán)限,或者獲得了DBADBA授予的授予的CREATE CREATE SCHEMASCHEMA權(quán)限。權(quán)限。l 例例4-1 4-1 定義一個(gè)圖書(shū)借閱模式定義一個(gè)圖書(shū)借閱模式B-LB-L。CREATE SCHEMA B-L AUTHORIZATION ZHANGCREATE SCHEMA B-L AUTHORIZATION ZHANG本語(yǔ)句的含義是為用戶本語(yǔ)句的含義是為用戶ZHANGZHANG定義了一個(gè)模式定義了一個(gè)模式B-LB-L。l 例例4-24-2CREATE SCHEMA AUTHORIZATION ZHANGCREATE SCHEMA AUTHORIZATION ZHANG未指定未指定 ,則,則 隱含為用戶名隱含為用戶名ZHANGZHANG。134.2.2 模式的定義和刪除l定定義義模模式式實(shí)實(shí)際際上上定定義義了了一一個(gè)個(gè)命命名名空空間間,這這個(gè)個(gè)空空間間中中可可以以進(jìn)進(jìn)一一步步定定義義該該模式所包含的數(shù)據(jù)對(duì)象,例如基本表、視圖、索引等。模式所包含的數(shù)據(jù)對(duì)象,例如基本表、視圖、索引等。在在CREATE CREATE SCHEMASCHEMA中中可可以以使使用用CREATE CREATE TABLETABLE,CREATE CREATE VIEWVIEW,GRANTGRANT子子句句。用用戶戶可可以以在在創(chuàng)創(chuàng)建建模模式式的的同同時(shí)時(shí)在在這這個(gè)個(gè)模模式式定定義義中中創(chuàng)創(chuàng)建建基基本本表表、視視圖圖以以及及定定義義授授權(quán)。權(quán)。CREATE SCHEMA CREATE SCHEMA AUTHORIZATION AUTHORIZATION|l 例例4-3 4-3 創(chuàng)建模式創(chuàng)建模式TESTTEST。CREATE SCHEMA TEST AUTHORIZATION ZHANG CREATE SCHEMA TEST AUTHORIZATION ZHANG CREATE TABLE student(sno VARCHAR(10),CREATE TABLE student(sno VARCHAR(10),sname VARCHAR(20);sname VARCHAR(20);本本語(yǔ)語(yǔ)句句的的含含義義是是為為用用戶戶ZHANGZHANG創(chuàng)創(chuàng)建建了了一一個(gè)個(gè)模模式式TESTTEST,并并且且在在其其中中定定義義了了一一個(gè)個(gè)表表studentstudent。144.2.2 模式的定義和刪除l2.2.刪除模式刪除模式在在SQLSQL中,刪除模式的語(yǔ)句如下:中,刪除模式的語(yǔ)句如下:DROP SCHEMA 模式只能被它的模式只能被它的所有者所有者或者或者超級(jí)用戶超級(jí)用戶刪除。刪除。CASCADECASCADE:表示模式的刪除:表示模式的刪除沒(méi)有條件限制沒(méi)有條件限制。在刪除模式的同時(shí),自動(dòng)刪除。在刪除模式的同時(shí),自動(dòng)刪除模式中包含的對(duì)象。如果要?jiǎng)h除模式及其所有對(duì)象,使用模式中包含的對(duì)象。如果要?jiǎng)h除模式及其所有對(duì)象,使用CASCADECASCADE級(jí)聯(lián)刪級(jí)聯(lián)刪除。除。RESTRICTRESTRICT:表示模式的刪除:表示模式的刪除有條件限制有條件限制。如果模式中包含任何對(duì)象。如果模式中包含任何對(duì)象(如表、如表、函數(shù)等函數(shù)等),則拒絕刪除該模式。,則拒絕刪除該模式。缺省缺省為為RESTRICTRESTRICT。l 例例4-4 4-4 刪除模式刪除模式TESTTEST。DROP SCHEMA TEST CASCADEDROP SCHEMA TEST CASCADE 該語(yǔ)句刪除了模式該語(yǔ)句刪除了模式TESTTEST,該模式中已經(jīng)定義的表,該模式中已經(jīng)定義的表studentstudent也同時(shí)被刪除。也同時(shí)被刪除。154.2.3 基本表的定義、修改和刪除-定義基本表l1.1.定義基本表定義基本表在在SQLSQL中,定義基本表的語(yǔ)句如下:中,定義基本表的語(yǔ)句如下:CREATE TABLE CREATE TABLE (,););:所要定義的基本表的名字:所要定義的基本表的名字 :組成該表的各個(gè)屬性:組成該表的各個(gè)屬性(列列):涉及相應(yīng)屬性列的完整性約束條件:涉及相應(yīng)屬性列的完整性約束條件 :涉及一個(gè)或多個(gè)屬性列的完整性約束條件:涉及一個(gè)或多個(gè)屬性列的完整性約束條件164.2.3 基本表的定義、修改和刪除-定義基本表l常用完整性約束有:常用完整性約束有:PRIMARY PRIMARY KEYKEY約束約束:主鍵約束。用于保證主鍵的唯一性和非空性。:主鍵約束。用于保證主鍵的唯一性和非空性。FOREIGN KEYFOREIGN KEY約束約束:參照完整性約束,也稱為外鍵約束,用來(lái)維護(hù)兩個(gè)基:參照完整性約束,也稱為外鍵約束,用來(lái)維護(hù)兩個(gè)基本表之間的一致性關(guān)系。本表之間的一致性關(guān)系。UNIQUEUNIQUE約束約束:唯一性約束。即不允許列中出現(xiàn)重復(fù)的屬性值。:唯一性約束。即不允許列中出現(xiàn)重復(fù)的屬性值。NOT NULLNOT NULL約束約束:非空值約束。即不允許屬性值為空。:非空值約束。即不允許屬性值為空。DEFAULTDEFAULT約束約束:默認(rèn)值約束。通常將列中使用頻率高的屬性值定義為:默認(rèn)值約束。通常將列中使用頻率高的屬性值定義為DEFAULTDEFAULT約束中的默認(rèn)值,用以減少數(shù)據(jù)輸入量。約束中的默認(rèn)值,用以減少數(shù)據(jù)輸入量。CHECKCHECK約束約束:檢查約束。:檢查約束。CHECKCHECK約束通過(guò)約束條件表達(dá)式來(lái)設(shè)置列值應(yīng)該滿約束通過(guò)約束條件表達(dá)式來(lái)設(shè)置列值應(yīng)該滿足的條件。足的條件。建表的同時(shí)通常還可以定義與建表的同時(shí)通常還可以定義與該表有關(guān)的完整性約束條件該表有關(guān)的完整性約束條件,這些完整,這些完整性約束條件被存入系統(tǒng)的性約束條件被存入系統(tǒng)的數(shù)據(jù)字典數(shù)據(jù)字典中,當(dāng)用戶操作表中數(shù)據(jù)時(shí)由中,當(dāng)用戶操作表中數(shù)據(jù)時(shí)由DBMSDBMS自動(dòng)自動(dòng)檢查檢查該操作是否違背這些完整性約束條件。該操作是否違背這些完整性約束條件。需要注意的是需要注意的是,如果完整性約,如果完整性約束條件涉及到該表的束條件涉及到該表的多個(gè)屬性列多個(gè)屬性列,則,則必須必須定義在定義在表級(jí)表級(jí)上,否則既可以定義上,否則既可以定義在列級(jí)也可以定義在表級(jí)。在列級(jí)也可以定義在表級(jí)。174.2.3 基本表的定義、修改和刪除-定義基本表l 例例4-5 4-5 創(chuàng)建讀者表創(chuàng)建讀者表readerreader。CREATE TABLE reader(CREATE TABLE reader(rno VARCHAR(10)PRIMARY KEY,rno VARCHAR(10)PRIMARY KEY,name VARCHAR(8)NOT NULL,name VARCHAR(8)NOT NULL,sex CHAR(2)CHECK(sex=sex CHAR(2)CHECK(sex=男男 OR sex=OR sex=女女),),age SMALLINT,age SMALLINT,dept VARCHAR(20)dept VARCHAR(20););該語(yǔ)句的含義是在數(shù)據(jù)庫(kù)中建立一個(gè)新的空的該語(yǔ)句的含義是在數(shù)據(jù)庫(kù)中建立一個(gè)新的空的“讀者讀者”表表readerreader,并將有關(guān)并將有關(guān)“讀者讀者”表的定義及有關(guān)約束存放在數(shù)據(jù)字典中。表的定義及有關(guān)約束存放在數(shù)據(jù)字典中。184.2.3 基本表的定義、修改和刪除-定義基本表l 例例4-64-6 創(chuàng)建圖書(shū)表創(chuàng)建圖書(shū)表booksbooks。CREATE TABLE CREATE TABLE books(books(bno VARCHAR(10)PRIMARY KEY,bno VARCHAR(10)PRIMARY KEY,bname VARCHAR(20)NOT NULL,bname VARCHAR(20)NOT NULL,btype VARCHAR(20),btype VARCHAR(20),bauthor VARCHAR(8);bauthor VARCHAR(8);l 例例4-7 4-7 創(chuàng)建借閱表創(chuàng)建借閱表lendlend。CREATE TABLE CREATE TABLE lend(lend(bno VARCHAR(10),bno VARCHAR(10),rno VARCHAR(10),rno VARCHAR(10),lendtime SMALLINT,lendtime SMALLINT,PRIMARY KEY(bno,rno),PRIMARY KEY(bno,rno),FOREIGN KEY(rno)REFERENCES Reader(rno),FOREIGN KEY(rno)REFERENCES Reader(rno),FOREIGN KEY(bno)REFERENCES Books(bno);FOREIGN KEY(bno)REFERENCES Books(bno);最后兩行定義最后兩行定義rnorno和和bnobno為表為表lendlend的外碼,分別參照的外碼,分別參照readerreader的主碼的主碼rnorno和和booksbooks的主碼的主碼bnobno。194.2.3 基本表的定義、修改和刪除修改基本表l2.2.修改基本表修改基本表隨著環(huán)境和需求的變化,已經(jīng)建好的基本表有時(shí)候需要修改,表的修改隨著環(huán)境和需求的變化,已經(jīng)建好的基本表有時(shí)候需要修改,表的修改包括結(jié)構(gòu)的修改和約束條件的修改。包括結(jié)構(gòu)的修改和約束條件的修改。SQLSQL中修改基本表的格式如下:中修改基本表的格式如下:ALTER TABLE ALTER TABLE ADD ADD 完整性約束完整性約束 DROP DROP ALTER COLUMN ALTER COLUMN ;:要修改的基本表的名字。要修改的基本表的名字。ADDADD子句:子句:用于增加新列和新的完整性約束條件。用于增加新列和新的完整性約束條件。DROPDROP子句:子句:用于刪除指定的完整性約束條件用于刪除指定的完整性約束條件ALTERALTER子句:子句:用于修改原有列的定義,包括列名和列的數(shù)據(jù)類型用于修改原有列的定義,包括列名和列的數(shù)據(jù)類型l 例例4-8 4-8 向向lendlend表中增加表中增加“借出時(shí)間借出時(shí)間”列,數(shù)據(jù)類型為日期型。列,數(shù)據(jù)類型為日期型。ALTER TABLE lend ADD lenddate DATE;ALTER TABLE lend ADD lenddate DATE;注意:無(wú)論原來(lái)的數(shù)據(jù)表中是否有數(shù)據(jù),新增加的列一律為空值。注意:無(wú)論原來(lái)的數(shù)據(jù)表中是否有數(shù)據(jù),新增加的列一律為空值。204.2.3 基本表的定義、修改和刪除刪除基本表l3.3.刪除基本表刪除基本表 當(dāng)基本表不再需要時(shí),可以用當(dāng)基本表不再需要時(shí),可以用DROP TABLEDROP TABLE語(yǔ)句來(lái)刪除基本表。在語(yǔ)句來(lái)刪除基本表。在SQLSQL中,刪中,刪除基本表的格式如下:除基本表的格式如下:DROP TABLE DROP TABLE RESTRICT|CASCADE;RESTRICT|CASCADE;RESTRICTRESTRICT:表示表的刪除有條件限制。要?jiǎng)h除的表不能被其他表的約束引表示表的刪除有條件限制。要?jiǎng)h除的表不能被其他表的約束引用用(如:如:FOREIGN KEYFOREIGN KEY等約束等約束),不能有視圖、觸發(fā)器、存儲(chǔ)過(guò)程或函數(shù)等。,不能有視圖、觸發(fā)器、存儲(chǔ)過(guò)程或函數(shù)等。如果存在這些依賴該表的對(duì)象,則該表不能刪除。如果存在這些依賴該表的對(duì)象,則該表不能刪除。CASCADECASCADE:表示表的刪除沒(méi)有條件限制。在刪除基本表的同時(shí),依賴該表的表示表的刪除沒(méi)有條件限制。在刪除基本表的同時(shí),依賴該表的對(duì)象都一并被刪除。對(duì)象都一并被刪除。缺省缺省為為RESTRICTRESTRICT。刪除基本表的時(shí)候表中的數(shù)據(jù)、表上的索引都將被刪除,但表上的視圖往刪除基本表的時(shí)候表中的數(shù)據(jù)、表上的索引都將被刪除,但表上的視圖往往仍然保留但無(wú)法引用,刪除基本表時(shí),系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該往仍然保留但無(wú)法引用,刪除基本表時(shí),系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該基本表及其索引的描述。基本表及其索引的描述。l 例例4-94-9 刪除刪除lendlend表。表。DROP TABLE lend;DROP TABLE lend;214.2.4 索引的建立和刪除索引概念l1.1.索引概念索引概念 索引好比是一本書(shū)前面的目錄,能加快數(shù)據(jù)庫(kù)的索引好比是一本書(shū)前面的目錄,能加快數(shù)據(jù)庫(kù)的查詢速度查詢速度。索引。索引是對(duì)數(shù)據(jù)庫(kù)表中是對(duì)數(shù)據(jù)庫(kù)表中一列或多列一列或多列的值進(jìn)行的值進(jìn)行排序排序的一種結(jié)構(gòu),使用索引可快的一種結(jié)構(gòu),使用索引可快速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定信息。速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定信息。簡(jiǎn)單的說(shuō)簡(jiǎn)單的說(shuō),索引就是一個(gè),索引就是一個(gè)關(guān)于數(shù)據(jù)位關(guān)于數(shù)據(jù)位置信息的關(guān)鍵字表。置信息的關(guān)鍵字表。索引索引存取法存取法是數(shù)據(jù)庫(kù)系統(tǒng)中的數(shù)據(jù)存取方法之一,屬于數(shù)據(jù)庫(kù)物是數(shù)據(jù)庫(kù)系統(tǒng)中的數(shù)據(jù)存取方法之一,屬于數(shù)據(jù)庫(kù)物理設(shè)計(jì)的內(nèi)容理設(shè)計(jì)的內(nèi)容(相關(guān)內(nèi)容可參見(jiàn)第相關(guān)內(nèi)容可參見(jiàn)第7 7章章)。利用索引,系統(tǒng)可較快地在磁。利用索引,系統(tǒng)可較快地在磁盤(pán)上定位所需數(shù)據(jù),而不需要在磁盤(pán)上從頭到尾或從后向前,一個(gè)數(shù)盤(pán)上定位所需數(shù)據(jù),而不需要在磁盤(pán)上從頭到尾或從后向前,一個(gè)數(shù)據(jù)一個(gè)數(shù)據(jù)地匹配和查找,從而加快了數(shù)據(jù)查詢的速度。據(jù)一個(gè)數(shù)據(jù)地匹配和查找,從而加快了數(shù)據(jù)查詢的速度。建立索引是建立索引是加快查詢速度加快查詢速度的有效手段,可以把索引想象成漢語(yǔ)字典的有效手段,可以把索引想象成漢語(yǔ)字典的按筆畫(huà)查找的目錄。的按筆畫(huà)查找的目錄。224.2.4 索引的建立和刪除索引概念按索引的按索引的組織方式組織方式可將索引分為可將索引分為聚簇聚簇(Clustered)(Clustered)索引和索引和非聚簇非聚簇(Nonclustered)(Nonclustered)索引。索引。聚簇索引將數(shù)據(jù)行的碼值在表內(nèi)排序并存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù)記錄,使聚簇索引將數(shù)據(jù)行的碼值在表內(nèi)排序并存儲(chǔ)對(duì)應(yīng)的數(shù)據(jù)記錄,使得索引順序和數(shù)據(jù)表得索引順序和數(shù)據(jù)表物理順序一致物理順序一致,即該索引碼值的邏輯順序,即該索引碼值的邏輯順序決定決定了了表中相應(yīng)行的表中相應(yīng)行的物理順序物理順序。由于聚簇索引規(guī)定數(shù)據(jù)在表中的物理存儲(chǔ)順序,因此一個(gè)表只能包含一個(gè)由于聚簇索引規(guī)定數(shù)據(jù)在表中的物理存儲(chǔ)順序,因此一個(gè)表只能包含一個(gè)聚簇索引。但該索引可以包含多個(gè)列聚簇索引。但該索引可以包含多個(gè)列(組合索引組合索引),就像電話簿按姓氏和名,就像電話簿按姓氏和名字進(jìn)行組織一樣。字進(jìn)行組織一樣。聚簇索引對(duì)于那些經(jīng)常要搜索范圍值的列特別有效。使用聚簇索引找到包聚簇索引對(duì)于那些經(jīng)常要搜索范圍值的列特別有效。使用聚簇索引找到包含第一個(gè)值的行后,便可以確保包含后續(xù)索引值的行在物理相鄰。含第一個(gè)值的行后,便可以確保包含后續(xù)索引值的行在物理相鄰。當(dāng)索引值唯一時(shí),使用聚簇索引查找特定的行也很有效率。當(dāng)索引值唯一時(shí),使用聚簇索引查找特定的行也很有效率。234.2.4 索引的建立和刪除索引概念l聚簇索引的適用情況包含:聚簇索引的適用情況包含:(1)(1)含有大量非重復(fù)值的列。含有大量非重復(fù)值的列。(2)(2)使用使用BETWEENBETWEEN,=,或或=返回一個(gè)范圍值的列。返回一個(gè)范圍值的列。(3)(3)被連續(xù)訪問(wèn)的列。被連續(xù)訪問(wèn)的列。(4)(4)返回大型結(jié)果集的查詢。返回大型結(jié)果集的查詢。(5)(5)經(jīng)常被使用連接或經(jīng)常被使用連接或GROUP BYGROUP BY子句的查詢?cè)L問(wèn)的列。子句的查詢?cè)L問(wèn)的列。l非聚簇索引非聚簇索引l與聚簇索引不同,它不要求表中行的物理順序與索引的順序一致。一個(gè)表與聚簇索引不同,它不要求表中行的物理順序與索引的順序一致。一個(gè)表可以有可以有一個(gè)或多個(gè)一個(gè)或多個(gè)非聚簇索引。如果在一個(gè)表中既要?jiǎng)?chuàng)建聚簇索引,又要非聚簇索引。如果在一個(gè)表中既要?jiǎng)?chuàng)建聚簇索引,又要?jiǎng)?chuàng)建非聚簇索引時(shí),應(yīng)先創(chuàng)建聚簇索引,然后再創(chuàng)建非聚簇索引,因?yàn)閯?chuàng)創(chuàng)建非聚簇索引時(shí),應(yīng)先創(chuàng)建聚簇索引,然后再創(chuàng)建非聚簇索引,因?yàn)閯?chuàng)建聚簇索引時(shí)將改變數(shù)據(jù)記錄的物理存放順序。建聚簇索引時(shí)將改變數(shù)據(jù)記錄的物理存放順序。l惟一索引惟一索引l該索引要求被索引的列該索引要求被索引的列不能有相同值不能有相同值出現(xiàn)。惟一索引可用來(lái)限定聚簇索引出現(xiàn)。惟一索引可用來(lái)限定聚簇索引和非聚簇索引,如惟一的聚簇索引,惟一的非聚簇索引,表示限定這兩類和非聚簇索引,如惟一的聚簇索引,惟一的非聚簇索引,表示限定這兩類索引所索引的列不能有相同的值。索引所索引的列不能有相同的值。244.2.4 索引的建立和刪除索引概念l雖然索引可以提高數(shù)據(jù)查詢的速度,但是任何事物都是雖然索引可以提高數(shù)據(jù)查詢的速度,但是任何事物都是雙刃劍雙刃劍,它也有,它也有一些一些缺點(diǎn)缺點(diǎn)。增加索引也有許多不利的方面:。增加索引也有許多不利的方面:(1)(1)創(chuàng)建索引和維護(hù)索引要?jiǎng)?chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。增加。(2)(2)索引需要占索引需要占物理空間物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)更大。更大。(3)(3)當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)地當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)地維護(hù),這樣就維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度降低了數(shù)據(jù)的維護(hù)速度。對(duì)于一個(gè)基本表,可以根據(jù)對(duì)于一個(gè)基本表,可以根據(jù)實(shí)際需要實(shí)際需要?jiǎng)?chuàng)建若干索引以提供多種存儲(chǔ)途創(chuàng)建若干索引以提供多種存儲(chǔ)途徑。通常,索引的建立和刪除由數(shù)據(jù)庫(kù)管理員徑。通常,索引的建立和刪除由數(shù)據(jù)庫(kù)管理員DBADBA或表的擁有者或表的擁有者負(fù)責(zé)。索負(fù)責(zé)。索引由引由DBMSDBMS來(lái)來(lái)自動(dòng)維護(hù)自動(dòng)維護(hù),存取數(shù)據(jù)時(shí),存取數(shù)據(jù)時(shí),DBMSDBMS會(huì)會(huì)自動(dòng)選擇自動(dòng)選擇是否使用索引以及使是否使用索引以及使用哪些索引,用戶不必也不能顯示地選擇索引。用哪些索引,用戶不必也不能顯示地選擇索引。254.2.4 索引的建立和刪除索引概念l建立索引,一般可遵循如下原則:建立索引,一般可遵循如下原則:(1)(1)為為數(shù)據(jù)量大數(shù)據(jù)量大的表建立索引。的表建立索引。(2)(2)被索引列的數(shù)據(jù)值最好被索引列的數(shù)據(jù)值最好多而雜多而雜。(3)(3)一張表所建索引個(gè)數(shù)應(yīng)一張表所建索引個(gè)數(shù)應(yīng)適量適量。(4)(4)掌握建立索引的掌握建立索引的時(shí)機(jī)時(shí)機(jī)。(5)(5)優(yōu)先建立優(yōu)先建立基于主鍵基于主鍵的索引。的索引。264.2.4 索引的建立和刪除建立索引l2.建立索引在在SQLSQL中,建立索引的語(yǔ)句如下:中,建立索引的語(yǔ)句如下:CREATE UNIQUE CLUSTER INDEX CREATE UNIQUE CLUSTER INDEX ON ON (,););:指定要建索引的基本表的名字,索引可以建立在該表的一列或多列上,指定要建索引的基本表的名字,索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔。各列名之間用逗號(hào)分隔。:指定索引值的排列次序,指定索引值的排列次序,升序:升序:ASCASC,降序:,降序:DESCDESC。缺省值為。缺省值為ASCASC。UNIQUEUNIQUE:表示此索引的每一個(gè)索引值只表示此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的對(duì)應(yīng)唯一的數(shù)據(jù)記錄。對(duì)于已含重復(fù)值的數(shù)據(jù)記錄。對(duì)于已含重復(fù)值的屬性列不能建屬性列不能建UNIQUEUNIQUE索引,對(duì)某個(gè)列建立索引,對(duì)某個(gè)列建立UNIQUEUNIQUE索引后,插入新記錄時(shí)索引后,插入新記錄時(shí)DBMSDBMS會(huì)自會(huì)自動(dòng)檢查新記錄在該列上是否取了重復(fù)值,這相當(dāng)于增加了一個(gè)動(dòng)檢查新記錄在該列上是否取了重復(fù)值,這相當(dāng)于增加了一個(gè)UNIQUEUNIQUE約束。約束。CLUSTERCLUSTER:表示要建立的索引是聚簇索引,即索引順序與表中記錄的物理順序一致。表示要建立的索引是聚簇索引,即索引順序與表中記錄的物理順序一致。一個(gè)基本表上最多只能建立一個(gè)基本表上最多只能建立一個(gè)聚簇索引一個(gè)聚簇索引。274.2.4 索引的建立和刪除建立索引l 例例4-10 4-10 為為ReaderReader按讀者編號(hào)升序建唯一索引。按讀者編號(hào)升序建唯一索引。CREATE UNIQUE INDEX readerno ON reader(rno);CREATE UNIQUE INDEX readerno ON reader(rno);284.2.4 索引的建立和刪除刪除索引l3.3.刪除索引刪除索引在在SQLSQL中,刪除索引的語(yǔ)句如下:中,刪除索引的語(yǔ)句如下:DROP INDEX DROP INDEX ;刪除索引時(shí),系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該索引的描述。刪除索引時(shí),系統(tǒng)會(huì)從數(shù)據(jù)字典中刪去有關(guān)該索引的描述。l 例例4-11 4-11 刪除刪除readerreader表的表的readernoreaderno索引。索引。DROP INDEX readerno;DROP INDEX readerno;29主要內(nèi)容4.3 數(shù)據(jù)查詢4.3.1 4.3.1 單表查詢單表查詢4.3.2 4.3.2 連接查詢連接查詢4.3.3 4.3.3 嵌套查詢嵌套查詢304.3 數(shù)據(jù)查詢l數(shù)據(jù)查詢是數(shù)據(jù)查詢是SQLSQL語(yǔ)言的核心內(nèi)容,在語(yǔ)言的核心內(nèi)容,在SQLSQL語(yǔ)言中用語(yǔ)言中用SELECTSELECT語(yǔ)句進(jìn)行查詢,語(yǔ)句進(jìn)行查詢,SELECTSELECT語(yǔ)句一般格式如下:語(yǔ)句一般格式如下:SELECT ALL|DISTINCT SELECT ALL|DISTINCT ,FROM FROM ,WHERE WHERE GROUP BY GROUP BY 1 HAVING HAVING ORDER BY ORDER BY 2 ASC|DESC;ASC|DESC;SELECTSELECT子句子句:指定要顯示的屬性列。:指定要顯示的屬性列。FROMFROM子句子句:指定查詢對(duì)象:指定查詢對(duì)象(基本表或視圖基本表或視圖)。WHEREWHERE子句子句:指定查詢條件。:指定查詢條件。GROUP BYGROUP BY子句子句:對(duì)查詢結(jié)果按指定列的值分組,該屬性列值相等的元組為一個(gè):對(duì)查詢結(jié)果按指定列的值分組,該屬性列值相等的元組為一個(gè)組,通常會(huì)在每組中使用聚集函數(shù)。組,通常會(huì)在每組中使用聚集函數(shù)。HAVINGHAVING短語(yǔ)短語(yǔ):篩選出只有滿足指定條件的組。:篩選出只有滿足指定條件的組。ORDER BYORDER BY子句子句:對(duì)查詢結(jié)果表按指定列值的升序或降序排序。:對(duì)查詢結(jié)果表按指定列值的升序或降序排序。314.3.1 單表查詢-選擇表中的若干列單表查詢是指只涉及一張表的查詢,是最簡(jiǎn)單的一種查詢。單表查詢是指只涉及一張表的查詢,是最簡(jiǎn)單的一種查詢。l1.選擇表中的若干列(1)(1)查詢?nèi)苛胁樵內(nèi)苛?查詢表中全部列的方法有兩種,查詢表中全部列的方法有兩種,p一種是在一種是在SELECTSELECT關(guān)鍵字后面列出所有的列名,關(guān)鍵字后面列出所有的列名,p一種是在一種是在SELECTSELECT關(guān)鍵字后面使用關(guān)鍵字后面使用“*”“*”,前提是列的顯示順序,前提是列的顯示順序與其在基表中的順序相同。與其在基表中的順序相同。l 例例4-12 4-12 查詢查詢r(jià)eaderreader表中全部信息表中全部信息SELECT *FROM reader;SELECT *FROM reader;等價(jià)于:等價(jià)于:SELECT rno,name,sex,age,dept FROM reader;SELECT rno,name,sex,age,dept FROM reader;324.3.1 單表查詢-選擇表中的若干列l(wèi)(2)(2)查詢指定列查詢指定列 有些情況下,用戶只對(duì)部分列的信息感興趣,此時(shí)就可以使用有些情況下,用戶只對(duì)部分列的信息感興趣,此時(shí)就可以使用SELECTSELECT子句子句后面指定要查詢的列名。后面指定要查詢的列名。例例4-13 4-13 查詢讀者的編號(hào)和姓名。查詢讀者的編號(hào)和姓名。SELECT rno,nameSELECT rno,nameFROM reader;FROM reader;l(3)(3)查詢經(jīng)過(guò)計(jì)算的值查詢經(jīng)過(guò)計(jì)算的值 SELECTSELECT子句中的子句中的 不僅可以是表中的屬性列,也可以是表達(dá)不僅可以是表中的屬性列,也可以是表達(dá)式。式。例例4-14 4-14 查詢讀者的姓名和及其出生年份。查詢讀者的姓名和及其出生年份。SELECT name,2011-age SELECT name,2011-age FROM reader;FROM reader;334.3.1 單表查詢-選擇表中的若干列l(wèi)2.選擇表中的若干元組(1)(1)消除重復(fù)元組消除重復(fù)元組 兩個(gè)本來(lái)并不完全相同的元組,投影到指定列上后可能會(huì)出現(xiàn)兩個(gè)本來(lái)并不完全相同的元組,投影到指定列上后可能會(huì)出現(xiàn)相同的幾個(gè)元組,此時(shí)就可以使用相同的幾個(gè)元組,此時(shí)就可以使用DISTINCTDISTINCT來(lái)消除重復(fù)元組。來(lái)消除重復(fù)元組。例例4-15 4-15 查詢借閱圖書(shū)的讀者編號(hào)。查詢借閱圖書(shū)的讀者編號(hào)。SELECT rno FROM lend;SELECT rno FROM lend;執(zhí)行上面的執(zhí)行上面的SELECTSELECT語(yǔ)句后,該查詢結(jié)果里包含了重復(fù)的行。如語(yǔ)句后,該查詢結(jié)果里包含了重復(fù)的行。如果想去掉結(jié)果表中的重復(fù)行,必須指定果想去掉結(jié)果表中的重復(fù)行,必須指定DISTINCTDISTINCT關(guān)鍵詞。關(guān)鍵詞。SELECT DISTINCT rno FROM lend;SELECT DISTINCT rno FROM lend;如果沒(méi)有指定如果沒(méi)有指定DISTINCTDISTINCT關(guān)鍵詞,則缺省為關(guān)鍵詞,則缺省為ALLALL,即保留結(jié)果中取,即保留結(jié)果中取值重復(fù)的行。值重復(fù)的行。344.3.1 單表查詢-查詢滿足條件的元組l(2)(2)查詢滿足條件的元組查詢滿足條件的元組 查詢滿足指定條件的元組可以使用查詢滿足指定條件的元組可以使用WHEREWHERE子句子句來(lái)實(shí)現(xiàn)。來(lái)實(shí)現(xiàn)。WHEREWHERE子句常子句常用的查詢條件下表所示。用的查詢條件下表所示。查詢條件謂詞比較=,=,!(),(大于大于),(),=(),=(大于等于大于等于),=(),=(小于等于小于等于),!=),!=或或(不等于不等于),!(),!(不大于不大于),!(),!(不小于不小于),),NOTNOT上述運(yùn)算符。上述運(yùn)算符。p 例例4-16 4-16 查詢性別為男的所有讀者的名單。查詢性別為男的所有讀者的名單。SELECT rname SELECT rname FROM reader WHERE sex=FROM reader WHERE sex=男男;p 例例4-17 4-17 查詢所有年齡在查詢所有年齡在2525歲以下的讀者的姓名及其年齡。歲以下的讀者的姓名及其年齡。SELECT rname,age SELECT rname,age FROM reader WHERE age 25;FROM reader WHERE age 25;364.3.1 單表查詢-查詢滿足條件的元組l 確定范圍確定范圍 如果需要查詢屬性值如果需要查詢屬性值在在(或不在或不在)某一范圍某一范圍的元組,可以使用謂詞的元組,可以使用謂詞BETWEEN.ANDBETWEEN.AND和和NOT BETWEEN.ANDNOT BETWEEN.AND來(lái)指定屬性值的范圍,來(lái)指定屬性值的范圍,BETWEENBETWEEN后是范圍的下限后是范圍的下限(即低值即低值),ANDAND后是范圍的上限后是范圍的上限(即高值即高值)。p 例例4-18 4-18 查詢年齡在查詢年齡在18251825歲歲(包括包括1818歲和歲和2525歲歲)之間的讀者的姓名、系別之間的讀者的姓名、系別和年齡。和年齡。SELECT rname,dept,age FROM reader SELECT rname,dept,age FROM reader WHERE age BETWEEN 18 AND 25;WHERE age BETWEEN 18 AND 25;p 例例4-19 4-19 查詢年齡不在查詢年齡不在18251825歲歲(包括包括1818歲和歲和2525歲歲)之間的讀者的姓名、系之間的讀者的姓名、系別和年齡。別和年齡。SELECT rname,dept,age FROM reader SELECT rname,dept,age FROM reader WHERE age NOT BETEEN 18 AND 25;WHERE age NOT BETEEN 18 AND 25;374.3.1 單表查詢-查詢滿足條件的元組l確定集合確定集合 謂詞謂詞IN(IN(或或NOT IN)NOT IN)可以用來(lái)查找屬性值可以用來(lái)查找屬性值屬于屬于(不屬于不屬于)指定集合指定集合的元組,的元組,一般格式為:一般格式為:IN IN,NOT IN,NOT IN :用逗號(hào)分隔的一組屬性值。用逗號(hào)分隔的一組屬性值。p 例例4-20 4-20 查詢系別是計(jì)算機(jī)或數(shù)學(xué)的讀者的姓名、系別和性別。查詢系別是計(jì)算機(jī)或數(shù)學(xué)的讀者的姓名、系別和性別。SELECT rname,dept,sex FROM reader SELECT rname,dept,sex FROM reader WHERE dept IN(WHERE dept IN(計(jì)算機(jī)計(jì)算機(jī),數(shù)學(xué)數(shù)學(xué)););p 例例4-21 4-21 查詢系別既不是計(jì)算機(jī)也不是數(shù)學(xué)的讀者的姓名、系別和性別。查詢系別既不是計(jì)算機(jī)也不是數(shù)學(xué)的讀者的姓名、系別和性別。SELECT rname,dept,sex FROM reader SELECT rname,dept,sex FROM reader WHERE dept NOT IN(WHERE dept NOT IN(計(jì)算機(jī)計(jì)算機(jī),數(shù)學(xué)數(shù)學(xué)););384.3.1 單表查詢-查詢滿足條件的元組l 字符匹配字符匹配謂詞謂詞LIKELIKE用來(lái)進(jìn)行字符串的匹配,其一般語(yǔ)法格式如下:用來(lái)進(jìn)行字符串的匹配,其一般語(yǔ)法格式如下:NOT LIKE NOT LIKE 該語(yǔ)句用來(lái)查詢指定的屬性列值與該語(yǔ)句用來(lái)查詢指定的屬性列值與 相匹配的元組。相匹配的元組??梢允且粋€(gè)完整的字符串也可以是含有通配符可以是一個(gè)完整的字符串也可以是含有通配符%和和_ _的字符串。的字符串。%(%(百分號(hào)百分號(hào))代表代表任意長(zhǎng)度任意長(zhǎng)度(長(zhǎng)度可以為長(zhǎng)度可以為0)0)的字符串。的字符串。例:例:a%za%z表示以表示以a a開(kāi)頭,以開(kāi)頭,以z z結(jié)尾的任意長(zhǎng)度的字符串。如結(jié)尾的任意長(zhǎng)度的字符串。如abzabz,abcdzabcdz,az az 等都滿足該匹配串。等都滿足該匹配串。_(_(下橫線下橫線)代表代表任意單個(gè)任意單個(gè)字符字符 例:例:a_za_z表示以表示以a a開(kāi)頭,以開(kāi)頭,以z z結(jié)尾的長(zhǎng)度為結(jié)尾的長(zhǎng)度為3 3的任意字符串。如的任意字符串。如abzabz,aczacz等等都滿足該匹配串。都滿足該匹配串。394.3.1 單表查詢-查詢滿足條件的元組p 例例4-22 4-22 查詢讀者編號(hào)為查詢讀者編號(hào)為R0002R0002的讀者的詳細(xì)情況。的讀者的詳細(xì)情況。SELECT*SELECT*FROM reader FROM reader WHERE rno LIKE R0002;WHERE rno LIKE R0002;p 例例4-23 4-23 查詢所有姓王的讀者的詳細(xì)信息。查詢所有姓王的讀者的詳細(xì)信息。SELECT*SELECT*FROM reader FROM reader WHERE rname LIKE WHERE rname LIKE 王王%;%;p 例例4-24 4-24 查詢姓王而且全名為查詢姓王而且全名為3 3個(gè)字的讀者的詳細(xì)信息。個(gè)字的讀者的詳細(xì)信息。SELECT*SELECT*FROM reader FROM reader WHERE rname LIKE WHERE rname LIKE 王王_ _;_ _;404.3.1 單表查詢-查詢滿足條件的元組l 空值空值數(shù)據(jù)庫(kù)中空值表示數(shù)據(jù)庫(kù)中空值表示“不確定不確定”或或“未知未知”的意思。的意思。判斷取值判斷取值為空為空的語(yǔ)句格式為:的語(yǔ)句格式為:列名列名 IS NULLIS NULL判斷取值判斷取值不為空不為空的語(yǔ)句格式為:的語(yǔ)句格式為:列名列名 IS NOT NULLIS NOT NULLp 例例4-25 4-25 查詢無(wú)借閱天數(shù)的圖書(shū)編號(hào)。查詢無(wú)借閱天數(shù)的圖書(shū)編號(hào)。SELECT bnoSELECT bnoFROM lend FROM lend WHERE lendtime IS NULL;WHERE lendtime IS NULL;注意:這里的注意:這里的“IS”IS”不能用等號(hào)不能用等號(hào)“=”=”代替。代替。414.3.1 單表查詢-查詢滿足條件的元組l 多重條件多重條件 用邏輯運(yùn)算符用邏輯運(yùn)算符ANDAND和和 OROR來(lái)連接來(lái)連接多個(gè)查多個(gè)查詢條件,詢條件,ANDAND的優(yōu)先級(jí)的優(yōu)先級(jí)高于高于OROR,可以用括號(hào)改變優(yōu)先級(jí)??梢杂美ㄌ?hào)改變優(yōu)先級(jí)。p 例例4-26 4-26 查詢計(jì)算機(jī)系的年齡在查詢計(jì)算機(jī)系的年齡在2020歲以下的學(xué)生的信息。歲以下的學(xué)生的信息。SELECT*SELECT*FROM reader FROM reader WHERE dept=WHERE dept=計(jì)算機(jī)計(jì)算機(jī) AND age 20;AND age 20;424.3.1 單表查詢-對(duì)查詢結(jié)果排序l3.3.對(duì)查詢結(jié)果排序?qū)Σ樵兘Y(jié)果排序 SQL SQL語(yǔ)言中,語(yǔ)言中,SELECTSELECT查詢可以用查詢可以用ORDER BYORDER BY子句對(duì)查詢結(jié)果按照一子句對(duì)查詢結(jié)果按照一個(gè)或多個(gè)屬性列的升序個(gè)或多個(gè)屬性列的升序(ASC)ASC)或者降序或者降序(DESC)DESC)排列,缺省值是升序。排列,缺省值是升序。其一般格式為:其一般格式為:ORDER BY ORDER BY ASC|DESC,ASC|DESC,ASC|DESCASC|DESC ORDER BYORDER BY子句中如果指定了多個(gè)排序?qū)傩?,則查詢結(jié)果按以下指定的次子句中如果指定了多個(gè)排序?qū)傩?,則查詢結(jié)果按以下指定的次序:首先按第一個(gè)屬性的值排序,第一個(gè)屬性值相同的元組按第二個(gè)屬性序:首先按第一個(gè)屬性的值排序,第一個(gè)屬性值相同的元組按第二個(gè)屬性的值排序,如此類推。的值排序,如此類推。例例4-27 4-27 查詢所有讀者的信息,并將查詢結(jié)果按年齡的升序排列。查詢所有讀者的信息,并將查詢結(jié)果按年齡的升序排列。SELECT*FROM reader SELECT*FROM reader ORDER BY age ASC;ORDER BY age ASC;如果有空值,則空值按最大處理,即若按升序排序,空值的元組將最后顯如果有空值,則空值按最大處理,即若按升序排序,空值的元組將最后顯示。示。434.3.1 單表查詢-使用聚集函數(shù)l4.4.使用聚集函數(shù)使用聚集函數(shù)為了增強(qiáng)查詢功能和方便用戶使用,為了增強(qiáng)查詢功能和方便用戶使用,SQLSQL提供了許多聚集函數(shù),提供了許多聚集函數(shù),SQLSQL中常用中常用的聚集函數(shù)下表所示。的聚集函數(shù)下表所示。需要注意的是需要注意的是,DISTINCTDISTINCT短語(yǔ)指明在計(jì)算時(shí)要取消指定列中的重復(fù)值,短語(yǔ)指明在計(jì)算時(shí)要取消指定列中的重復(fù)值,ALLALL短語(yǔ)不取消重復(fù)值,缺省值為短語(yǔ)不取消重復(fù)值,缺省值為ALLALL。在聚集函數(shù)遇到空值時(shí),除。在聚集函數(shù)遇到空值時(shí),除COUNT(*)COUNT(*)外,都跳過(guò)空值而只處理非空值。外,都跳過(guò)空值而只處理非空值。WHEREWHERE子句不能使用聚集函數(shù)子句不能使用聚集函數(shù)作為條件表達(dá)式。作為條件表達(dá)式。函數(shù)功能COUNT(DISTINCT|ALL*)統(tǒng)計(jì)元組個(gè)數(shù)COUNT(DISTINCT|ALL)統(tǒng)計(jì)指定列中值的個(gè)數(shù)SUM(DISTINCT|ALL)計(jì)算指定列值的總和AVG(DISTINCT|ALL)求指定列值的平均值MIN(DISTINCT|ALL)求指定列值的最小值MAX(DISTINCT|ALL)求指定列值的最大值444.3.1 單表查詢-使用聚集函數(shù)p 例例4-28 4-28 查詢讀者的總?cè)藬?shù)。查詢讀者的總?cè)藬?shù)。SELECT COUNT(*)SELECT COUNT(*)FROM reader;FROM reader;p 例例4-29 4-29 查詢年齡在查詢年齡在2020歲以下的讀者個(gè)數(shù)。歲以下的讀者個(gè)數(shù)。SELECT COUNT(*)SELECT COUNT(*)FROM reader FROM reader WHERE age 20;WHERE age 20;454.3.1 單表查詢-對(duì)查詢結(jié)果分組l5.5.對(duì)查詢結(jié)果分組對(duì)查詢結(jié)果分組 使用使用GROUP BYGROUP BY子句分組,將子句分組,將細(xì)化細(xì)化聚集函數(shù)的作用對(duì)象。若未對(duì)查詢結(jié)果聚集函數(shù)的作用對(duì)象。若未對(duì)查詢結(jié)果分組,聚集函數(shù)將作用于整個(gè)查詢結(jié)果。對(duì)查詢結(jié)果分組后,聚集函數(shù)將分組,聚集函數(shù)將作用于整個(gè)查詢結(jié)果。對(duì)查詢結(jié)果分組后,聚集函數(shù)將分別作用于每個(gè)組。其一般格式為:分別作用于每個(gè)組。其一般格式為:GROUP BY GROUP BY ,HAVING HAVING 可選的可選的HAVINGHAVING子句用來(lái)過(guò)濾掉不滿足子句用來(lái)過(guò)濾掉不滿足 的分組。的分組。注意,使用注意,使用GROUP BYGROUP BY子句后,子句后,SELECTSELECT子句中的屬性名列表中只能出現(xiàn)分子句中的屬性名列表中只能出現(xiàn)分組屬性或聚集函數(shù)。組屬性或聚集函數(shù)。p 例例4-30 4-30 查詢各個(gè)圖書(shū)號(hào)及借閱的人數(shù)。查詢各個(gè)圖書(shū)號(hào)
收藏