數(shù)據(jù)庫系統(tǒng)第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第1頁
數(shù)據(jù)庫系統(tǒng)第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第2頁
數(shù)據(jù)庫系統(tǒng)第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第3頁
數(shù)據(jù)庫系統(tǒng)第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第4頁
數(shù)據(jù)庫系統(tǒng)第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第5頁
已閱讀5頁,還剩236頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)據(jù)庫系統(tǒng)概論

AnIntroductiontoDatabaseSystem

第三章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語己

SQL

AnIntroductiontoDatabaseSystem1

第三章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL

3.工SQL概述

3.2學(xué)生?課程數(shù)據(jù)庫

3.3數(shù)據(jù)定義

3.4數(shù)據(jù)查詢

3.5數(shù)據(jù)更新

3.6視圖

3.7小結(jié)

AnIntroductiontoDatabaseSystem2

3.L:LSQL的產(chǎn)生和發(fā)展(了解)

■關(guān)系代數(shù)和關(guān)系演算是形式化查詢語言,

商業(yè)DBMS使用SQL(Structured

QueryLanguage)。

■1974年由:IBM的SanJose研究室提出,

最初叫SEQUEL(StructuredEnglish

QueryLanguage)□

■關(guān)系數(shù)據(jù)庫系統(tǒng)通過SQL對數(shù)據(jù)庫進行

查詢和更新。

AnIntroductiontoDatabaseSystem3

3.L2SQL的特點(理解,掌握)

■1.綜合統(tǒng)一

■集DDL、DML、DCL于一體,語言風(fēng)格統(tǒng)

一,可以獨立完成數(shù)據(jù)庫生命周期中的全部

活動,如定義模式,插入數(shù)據(jù),建立數(shù)據(jù)

庫;數(shù)據(jù)查詢和更新;數(shù)據(jù)庫重構(gòu)和維護。

■可根據(jù)需要修改模式,并不影響數(shù)據(jù)庫的運

行,從而使系統(tǒng)具有良好的可擴展性。

■2,高度非過程化

AnIntroductiontoDatabaseSystem4

面向集合的操作方式

■一次一集合

-操作對象、查詢結(jié)果是元組的集合;

-插入、刪除、更新操作的對象也可以是元組的集

合。

■4.以同一種語法結(jié)構(gòu)提供兩種使用方法

-自含式:將SQL作為操作命令獨立使用

-宿主式:將SQL嵌入到高級語言中使用

-在兩種使用方式下,SQL的語法結(jié)構(gòu)基本是是一致

的。

AnIntroductiontoDatabaseSystem5

■5.語言簡潔,易學(xué)易用

表3.1SQL語言的動詞

SQL功能動詞

數(shù)據(jù)定義CREATE,DROP,ALTER

數(shù)據(jù)查詢SELECT

數(shù)據(jù)操縱INSERT,UPDATE

DELETE

數(shù)據(jù)控制GRANT,REVOKE

AnIntroductiontoDatabaseSystem6

3.1.3SQL的基本概念(理解)

■支持SQL的RDBMS同樣支持?jǐn)?shù)據(jù)庫三級模式結(jié)構(gòu)。

AnIntroductiontoDatabaseSystem7

第三章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL

3.工SQL概述

3.2學(xué)生?課程數(shù)據(jù)庫

3.3數(shù)據(jù)定義

3.4數(shù)據(jù)查詢

3.5數(shù)據(jù)更新

3.6視圖

3.7小結(jié)

AnIntroductiontoDatabaseSystem8

3.2學(xué)生■課程數(shù)據(jù)庫

■學(xué)生表:

■Student(SnozSnamezSsexzSagezSdept)

-課程表

■Course(CnozCnamezCcredit)

-學(xué)生選課表

■SC(SnozCnozGrade)

AnIntroductiontoDatabaseSystem9

第三章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL

3.工SQL概述

3.2學(xué)生?課程數(shù)據(jù)庫

3.3數(shù)據(jù)定義

3.4數(shù)據(jù)查詢

3.5數(shù)據(jù)更新

3.6視圖

3.7小結(jié)

AnIntroductiontoDatabaseSystem10

,3?3數(shù)據(jù)定義

表3.2SQL的數(shù)據(jù)定義語句

操作方式

操作對象

創(chuàng)建刪除修改

模式CREATESCHEMADROPSCHEMA

表CREATETABLEDROPTABLEALTERTABLE

視圖CREATEVIEWDROPVIEW

索引CREATEINDEXDROPINDEX

AnIntroductiontoDatabaseSystem11

3?3?工模式的定義和刪除

一、定義模式

CreateSchemav模式名>Authorizationv用戶名〉

■創(chuàng)建者必須具備DBA權(quán)限或被DBA授予CreateSchema

權(quán)限。

.SQLSERVER2000:CREATESCHEMA權(quán)限默認授予所有用

戶,但是他們必須有權(quán)創(chuàng)建加入到架構(gòu)中的對象。

■例1:CreateSchemaAuthorizationWANG

■例2:CreateSchemaAuthorizationWANG

AnIntroductiontoDatabaseSystem12

一■在創(chuàng)建模式的同時,在這個模式中進一步創(chuàng)建基

本表、視圖,定義權(quán)限。

語法

CREATESCHEMAAUTHORIZATIONowner

[<schema.element>[]

<schema.element>::=

{table_definition|view_definition\

grant_statement}

■例3:癰創(chuàng)建對象之前授權(quán)訪問對象

CREATESCHEMAAUTHORIZATIONross

GRANTSELECTonvlTOpublic

CREATEVIEWvl(cl)ASSELECTclfromtl

CREATETABLEtl(clint)

,二、刪除模式

■DROPSchemaV模式名〉VCASCADE|RESTRICT>

■SQLSERVER2000:沒有

■例4:dropschemarosscascade;

AnIntroductiontoDatabaseSystem14

3,3.2基本表的定義、刪除和修改

?(重點掌握)

?查詢分析器

-企業(yè)管理器

AnIntroductiontoDatabaseSystem15

一、定義基本表

CREATETABLEV表名〉

(V列名〉V數(shù)據(jù)類型>[V列級完整性約束條件》]

[,V列名〉V數(shù)據(jù)類型>[V列級完整性約束條件

>]]

[,V表級完整性約束條件>]);

-V表名,:所要定義的基本表的名字

-V列名,:組成該表的各個屬性(列)

-V列級完整性約束條件):涉及相應(yīng)屬性列的完整

性藥榮條件

-V表級完整性約束條件,:涉及一個或多個屬性列

的完整性約束條件

AnIntroductiontoDatabaseSystem16

卜例題_____________________________

[例1]建立一個“學(xué)生”表Student。

CREATETABLEStudent

(SnoCHAR(5)PRIMARYKEY,

SnameCHAR(20)UNIQUE,

SsexCHAR(l),

SageINT,

SdeptCHAR(15)

);

17

AnIntroductiontoDatabaseSystem

,例題(續(xù))

SnoSnameSdept

字符型字符型字符型整數(shù)字符型

長度為5長度為20長度為1長度為15

不能為空值

18

AnIntroductiontoDatabaseSystem

■[:例2]建立一個“課程”表Course。

CREATETABLECoursef

CnoCHAR(4)PRIMARYKEY,

CnameCHAR(40),

CpnoCHAR(4),

CoreditSMALLINT,

FOREIGNKEY(Cpno)REFERENCES

Course(Cno)

);

AnIntroductiontoDatabaseSystem19

[例3]建立一個“學(xué)生選課”表SC,它由學(xué)號Sno、

課程號Cno,修課成績Grade組成,其中(Sno,

Cno)為主碼。

CREATETABLESC(

SnoCHAR(7),

CnoCHAR(4),

GradeSMALLINT,

Primarykey(Sno,Cno),

FOREIGNKEY(Sno)REFERENCESStudent(Sno),

FOREIGNKEY(Cno)REFERENCESCourse(Cno));

AnIntroductiontoDatabaseSystem20

■二、數(shù)據(jù)類型

-域:在SQL中用數(shù)據(jù)類型實現(xiàn)。

■選擇依據(jù):

■取值范圍;

■運算類型。

■數(shù)據(jù)類型

■整數(shù):bigint,int,smaHint,tinYint,

■Decimal(nfm),numeric(nzm)

■money和smallmoney

■近似數(shù)字:floatreal

?時間:datetimesmalldatetime

■字符串:char,varchar,text

■Unicode字符串:nchar,nvaixhnr,ntext

?二進制字符串:binary,varbinary,image

■其它數(shù)據(jù)類型

■cursor,scilvariant,table,timestamD,uniciueiclentifier

三、模式與表

■方法一:createtablev模式名》.表名

■SQLSERVER2000沒有實現(xiàn)

-方法二:在創(chuàng)建模式時同時創(chuàng)建表

■方法三(略)

AnIntroductiontoDatabaseSystem22

四、修改基本表

■■通過更改、添加、除去列和約束,或者通過啟用或禁用

■約束和觸發(fā)器來更改表的定義。

_ALTERTABLEtable

■{[ALTERCOLUMNcolumn_name{new_data_type

[(precision[,scale])]

[COLLATE<collation_name>][NULL|NOTNULL]|

<ADD|DROP}ROWGUIDCOL}]

|ADD{[<column_definition>]

|column_nameAScomputed_column_expression

}[f...n]

|[WITHCHECK|WITHNOCHECK]ADD<<

table_constraint>>[,...n]

|DROP<[CONSTRAINT]constraint_name

|COLUMNcolumn>[,...n]

|<CHECK|NOCHECK}CONSTRAINT{ALL|

constraint_name[,??.n]}

|{ENABLETDISABLE}TRIGGER<ALL|trigger_name

Lf--n]}

}

例題

[例2]向Student表增力□"入學(xué)時間”歹U,其數(shù)

據(jù)類型為日期型。

ALTERTABLEStudentADDS_entranceDATETIME

-不論基本表中原來是否已有數(shù)據(jù),新增加的列一律

為空值。

AnIntroductiontoDatabaseSystem24

」語句格式(續(xù))

:"刪除屬性列

直接/間接刪除

-把表中要保留的列及其內(nèi)容復(fù)制到一個新表中

■刪除原表

■再將新表重命名為原表名

直接刪除屬性列:(新)

例:ALTERTABLEStudentDropScome;

AnIntroductiontoDatabaseSystem25

[例3]將年齡的數(shù)據(jù)類型改為整數(shù)。

ALTERTABLEStudentALTERCOLUMNSageint

■注:修改原有的列定義有可能會破壞已有數(shù)據(jù)

AnIntroductiontoDatabaseSystem26

■例題

[例4]增加/刪除學(xué)生姓名必須取唯一值的約束。

■ALTERTABLEStudentADDnui_nameUNIQUE(Sname);

■ALTERTABLEStudentDROPUNIQUE(Sname);

AnIntroductiontoDatabaseSystem27

1五、刪除基本表

■DROPTABLEV表名>[RESTRICT|

CASCADE]

-RESTRICT或CASCADE決定了在基本表被其他表約

束(如Check或ForeignKey)引用、有視圖、有融發(fā)

器、有存儲過程或函數(shù)與之相關(guān)的情況下的處理方式。

-SQLServer2000:刪除表定義及該表的所有數(shù)據(jù)、

索引、觸發(fā)器、約束和權(quán)限規(guī)范。任何引用已除去表

的視圖或存儲過程必須通過DROPVIEW或DROP

PROCEDURE語句顯式除去。(沒有此選項。)

AnIntroductiontoDatabaseSystem28

例題

[例5]刪除Student表

DROPTABLEStudent;

AnIntroductiontoDatabaseSystem29

3.3?3建立與刪除索引(理解,掌握)

■建立索引是加快查詢速度的有效手段

■建立索引

-DBA或表的屬主(即建立表的人)根據(jù)需要建立

■有些DBMS自動建立以下列上的索引

■PRIMARYKEY

■UNIQUE

■維護索引

-DBMS自動完成

■使用索引

-DBMS自動選擇是否使用索引以及使用哪些索引

30

AnIntroductiontoDatabaseSystem

查詢示例-使用非聚集索引進行查詢

sysindexesidindid=2root

Non

Clustered

MartinIndex

rtin

SELECT

lastname,

firstname

FROMmember

Matey4:70WHERE

Ota

Phualastname

BETWEEN

'Masters'

Heap

AND'Rudd'

Page704Page705Page70)Page707

01Conn01...Iikhtar...SriithEH...Martin

02Funk02...White021..二unk02Phua

03White03...Barr03...Smith0303...Jones

.........04...Matey......04...Smith

.........1:.................

o

AnIntroductiontoDatabaseSystem31

建立索引

-只有表或視圖的所有者才能為表創(chuàng)建索弓I。

■語法

CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]

INDEXindexname

ON{table\view}(column[ASC|DESC][])

[WITH<indexoption>[,..?〃]]

AnIntroductiontoDatabaseSystem33

例題

[例6]為學(xué)生■課程數(shù)據(jù)庫中的Student,Course,

SC三個表建立索引。其中Student表按學(xué)號升序建唯

一索引,Course表按課程號升序建唯一索引,SC表

按學(xué)號升序和課程號降序建唯一索引。

CREATEUNIQUEINDEXStusnoONStudent(Sno);

CREATEUNIQUEINDEXCoucnoONCourse(Cno);

CREATEUNIQUEINDEXSCnoONSC(SnoASC,Cno

DESC);

AnIntroductiontoDatabaseSystem34

建立索引(續(xù))

■唯一值索引

■對于已含重復(fù)值的屬性列不能建UNIQUE索引

■對某個列建立UNIQUE索引后,插入新記錄時

DBMS會自動檢查新記錄在該列上是否取了重復(fù)

值。這相當(dāng)于增加了一個UNIQUE約束。

AnIntroductiontoDatabaseSystem35

建立索引(續(xù))

-聚簇索引

?建立聚簇索引后,基表中數(shù)據(jù)也需要按指

定的聚簇屬性值的升序或降序存放。也即

聚簇索引的索引項順序與表中記錄的物理

順序一致。

例:CREATECLUSTEREDINDEX

StusnameONStudent(Sname)

AnIntroductiontoDatabaseSystem36

建立索引(續(xù))

■在一個基本表上最多只能建立一個聚簇索引

■聚簇索引的用途:對于某些類型的查詢,可

以提高查詢效率

■聚集索引選擇指南

-有幾個重復(fù)值要經(jīng)常查找的列

■通常在數(shù)值范圍中查詢的列

■經(jīng)常在orderby子句中指定的列

-連接子句中經(jīng)常使用的非主鍵列

AnIntroductiontoDatabaseSystem37

[二、刪除索引

DROPINDEXV索引名〉;

■刪除索引時,系統(tǒng)會從數(shù)據(jù)字典中刪去有關(guān)

該索引的描述。

[例7]冊||除Student表的Stusname索弓I。

DROPINDEXStusname;

AnIntroductiontoDatabaseSystem38

第三章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL

3.工SQL概述

3.2學(xué)生?課程數(shù)據(jù)庫

3.3數(shù)據(jù)定義

3.4數(shù)據(jù)查詢

3.5數(shù)據(jù)更新

3.6視圖

3.7小結(jié)

AnIntroductiontoDatabaseSystem39

34數(shù)據(jù)查詢(重點、難點,熟練應(yīng)用)

3-4-1概述

-語句格式

SELECT[ALL|DISTINCT]V目標(biāo)列表達式〉

[,V目標(biāo)列表達式

>]...

FROMV表名或視圖名>[,V表名或視圖名>]…

[WHEREV條件表達式》]

[GROUPBYV列名工>[HAVINGV條件表達式

>]]

[ORDERBYV列名2>[ASC|DESC]];

AnIntroductiontoDatabaseSystem40

語句格式

-SELECT子句:指定要顯示的屬性列

-FROM子句:指定查詢對象(基本表或視圖)

-WHERE子句:指定查詢條件

-GROUPBY子句:對查詢結(jié)果按指定列的值分組,

該屬性列值相等的元組為一個組。通常會在每組中

作用集函數(shù)。

-HAVINGN短語:篩選出只有滿足指定條件的組

-ORDERBY子句:對查詢結(jié)果表按指定列值的升序

或降序排序

AnIntroductiontoDatabaseSystem41

示例數(shù)據(jù)庫

學(xué)生■課程數(shù)據(jù)庫

■學(xué)生表:StudentfSno,Sname,Ssex,Sage,

Sdept)

■課程表:Course(Cno,Cname,Cpno,Ccredit)

■學(xué)生選課表:SC(Sno,Cno,Grade)

AnIntroductiontoDatabaseSystem42

3.4,2單表查詢

查詢僅涉及一個表,是一種最簡單的查詢操作

一、選擇表中的若干列

二、選擇表中的若干元組

三、對查詢結(jié)果排序

四、使用聚集函數(shù)

五、對查詢結(jié)果分組

AnIntroductiontoDatabaseSystem43

一、選擇表中的若干列

|1查詢指定列

[例]]查詢?nèi)w學(xué)生的學(xué)號與姓名。

[例2]查詢?nèi)w學(xué)生的姓名、學(xué)號、所在系。

AnIntroductiontoDatabaseSystem44

2查詢?nèi)苛?/p>

[例3]查詢?nèi)w學(xué)生的詳細記錄。

AnIntroductiontoDatabaseSystem45

3■查詢經(jīng)過計算的值

SELECT子句的V目標(biāo)列表達式>為表達式

?算術(shù)表達式

-字符串常量

?函數(shù)

?列別名等

AnIntroductiontoDatabaseSystem46

3.查詢經(jīng)過計算的值

[例4]查全體學(xué)生的姓名及其出生年份。

AnIntroductiontoDatabaseSystem47

3■查詢經(jīng)過計算的值

[例5]查詢?nèi)w學(xué)生的姓名、出生年份和

所有系,要求用小寫字母表示所有系名。

AnIntroductiontoDatabaseSystem48

,[例5,1]使用列別名改變查詢結(jié)果的列標(biāo)題

SELECTSnameNAME,'YearofBirth:BIRTH,

2000-SageBIRTHDAY,ISLOWER(Sdept)

DEPARTMENT

FROMStudent;

AnIntroductiontoDatabaseSystem49

二、選擇表中的若干元組

-消除取值重復(fù)的行

-查詢滿足條件的元組

AnIntroductiontoDatabaseSystem50

1.消除取值重復(fù)的行

■在SELECT子句中使用DISTINCT短語

■ALL與DISTINCT

■注意DISTINCT短語的作用范圍是所有目

標(biāo)列

例:查詢選修課程的各種成績

錯誤的寫法

SELECTDISTINCTCno,DISTINCTGrade

FROMSC

AnIntroductiontoDatabaseSystem51

2.查詢滿足條件的元組

IERE子句常用的查詢條件

表3.3常用的查詢條件

查詢條件謂詞

=,>,5Hv彳!之!<;

比較

確定范圍BETWEENAND,NOTBETWEENAND

確定集合IN,NOTIN

字符匹配LIKE,NOTLIKE

空值ISNULL,ISNOTNULL

多重條件AND,OR

AnIntroductiontoDatabaseSystem52

(1)比較大小

在WHERE子句的V比較條件》中使用比較運算符

■二,>,<,>=,<=,!=或<>,!>,!<,

-邏輯運算符NOT+比較表達式

[例8]查詢所有年齡在20歲以下的學(xué)生姓名及其年齡。

SELECTSname,Sage

FROMStudent

WHERESage<20;或

SELECTSname,Sage

FROMStudent

WHERENOTSage>=20;

AnIntroductiontoDatabaseSystem

(2)確定范圍

7使用謂詞BETWEENAND

NOTBETWEENAND

[例工0]查詢年齡在20~23歲(包括20歲和23歲)之間

的學(xué)生的姓名、系別和年齡。

SELECTSname,Sdept,Sage

FROMStudent

WHERESageBETWEEN20AND23;

AnIntroductiontoDatabaseSystem54

,例題(續(xù))

[例11]查詢年齡不在20~23歲之間的學(xué)生姓名、

系別和年齡。

SELECTSname,Sdept,Sage

FROMStudent

WHERESageNOTBETWEEN20AND23

AnIntroductiontoDatabaseSystem55

(3)確定集合

!1用謂詞~~INV值表>,NOTINV值表,

〈值表,:用逗號分隔的一組取值

[例12]查詢信息系(IS)、數(shù)學(xué)系(MA)和計

算機科學(xué)系(CS)學(xué)生的姓名和性別。

SELECTSname,Ssex

FROMStudent

WHERESdeptIN(VIS\1MAI8)

AnIntroductiontoDatabaseSystem56

(3)確定集合

[例13]查詢既不是信息系、數(shù)學(xué)系,也不是計算

機科學(xué)系的學(xué)生的姓名和性別。

SELECTSname,Ssex

FROMStudent

WHERESdeptNOTIN(IS1,VMA',

XS1);

AnIntroductiontoDatabaseSystem57

?(4)字符串匹配

[[NOT]LIKE6V匹配串〉,[ESCAPE,V換碼字符

■V匹配串〉:指定匹配模板

.匹配模板:固定字符串或含通配符的字符串

?當(dāng)匹配模板為固定字符串時,可以用=運算符取代

LIKE謂詞;用!=或v>運算符取代NOTLIKE謂

TR]O

AnIntroductiontoDatabaseSystem58

通配符

%(百分號)代表任意長度(長度可以為0)的字符串

?例:a%b表示以a開頭,以b結(jié)尾的任意長度的字

符串。如acb,addgb,ab等都滿足該匹配串

令_(下橫線)代表任意單個字符

-例:a_b表示以a開頭,以b結(jié)尾的長度為3的任意

字符串。如acb,afb等都滿足該匹配串

AnIntroductiontoDatabaseSystem59

J■口

-指定范圍([a-f])或集合([abcdef])中的任何單個字

符。

-WHEREaujnameLIKEIC?P]arseM將查找以

arsen結(jié)尾百以介于C與P之間的任何單個字符開始

的作者姓氏,例如,Carsen>Larsen、Karsen等。

-不屬于指定范圍([a-f])或集合([abcdef])的任何單

個字符。

■WHEREaujnameLIKE'de[人口%/將查找以de開

始且其后的字母不為I的所有作者的姓氏。

mi±11L±uuuuLionLUuaoyLUHI

ESCAPE短語:

■ESCAPErescape_character1

■允許在字符串中搜索通配符而不是將其作為

通配符使用。esc即已〃舊zcEer是放在通配

符前表示此特殊用途前字符。

SELECT*

FROMfinances

WHEREdescriptionLIKE'gsjESCAPE'S'

AnIntroductiontoDatabaseSystem61

■例題

1)匹配模板為固定字符串

[例14]查詢學(xué)號為95001的學(xué)生的詳細情況。

SELECT*

FROMStudent

WHERESnoLIKE'95001,;

等價于:

SELECT*

FROMStudent

WHERESno='95001,;

AnIntroductiontoDatabaseSystem62

,例題(續(xù))

2)匹配模板為含通配符的字符串

[例[5]查詢所有姓劉學(xué)生的姓名、學(xué)號和性別。

SELECTSname,Sno,Ssex

FROMStudent

WHERESnameLIKE'劉%;

AnIntroductiontoDatabaseSystem63

,例題(續(xù))

匹配模板為含通配符的字符串(續(xù))

[例]查詢姓“歐陽”且全名為三個漢字的學(xué)生的姓名

SELECTSname

FROMStudent

WHERESnameLIKE'歐陽";

AnIntroductiontoDatabaseSystem64

例題(續(xù))

匹配模板為含通配符的字符串(續(xù))

[例17]查詢名字中第2個字為“陽”字的學(xué)生的

姓名和學(xué)號。

SELECTSname,Sno

FROMStudent

WHERESnameLIKE'陽%)';

AnIntroductiontoDatabaseSystem65

例題(續(xù))

匹配模板為含通配符的字符串(續(xù))

[例18]查詢所有不姓劉的學(xué)生姓名。

SELECTSname,Sno,Ssex

FROMStudent

WHERESnameNOTLIKE'劉%

AnIntroductiontoDatabaseSystem66

例題(續(xù))

3)使用換碼字符將通配符轉(zhuǎn)義為普通字符

[例19]查詢DB_Design課程的課程號和學(xué)分。

SELECTCno,Ccredit

FROMCourse

WHERECnameLIKEvDB\_Designv

ESCAPEfV

AnIntroductiontoDatabaseSystem67

,例題(續(xù))

使用換碼字符將通配符轉(zhuǎn)義為普通字符(續(xù))

[例20]查詢以,,DB_“開頭,且倒數(shù)第3個字符為i的

課程的詳細情況。

SELECT*

FROMCourse

WHERECnameLIKEESCAPE、;

AnIntroductiontoDatabaseSystem68

(5)涉及空值的查詢

■使用謂詞ISNULL或ISNOTNULL

■“ISNULL”不能用“=NULL”代替

[例2]]某些學(xué)生選修課程后沒有參加考試,所以有選課

記錄,但沒有考試成績。查詢?nèi)鄙俪煽兊膶W(xué)生的學(xué)號

和相應(yīng)的課程號。

SELECTSno,Cno

FROMSC

WHEREGradeISNULL;

AnintroductiontoDatabaseSystem69

,例題(續(xù))

[例22]查所有有成績的學(xué)生學(xué)號和課程號。

SELECTSno,Cno

FROMSC

WHEREGradeISNOTNULL;

AnIntroductiontoDatabaseSystem70

(6)多重條件查詢

用邏輯運算符AND和OR來聯(lián)結(jié)多個查詢條件

■AND的優(yōu)先級高于OR

-可以用括號改變優(yōu)先級

可用來實現(xiàn)多種其他謂詞

■[NOT]IN

■[NOT]BETWEEN...AND...

AnIntroductiontoDatabaseSystem71

例題

[例23]查詢計算機系年齡在20歲以下的學(xué)生姓

名。

SELECTSname

FROMStudent

WHERESdept="CS'ANDSage<20;

AnIntroductiontoDatabaseSystem72

[改寫[例12]

[^J12]查詢信息系(IS)、數(shù)學(xué)系(MA)和計

算機科學(xué)系(CS)學(xué)生的姓名和性別。

SELECTSname,Ssex

FROMStudent

WHERESdeptIN('IS,MA,CS)

可改寫為:

WHERESdept=1IS1ORSdept=1MA'OR

Sdept=1CS;

AnIntroductiontoDatabaseSystem73

改寫[例10]

[例10]查詢年齡在20~23歲(包括20歲

和23歲)之間的學(xué)生的姓名、系別和年

齡。

SELECTSname,Sdept,Sage

FROMStudent

WHERESageBETWEEN20AND23;

可改寫為:

WHERESage>=20ANDSage<=23;

AnIntroductiontoDatabaseSystem74

三、對查詢結(jié)果排序

使用ORDERBY子句

-可以按一個或多個屬性列排序

■升序:ASC;降序:DESC;缺省值為升序

當(dāng)排序列含空值時

■ASC:排序列為空值的元組最后顯示

-DESC:排序列為空值的元組最先顯示

AnIntroductiontoDatabaseSystem75

對查詢結(jié)果排序(續(xù))

[例24]查詢選修了3號課程的學(xué)生的學(xué)號

及其成績,查詢結(jié)果按分?jǐn)?shù)降序排列。

SELECTSno,Grade

FROMSC

WHERECno='3'

ORDERBYGradeDESC;

AnIntroductiontoDatabaseSystem76

對查詢結(jié)果排序(續(xù))

[例25]查詢?nèi)w學(xué)生情況,查詢結(jié)果按

所在系的系號升序排列,同一系中的學(xué)

生按年齡降序排列。

SELECT*

FROMStudent

ORDERBYSdept,SageDESC;

AnIntroductiontoDatabaseSystem77

四、使用聚集函數(shù)

5類主要集函數(shù)

-計數(shù)

COUNT([DISTINCTIALL]*)

COUNT([DISTINCTIALL]〈列名〉)

-計算總和

SUM([DISTINCTIALL]〈列名〉)

-計算平均值

AVG([DISTINCTIALL]〈列名〉)

AnIntroductiontoDatabaseSystem78

使用集函數(shù)(續(xù))

求最大值

MAX([DISTINCT]ALL]<列名〉)

求最小值

MIN([DISTINCT|ALL]〈列名〉)

-DISTINCT短語:在計算時要取消指定列中

的重復(fù)值

-ALL短語:不取消重復(fù)值

-ALL為缺省值

AnIntroductiontoDatabaseSystem79

使用集函數(shù)(續(xù))

[例26]查詢學(xué)生總?cè)藬?shù)。

SELECTCOUNT(*)

FROMStudent;

[例27]查詢選修了課程的學(xué)生人數(shù)。

SELECTCOUNT(DISTINCTSno)

FROMSC;

注:用DISTINCT以避免重復(fù)計算學(xué)生人數(shù)

AnIntroductiontoDatabaseSystem80

使用集函數(shù)(續(xù))

[例28]計算1號課程的學(xué)生平均成績。

SELECTAVG(Grade)

FROMSC

WHERECno="1';

[例29]查詢選修1號課程的學(xué)生最高分?jǐn)?shù)。

SELECTMAX(Grade)

FROMSC

WHERCno="1';

AnIntroductiontoDatabaseSystem81

五、對查詢結(jié)果分組

■使用GROUPBY子句分組

-細化聚集函數(shù)的作用對象

-未對查詢結(jié)果分組,聚集函數(shù)將作用于整個

查詢結(jié)果

-對查詢結(jié)果分組后,聚集函數(shù)將分別作用于

每個組

AnIntroductiontoDatabaseSystem82

使用GROUPBY子句分組

:例30]求各個課程號及相應(yīng)的選課人數(shù)。

SELECTCno,COUNT(Sno)

FROMSC

GROUPBYCno;

AnIntroductiontoDatabaseSystem83

,對查詢結(jié)果分組(續(xù))

■GROUPBY子句的作用對象是查詢的中間結(jié)果表

-分組方法:按指定的一列或多列值分組,值相等的

為一組

■使用GROUPBY子句后,SELECT子句的歹U名歹U表

中只能出現(xiàn)分組屬性和聚集函數(shù)

AnIntroductiontoDatabaseSystem84

使用HAVING短語篩選最終輸出結(jié)果

[例31]查詢選修了3門以上課程的學(xué)生學(xué)號。

SELECTSno

FROMSC

GROUPBYSno

HAVINGCOUNT(*)>3;

AnIntroductiontoDatabaseSystem85

例題

[例32]查詢有3門以上課程是90分以上的

學(xué)生的學(xué)號及(90分以上的)課程數(shù)

SELECTSno,COUNT(*)

FROMSC

WHEREGrade>=90

GROUPBYSno

HAVINGCOUNT(*)>=3;

AnIntroductiontoDatabaseSystem86

使用HAVING短語篩選最終輸出結(jié)果

只有滿足HAVING短語指定條件的組才輸出

HAVING短語與WHERE子句的區(qū)另U:作用對

象不同

■WHERE子句作用于基表或視圖,從中選擇

滿足條件的元組。

■HAVING短語作用于組,從中選擇滿足條件

的組。

AnIntroductiontoDatabaseSystem87

3.4.3連接查詢

■同時涉及多個表的查詢稱為連接查詢-

-用來連接兩個表的條件稱為連接條件或連接謂詞

■一般格式:

-[V表名l>.]v列名v比較運算符》[V表名2>?]v列名2>

■比較運算符:=、>、V、>=><=>!=

■[V表名]>.]V列名工>BETWEEN[V表名2>?]V列名

2>AND[V表名2>,]V列名3>

AnIntroductiontoDatabaseSystem88

連接查詢(續(xù))

-連接字段

■連接謂詞中的列名稱為連接字段

?連接條件中的各連接字段類型必須是可比

的,但不必是相同的

AnIntroductiontoDatabaseSystem89

上連接操作的執(zhí)行過程

?嵌套循環(huán)法(NESTED-LOOP)

-首先在表工中找到第一個元組,然后從頭開始掃描表2,

逐一查找滿足連接件的元組,找到后就將表工中的第

一個元組與該元組拼接起來,形成結(jié)果表中一個元組。

-表2全部查找完后,再找表工中第二個元組,然后再從

頭開始掃描表2,逐一查找滿足連接條件的元組,找

到后就將表工中的第二個元組與該元組拼接起來,形

成結(jié)果表中一個元組。

-重復(fù)上述操作,直到表工中的全部元組都處理完畢

AnIntroductiontoDatabaseSystem90

■排序合并法(SORT-MERGE)

■常用于二連接

-首先按連接屬性對表1和表2排序

-對表工的第一個元組,從頭開始掃描表2,順序查找

滿足連接條件的元組,找到后就將表工中的第一個

元組與該元組拼接起來,形成結(jié)果表中一個元組。

當(dāng)遇到表2中第一條大于表工連接字段值的元組時,

對表2的查詢不再繼續(xù)

AnIntroductiontoDatabaseSystem91

-找到表工的第二條元組,然后從剛才的中斷點處繼

續(xù)順序掃描表2,查找滿足連接條件的元組,找到

后就將表工中的第一個元組與該元組拼接起來,形

成結(jié)果表中一個元組。直接遇到表2中大于表工連接

字段值的元組時,對表2的查詢不再繼續(xù)

-重復(fù)上述操作,直到表工或表2中的全部元組都處理

完畢為止

AnIntroductiontoDatabaseSystem92

■索引連接(INDEXTOIN)

■對表2按連接字段建立索引

■對表工中的每個元組,依次根據(jù)其連接字段

值杳詢表2的索引,從中找到滿足條件的元

組,找到后就將表工中的第一個元組與該元

組拼接起來,形成結(jié)果表中一個元組

AnIntroductiontoDatabaseSystem93

SQL中連接查詢的主要類型

-廣義笛卡爾積

?等值連接(含自然連接)

?非等值連接查詢

?自身連接查詢

.外連接查詢

?復(fù)合條件連接查詢

AnIntroductiontoDatabaseSystem94

一、廣義笛卡爾積

-不帶連接謂詞的連接

-很少使用

例:

SELECTStudent*,SC.*

FROMStudent,SC

AnIntroductiontoDatabaseSystem95

二、等值與非等值連接查詢

等值連接、自然連接、非等值連接

[例33]查詢每個學(xué)生及其選修課程的情況。

SELECTStudent.*,SC.*

FROMStudent,SC

WHEREStudent.Sno=SC.Sno;

AnIntroductiontoDatabaseSystem96

等值連接

■連接運算符為=的連接操作

-[V表名]>,]V列名]>=[V表名2>,]v列名2>

■任何子句中引用表工和表2中同名屬性時,都必須

加表名前綴。引用唯一屬性名時可以加也可以省略

表名前綴。

AnIntroductiontoDatabaseSystem97

等值連接

假設(shè)S:ude?表、SC表分別有下列數(shù)據(jù)立表

Student表

SnoCnoGrade

SnoSnameSsexSageSdept

95001李勇男20CS95001192

95002劉晨女19IS95001285

95003王敏女18MA

95001388

95004張立男19IS95002290

95002380

AnintroductiontoDatabaseSystem98

然連接

■等值連接的一種特殊情況,把目標(biāo)列中

重復(fù)的屬性列去掉。

[例34]對[例33]用自然連接完成。

SELECTStudent.Sno,Sname,Ssex,

Sage,Sdept,Cno,Grade

FROMStudent,SC

WHEREStudentSno=SC.Sno;

■“INNERJOIN”

AnIntroductiontoDatabaseSystem99

非等值連接查詢

[V表名]>?]<列名]>v比較運算符,[V表名

2>?]V歹I]名2>

比較運算符:>、<、>=、<=>!=

[V表名]>.]<列名]>BETWEEN[V表名

2>」V列名2>AND[V表名2>?]V列名3>

AnIntroductiontoDatabaseSystem100

、自身連接

■一個表與其自己進行連接,稱為表的自身連接

■需要給表起別名以示區(qū)別

■由于所有屬性名都是同名屬性,因此必須使用

別名前綴

AnIntroductiontoDatabaseSystem101

自身連接(續(xù))

[例35]查詢每一門課的間接先修課(即

先修課的先修課)

SELECTFIRST.Cno,SECOND.Cpno

FROMCourseFIRST,Course

SECOND

WHEREFIRST.Cpno=SECOND.Cno;

102

AnIntroductiontoDatabaseSystem

自身連接(續(xù))

FIRST表(Course表)

CnoCnameCpnoCcredit

1數(shù)據(jù)庫54

2數(shù)學(xué)2

3信息^統(tǒng)14

4操作系統(tǒng)63

5數(shù)據(jù)結(jié)構(gòu)74

6數(shù)據(jù)處理2

7PASCAL語言64

AnIntroductiontoDatabaseSystem103

自身連接(續(xù)

溫馨提示

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

最新文檔

評論

0/150

提交評論