chapter3關(guān)系數(shù)據(jù)庫語言_第1頁
chapter3關(guān)系數(shù)據(jù)庫語言_第2頁
chapter3關(guān)系數(shù)據(jù)庫語言_第3頁
chapter3關(guān)系數(shù)據(jù)庫語言_第4頁
chapter3關(guān)系數(shù)據(jù)庫語言_第5頁
已閱讀5頁,還剩90頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2023/6/6經(jīng)濟(jì)與管理學(xué)院13.1SQL概述3.2數(shù)據(jù)定義3.3數(shù)據(jù)操縱3.4視圖3.5數(shù)據(jù)控制第三章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL目錄2023/6/6經(jīng)濟(jì)與管理學(xué)院2第三章關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL

3.1SQL概述

結(jié)構(gòu)化查詢語言(structuredquerylanguage,簡稱SQL),是一種介于關(guān)系代數(shù)與關(guān)系演算之間的語言,其功能包括操縱、定義和控制三種功能,是一個通用的、功能極強(qiáng)的關(guān)系數(shù)據(jù)庫語言。2023/6/6經(jīng)濟(jì)與管理學(xué)院3SQL發(fā)展史:SQL-86標(biāo)準(zhǔn):1986年10月ANSI公布。1987年ISO通過SQL-86標(biāo)準(zhǔn)。SQL-89標(biāo)準(zhǔn):1989年ANSI公布。SQL-92標(biāo)準(zhǔn):1992年ANSI公布。正在醞釀SQL3標(biāo)準(zhǔn)。2023/6/6經(jīng)濟(jì)與管理學(xué)院43.1.1SQL的特點1.SQL功能(1)數(shù)據(jù)定義功能

SQL的數(shù)據(jù)定義功能是通過DDL(datadefinitionlanguage,數(shù)據(jù)定義語言)實現(xiàn),它用來定義關(guān)系數(shù)據(jù)庫的模式、外模式和內(nèi)模式,以實現(xiàn)對基本表、視圖以及索引文件的定義、修改和刪除等操作。2023/6/6經(jīng)濟(jì)與管理學(xué)院5(2)數(shù)據(jù)操縱功能

SQL的數(shù)據(jù)操縱功能是通過DML(datamanipulationlanguage,數(shù)據(jù)操縱語言)實現(xiàn)。DML包括數(shù)據(jù)查詢和數(shù)據(jù)更新兩種數(shù)據(jù)操縱語言。其中查詢指對數(shù)據(jù)庫中的數(shù)據(jù)查詢、統(tǒng)計、分組、排序、檢索等操作;數(shù)據(jù)更新指數(shù)據(jù)的插入、刪除和修改等數(shù)據(jù)維護(hù)操作。2023/6/6經(jīng)濟(jì)與管理學(xué)院6(3)數(shù)據(jù)控制功能數(shù)據(jù)控制指數(shù)據(jù)的安全性和完整性控制。通過DCL(datacontrollanguage,數(shù)據(jù)控制語言)實現(xiàn)。SQL通過對數(shù)據(jù)庫用戶的授權(quán)和收權(quán)命令來實現(xiàn)對有關(guān)數(shù)據(jù)的存取控制,以保證數(shù)據(jù)庫的安全性。SQL通過提供數(shù)據(jù)完整性約束條件的定義和檢查機(jī)制,以保障數(shù)據(jù)的完整性。2023/6/6經(jīng)濟(jì)與管理學(xué)院72.SQL特點(1)綜合統(tǒng)一

SQL語言集DDL、DML、DCL的功能于一體,語言風(fēng)格統(tǒng)一,可獨立完成數(shù)據(jù)庫生命周期中的全部活動,包括定義關(guān)系模式、錄入數(shù)據(jù)以及建立數(shù)據(jù)庫、查詢、更新、數(shù)據(jù)庫安全性控制等一系列操作的要求。2023/6/6經(jīng)濟(jì)與管理學(xué)院8(2)高度非過程化非關(guān)系數(shù)據(jù)模型的數(shù)據(jù)操縱語言是面向過程的語言,用其完成某項任務(wù)請求必須指定存取路徑。而SQL語言進(jìn)行操作,用戶只需提出“做什么‘,而不必指明’怎么做‘。2023/6/6經(jīng)濟(jì)與管理學(xué)院9(3)面向集合的操作方式非關(guān)系模型采用的是面向記錄的操作方式,任何一個操作其對象都是一條記錄。而SQL語言采用集合操作方式,不僅查找結(jié)果可以是元組的集合,而且一次插入、刪除、更新操作的對象也可以是元組的集合。2023/6/6經(jīng)濟(jì)與管理學(xué)院10(4)以同一種語法結(jié)構(gòu)提供兩種使用方式

SQL語言既是自含式語言,又是嵌入式語言。作為自含式語言,用戶可在終端直接輸入SQL命令對數(shù)據(jù)庫進(jìn)行操作;作為嵌入式語言,可嵌入到高級語言中。2023/6/6經(jīng)濟(jì)與管理學(xué)院11(5)語言簡單,易學(xué)易用

SQL功能極強(qiáng),但語言極其簡潔,數(shù)據(jù)定義、控制和操縱的核心動詞只有9個:CREATE、DROP、ALTER、SELECT、INSERT、UPDATE、DELETE、GRANT、REVOKE。SQL功能動詞數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,DROP,ALTER數(shù)據(jù)操縱INSERT,UPDATE,DELETE數(shù)據(jù)控制GRANT,REVOKE2023/6/6經(jīng)濟(jì)與管理學(xué)院123.1.2SQL語言的基本概念

SQL語言支持關(guān)系數(shù)據(jù)庫三級模式結(jié)構(gòu)。其中外模式對應(yīng)于視圖(view)和部分基本表(basetable),模式對應(yīng)于基本表,內(nèi)模式對應(yīng)于存儲文件。SQL基本表1視圖2視圖1基本表2基本表3基本表4存儲文件1存儲文件2內(nèi)模式模式外模式2023/6/6經(jīng)濟(jì)與管理學(xué)院133.2數(shù)據(jù)定義

關(guān)系數(shù)據(jù)庫由模式、外模式和內(nèi)模式組成,即關(guān)系數(shù)據(jù)庫的基本對象是表、視圖、索引和數(shù)據(jù)庫。因此SQL的數(shù)據(jù)定義功能包括定義表、定義視圖、定義索引和定義數(shù)據(jù)庫。如表1所示。操作對象操作方式創(chuàng)建刪除修改表CreatetableDroptableAltertable視圖CreateviewDropview索引CreateindexDropindex數(shù)據(jù)庫CreatedatabaseDropdatabaseAlterdatabase2023/6/6經(jīng)濟(jì)與管理學(xué)院14語句格式約定符號語句格式中。尖括號“<>”中為實際語義;中括號“[]”中的內(nèi)容為任選項;大括號“{}”或分隔符“|”中的內(nèi)容為必選項,即必選其一;[,…n]表示前面的項次可以重復(fù)多次。一般語法規(guī)定

SQL中的數(shù)據(jù)項(包括列項、表和視圖)分隔符為“,”,其字符串常數(shù)的定界符用單引號“‘”表示。SQL特殊語法規(guī)定

SQL關(guān)鍵詞一般使用大寫字母表示;SQL語句的結(jié)束符為“;”。2023/6/6經(jīng)濟(jì)與管理學(xué)院153.2.1定義、刪除與修改基本表1.定義基本表一般格式:CREATETABLE<表名>(<列名><數(shù)據(jù)類型>[列級完整性約束條件])[,<列名><數(shù)據(jù)類型>[列級完整性約束條件]…][,<表級完整性約束條件>];2023/6/6經(jīng)濟(jì)與管理學(xué)院16例1.建立一個“職工”表personel,它由職工號no、姓名name、性別sex、年齡age、所在部門dept五個屬性組成,其中職工號屬性不能為空,并且值是唯一的。例2./******jobstable*******/CREATETABLEjobs(job_idsmallintIDENTITY(1,1)PRIMARYKEYCLUSTERED,job_descvarchar(50)NOTNULLDEFAULT'NewPosition-titlenotformalizedyet',min_lvltinyintNOTNULLCHECK(min_lvl>=10),max_lvltinyintNOTNULLCHECK(max_lvl<=250))2023/6/6經(jīng)濟(jì)與管理學(xué)院17例3./*******employeetable******/CREATETABLEemployee(emp_idempidCONSTRAINTPK_emp_idPRIMARYKEYNONCLUSTEREDCONSTRAINTCK_emp_idCHECK(emp_idLIKE'[A-Z][A-Z][A-Z][1-9][0-9][0-9][0-9][0-9][FM]'oremp_idLIKE'[A-Z]-[A-Z][1-9][0-9][0-9][0-9][0-9][FM]'),fnamevarchar(20)NOTNULL,minitchar(1)NULL,lnamevarchar(30)NOTNULL,job_idsmallintNOTNULLDEFAULT1REFERENCESjobs(job_id),job_lvltinyintDEFAULT10,pub_idchar(4)NOTNULLDEFAULT('9952')REFERENCESpublishers(pub_id),hire_datedatetimeNOTNULLDEFAULT(getdate())2023/6/6經(jīng)濟(jì)與管理學(xué)院18例4.下例顯示如何使用表達(dá)式((low+high)/2)

計算myavg計算列。

CREATETABLEmytable(lowint,highint,myavgAS(low+high)/2)2023/6/6經(jīng)濟(jì)與管理學(xué)院192.修改表Altertable<表名>[add<新列名><數(shù)據(jù)類型>[完整性約束][,…n]][dropcolumn<列名>[,…n]|<完整性約束名>][modify|altercolumn<列名><數(shù)據(jù)類型>[,…n]]2023/6/6經(jīng)濟(jì)與管理學(xué)院20例5.向personel表增加“參加工作時間”列,其數(shù)據(jù)類型為日期型。例6.將原有的數(shù)據(jù)類型改為半字長整型。例7.刪除關(guān)于學(xué)號必須取唯一的約束。3.刪除基本表(物理刪除)一般格式:DROPTABLE<表名>注意:基本表定義一旦刪除,表中的數(shù)據(jù)及其上建立的索引都將自動刪除,視圖雖然存在,但也已不能使用。2023/6/6經(jīng)濟(jì)與管理學(xué)院213.2.2建立和刪除索引1.索引的作用使用索引可以明顯地加快數(shù)據(jù)查詢的速度使用索引可以保證數(shù)據(jù)的唯一性使用索引可以加快連接速度在使用ORDERBY和GROUPBY子句進(jìn)行數(shù)據(jù)檢索時,同樣可以顯著減少查詢分組和排序的時間2023/6/6經(jīng)濟(jì)與管理學(xué)院222.創(chuàng)建索引的不足創(chuàng)建索引和維護(hù)索引要耗費時間索引需要占物理空間,如建聚簇索引,則需要的空間更大當(dāng)對表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時候,索引也要動態(tài)維護(hù),這就降低了數(shù)據(jù)的維護(hù)速度2023/6/6經(jīng)濟(jì)與管理學(xué)院233.創(chuàng)建索引的基本指導(dǎo)原則在經(jīng)常需要搜索的列上面創(chuàng)建索引在主鍵上面創(chuàng)建索引在經(jīng)常用在連接的列上創(chuàng)建索引,也就是在外鍵上面創(chuàng)建索引在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因為索引已經(jīng)排序,其指定的范圍就是連續(xù)的在經(jīng)常使用在where子句中的列上面創(chuàng)建索引2023/6/6經(jīng)濟(jì)與管理學(xué)院244.建立索引的格式CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEXindex_name

ON<table>|<view>>

(column[ASC|DESC][,...n])

2023/6/6經(jīng)濟(jì)與管理學(xué)院25說明:UNIQUE為表或視圖創(chuàng)建唯一索引(不允許存在索引值相同的兩行)。視圖上的聚集索引必須是UNIQUE索引。SQLServer不允許為已經(jīng)包含重復(fù)值的列創(chuàng)建唯一索引,無論是否設(shè)置了IGNORE_DUP_KEY。如果嘗試這樣做,SQLServer會顯示錯誤信息;重復(fù)值必須先刪除,才能為這些列創(chuàng)建唯一索引。2023/6/6經(jīng)濟(jì)與管理學(xué)院26CLUSTERED:創(chuàng)建聚簇索引。所謂聚簇索引是指索引項的順序與表中記錄的物理順序一致的索引組織。一個表或視圖只允許同時有一個聚集索引。例8.為職工personel表創(chuàng)建索引,按職工號升序和姓名降序建唯一索引。5.刪除索引一般格式:Dropindex<索引名>2023/6/6經(jīng)濟(jì)與管理學(xué)院273.3數(shù)據(jù)操縱SQL數(shù)據(jù)操縱功能包括檢索查詢和更新(增、刪、改)功能。3.3.1SQL查詢功能數(shù)據(jù)查詢功能是指根據(jù)用戶的需要以一種可讀的方式從數(shù)據(jù)庫中提取所需要的數(shù)據(jù),通過select語句實現(xiàn)。2023/6/6經(jīng)濟(jì)與管理學(xué)院28其一般格式為:Select[all|distinct]<目標(biāo)列組>from<表名或視圖名>[,<表名或視圖名>]…[where<條件表達(dá)式>][groupby<列名1>[having<內(nèi)部函數(shù)表達(dá)式>]][orderby<列名2>][ASC|DESC]2023/6/6經(jīng)濟(jì)與管理學(xué)院29

整個select語句的含義是:根據(jù)where子句的條件表達(dá)式,從form子句指定的基本表或視圖中找出滿足條件的元組,再按select子句中的目標(biāo)列表達(dá)式,選出元組中的屬性值形成結(jié)果表。如果有GROUP子句,則將結(jié)果按<列名1>的值進(jìn)行分組,該屬性列值相等的元組為一個組,每個組產(chǎn)生結(jié)果表中的一條記錄。通常會在每組中作用集函數(shù)。如果GROUP子句帶having短語,則只能滿足指定條件的組才能輸出。如果有ORDER子句,則結(jié)果集按〈列名2〉的值升序或降序排列。2023/6/6經(jīng)濟(jì)與管理學(xué)院30ALL:指定在結(jié)果集中可以顯示重復(fù)行。ALL是默認(rèn)設(shè)置。DISTINCT:指定在結(jié)果集中只能顯示唯一行。為了DISTINCT關(guān)鍵字的用途,空值被認(rèn)為相等。2023/6/6經(jīng)濟(jì)與管理學(xué)院311.單表查詢單表查詢是指僅涉及一個數(shù)據(jù)庫表的查詢,比如選擇一個表中的某些列值、選擇一個表中的某些特定行等。(1)查詢表中的若干列選擇表中的全部列或部分列,這類運算又稱為投影。①查詢指定列在很多情況下,用戶只對表中的一部分屬性感興趣。2023/6/6經(jīng)濟(jì)與管理學(xué)院32例1.查詢?nèi)w學(xué)生的學(xué)號與姓名②查詢所有列例3.查詢?nèi)w學(xué)生的詳細(xì)記錄③查詢經(jīng)過計算的值例4.查詢?nèi)w學(xué)生的姓名及其出生年份Selectsname,2003-sagefromstudent④列別名(包括列值固定的)例5.查詢?nèi)w學(xué)生的姓名、出生年份和所在系,要求用小寫字母表示所在系名。2023/6/6經(jīng)濟(jì)與管理學(xué)院33(2)消除重復(fù)的行兩個本來并不完全相同的元組,投影到指定的某些列后,可能變成完全相同的行。例6.查詢選修了課程的學(xué)生學(xué)號。(3)條件查詢查詢滿足指定條件的元組可以通過where子句實現(xiàn)。Where子句常用的查詢條件如表1所示。2023/6/6經(jīng)濟(jì)與管理學(xué)院34查詢條件謂詞比較=,>,<,>=,<=,!=,<>,!>,!<,not+上述比較運算符確定范圍Betweenand,notBetweenand確定集合In,notin字符匹配Like,notlike空值Isnull,isnotnull多重條件And,or2023/6/6經(jīng)濟(jì)與管理學(xué)院35Like謂詞的一般形式是:

列名like字符串常數(shù)注:列名的類型必須是字符串或變量字符串。字符_(下劃線)表示可以和任意的單個字符匹配。字符“%”(百分號)表示可以和任意長的(長度可以為0)字符串匹配。所有其它的字符只代表自己。2023/6/6經(jīng)濟(jì)與管理學(xué)院36例6.使用between(Between后是范圍的下限,即低值)的查詢:求年齡在20歲與22歲之間的學(xué)生姓名和年齡。例7.利用like查詢。求學(xué)號為99001的學(xué)生的詳細(xì)信息。例8.涉及空值的查詢:求缺少成績的學(xué)生的學(xué)號和課程號。2023/6/6經(jīng)濟(jì)與管理學(xué)院37(4)對查詢結(jié)果進(jìn)行排序用ORDERBY子句指定一個或多個屬性列實現(xiàn)升序(ASC)或降序(DESC)重排結(jié)果集。例9.查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系的系號升序排列,同一系的學(xué)生按年齡降序排列。2023/6/6經(jīng)濟(jì)與管理學(xué)院38(5)使用集函數(shù)SQL提供了許多集函數(shù),主要包括:Count(*)返回組中項目的數(shù)量,這些項目包括NULL值Count(all<expression>)對組中的每一行都計算expression

并返回非空值的數(shù)量。COUNT(DISTINCTexpression)對組中的每一行都計算expression

并返回唯一非空值的數(shù)量sum([distinct|all]<列名>)統(tǒng)計一列值的總和(此列必須是數(shù)值型)2023/6/6經(jīng)濟(jì)與管理學(xué)院39avg([distinct|all]<列名>)統(tǒng)計一列值的平均值(此列必須是數(shù)值型)max([distinct|all]<列名>)求一列值中的最大值min([distinct|all]<列名>)求一列值中的最小值如果指定distinct,表示計算時取消指定列中的重復(fù)值。除COUNT(*)函數(shù)之外,聚合函數(shù)忽略空值。例10.查詢選修了選修課的學(xué)生人數(shù)。2023/6/6經(jīng)濟(jì)與管理學(xué)院40(6)對查詢結(jié)果分組

Groupby子句可以將查詢結(jié)果表的各行按一列或多列值相等的原則進(jìn)行分組,值相等的為一組。例11.查詢選修了3門以上課程的學(xué)生的學(xué)號。

Where子句與having短語的區(qū)別在于作用對象不同:where子句作用于基本表或視圖;having短語作用于組。2023/6/6經(jīng)濟(jì)與管理學(xué)院41例12selecttype,pub_id,avg(price)avefromtitlesgroupbytype,pub_idwithrollup功能:每一類書對每一個出版商的平均價格;每一類書對全部出版商的平均價格;所有種類的書對全部出版商的平均價格。2023/6/6經(jīng)濟(jì)與管理學(xué)院42例13.selecttype,pub_id,avg(price)avefromtitlesgroupbytype,pub_idwithcube功能:每一類書對每一個出版商的平均價格;每一類書對全部出版商的平均價格;所有種類的書對每一個出版商的平均價格。所有種類的書對全部出版商的平均價格;2023/6/6經(jīng)濟(jì)與管理學(xué)院432.連接查詢?nèi)粼诓樵儠r同時涉及到兩個或以上的表,則稱之為連接查詢。在SQLSERVER中,可以使用兩種連接語法形式:一種是ANSI連接語法,這時連接用在from子句中;另外一種是SQLSERVER連接語法形式,這時連接用在WHERE子句中。包括等值連接、自然連接、非等值連接、自身連接、外連接和復(fù)合連。2023/6/6經(jīng)濟(jì)與管理學(xué)院44(1)等值與非等值連接當(dāng)連接運算符為=時,稱為等值連接;使用其它運算符時稱為非等值連接。例14.查詢每個學(xué)生及其選修課程情況。(進(jìn)行等值連接)(2)自身連接一個表與其自己進(jìn)行連接。例15.查詢課程序號等于學(xué)分號的課程名稱。2023/6/6經(jīng)濟(jì)與管理學(xué)院45(3)外連接外連接的表示方法:在連接謂詞的某一邊加上符號*,它可以和另一邊的表中所有不滿足連接條件的元組進(jìn)行連接。分為左外連接(左邊的記錄全顯示)和右外連接。例16.查詢所有學(xué)生的選課信息,要求已選課的列出每個學(xué)生的基本信息及選課情況;若某學(xué)生沒選課,只輸出基本情況,其選課信息為空值。2023/6/6經(jīng)濟(jì)與管理學(xué)院46(4)復(fù)合連接條件

Where字句可以用于多個條件的連接操作。例17.查詢選修課程4且成績在80分以上的所有學(xué)生。2023/6/6經(jīng)濟(jì)與管理學(xué)院473.嵌套查詢在SQL語言中,一個SELECT-FROM-WHERE語句稱為一個查詢模塊。將一個查詢塊嵌套在另一個查詢塊的where子句或having短語的條件中的查詢稱為嵌套查詢或子查詢。注意:子查詢的SELECT語句中不能使用ORDERBY子句,orderby子句永遠(yuǎn)只能對最終查詢結(jié)果排序。2023/6/6經(jīng)濟(jì)與管理學(xué)院48

子查詢的嵌套層次最多可達(dá)255層。子查詢可分為普通子查詢和相關(guān)子查詢,它們之間的區(qū)別在于相關(guān)子查詢的檢索條件中引用了外部查詢的列,它把外部查詢的列值作為子查詢檢索條件的條件值。由于這個區(qū)別,這兩種子查詢的執(zhí)行方式也不同。2023/6/6經(jīng)濟(jì)與管理學(xué)院49

普通子查詢的執(zhí)行順序是首先執(zhí)行子查詢,然后把子查詢的結(jié)果集合作為外部查詢的檢索條件的條件值。也就是說,只執(zhí)行一次子查詢,外部查詢所涉及的所有記錄行都與其查詢結(jié)果進(jìn)行比較以確定查詢結(jié)果集合。2023/6/6經(jīng)濟(jì)與管理學(xué)院50相關(guān)子查詢來說,它的執(zhí)行順序是:①首先由外部查詢選取一行記錄(稱為候選行);②然后內(nèi)部的子查詢利用候選行中相關(guān)列的值查詢結(jié)果數(shù)據(jù);③接著外部查詢利用子查詢返回的結(jié)果集合判斷候選行是否滿足檢索條件,如果滿足條件則把該候選行放入外部查詢的結(jié)果集合;④重復(fù)執(zhí)行上述步驟直到處理完外部查詢的每一行候選行為止。由此可知,根據(jù)外部查詢候選行的行數(shù),相關(guān)子查詢將執(zhí)行相應(yīng)的次數(shù)。2023/6/6經(jīng)濟(jì)與管理學(xué)院51

由于子查詢通常返回的是一個集合(包含多個值),而參與比較的外部查詢記錄行中的列只能取一個值,因此常使用IN、NOTIN、EXISTS、NOTEXISTS以及ANY/ALL(與比較運算符同時使用)來對它們進(jìn)行比較。2023/6/6經(jīng)濟(jì)與管理學(xué)院52例18.求選修了課程名為“數(shù)據(jù)庫”的學(xué)生姓名。(1)帶有謂詞in的子查詢帶有IN謂詞的子查詢是指父查詢與子查詢之間用in進(jìn)行連接,判斷某個屬性列值是否在子查詢的結(jié)果中。例19.查找與“楊敏”在同一系學(xué)習(xí)的學(xué)生。2023/6/6經(jīng)濟(jì)與管理學(xué)院53(2)帶有ANY或ALL謂詞的子查詢使用ANY或ALL謂詞時必須同時使用比較預(yù)算符。其語義為:>any:大于子查詢結(jié)果中的某個值<any:小于子查詢結(jié)果中的某個值>=any:大于等于子查詢結(jié)果中的某個值<=any:小于等于子查詢結(jié)果中的某個值=any:等于子查詢結(jié)果中的某個值!=any或<>any:不等于子查詢結(jié)果中的某個值2023/6/6經(jīng)濟(jì)與管理學(xué)院54>all:大于子查詢結(jié)果中的所有值<all:小于子查詢結(jié)果中的所有值>=all:大于等于子查詢結(jié)果中的所有值<=all:小于等于子查詢結(jié)果中的所有值=all:等于子查詢結(jié)果中的所有值(無意義)!=all或<>all:不等于子查詢結(jié)果中的所有值2023/6/6經(jīng)濟(jì)與管理學(xué)院55如:(1)查詢年齡最小的學(xué)生。(2)查詢其它系比計算機(jī)系某一學(xué)生年齡小的學(xué)生姓名及年齡(3)查詢其它系比計算機(jī)系所有學(xué)生年齡都要小的學(xué)生姓名及年齡2023/6/6經(jīng)濟(jì)與管理學(xué)院56例20.查詢其它書籍類型中比trad_cook類的價格都大的書籍類型及價格。Selecttitle,type,pricefromtitleswhereprice>all(selectpricefromtitleswheretype='trad_cook')andtype<>'trad_cook'2023/6/6經(jīng)濟(jì)與管理學(xué)院57(3)帶有EXISTS謂詞的子查詢

EXISTS代表存在量詞。帶有EXISTS謂詞的子查詢不返回任何實際數(shù)據(jù),它只產(chǎn)生邏輯真“true”或邏輯假值“false”。使用EXISTS關(guān)鍵字引入一個子查詢時,就相當(dāng)于進(jìn)行一次存在測試。外部查詢的WHERE子句測試子查詢返回的行是否存在。子查詢實際上不產(chǎn)生任何數(shù)據(jù);它只返回TRUE或FALSE值。2023/6/6經(jīng)濟(jì)與管理學(xué)院58例21.求沒選修2號課程的學(xué)生的姓名。SELECT姓名fromstudentwherenotexists(select*fromscorewhere學(xué)號=student.學(xué)號AND課程號='2')2023/6/6經(jīng)濟(jì)與管理學(xué)院59例22.求沒有選修任何課程的學(xué)生的姓名。SELECT姓名FRomstudentwhere學(xué)號notin(select學(xué)號fromscorewhere學(xué)號=student.學(xué)號)或:SELECT姓名fromstudentwherenotexists(select學(xué)號fromscorewhere學(xué)號=student.學(xué)號)2023/6/6經(jīng)濟(jì)與管理學(xué)院60SQL語言中沒有全稱量詞(forall)。因此必須利用謂詞演算將一個帶有全稱量詞的謂詞轉(zhuǎn)換為等價的帶有存在量詞的謂詞:(x)p(x(p))2023/6/6經(jīng)濟(jì)與管理學(xué)院61例23.查詢選修了全部課程的學(xué)生姓名。由于沒有全稱量詞,可將題目的意思轉(zhuǎn)換為等價的存在量詞的形式:查詢這樣的學(xué)生姓名,沒有那一門課程是他不選的。該查詢涉及3個關(guān)系,存放學(xué)生姓名的student表,存放所有課程信息的course和存放學(xué)生選課信息的score表。(x)p:任給一門課程x,P學(xué)生都選修了。(x(p)):不存在一門課程x,P學(xué)生沒有選。

2023/6/6經(jīng)濟(jì)與管理學(xué)院62

本例使用了兩個notexists操作符:第一個notexists表示不存在這樣的課程記錄,第二個notexists表示該生沒有選修的選課記錄。①外查詢select姓名fromstudentwherenotexists

意為“從S關(guān)系中找這樣的學(xué)生,不存在……”;②子查詢1select*fromcoursewherenotexists

意為“從C關(guān)系中找這樣的課程,不存在……”;③子查詢2select*fromscorewherestudent.學(xué)號=學(xué)號andcourse.課程號=課程號意為,當(dāng)外循環(huán)的student.學(xué)號等于子查詢2的score.學(xué)號,并且子查詢1的course.課程號等于score.課程號的元組找出來。2023/6/6經(jīng)濟(jì)與管理學(xué)院63分析:本題是在外循環(huán)中找一個student.學(xué)號,并按如下步驟判斷是否在結(jié)果集:①在子查詢1中找一門課程COURSE.課號看STUDENT.學(xué)號是否選;②若選:在子查詢1中找下一門課程的COURSE.課號,轉(zhuǎn)①;③未選,那么該學(xué)號不在結(jié)果集,從外循環(huán)找下一個STUDENT.學(xué)號是否選,轉(zhuǎn)①;④直到外循環(huán)的最后一個STUDENT.學(xué)號。2023/6/6經(jīng)濟(jì)與管理學(xué)院64SELECT姓名fromstudentwherenotexists(select*fromcoursewherenotexists(select*fromscorewherestudent.學(xué)號=學(xué)號

andcourse.課程號=課程號))2023/6/6經(jīng)濟(jì)與管理學(xué)院65SQL語言也沒有蘊涵(Implication)邏輯運算。因此必須利用謂詞演算將一個邏輯蘊涵的謂詞轉(zhuǎn)換為等價的帶存在量詞的謂詞:pqp∨q2023/6/6經(jīng)濟(jì)與管理學(xué)院66例24.求至少選修了學(xué)生95001選修的全部課程的學(xué)生號和姓名。本題的查詢要求可以做如下解釋,查詢這樣的學(xué)生,凡是95001選修的課,他都選修了。換句話說,若有一個學(xué)號為x的學(xué)生,對所有的課程y,只要學(xué)號為95001的學(xué)生選修了課程y,則x也選修了y;那么就將他的學(xué)號選出來。2023/6/6經(jīng)濟(jì)與管理學(xué)院67該查詢可以形式化地表示如下:用p表示謂詞’學(xué)生95001選修了課程y’用q表示謂詞’學(xué)生x選修了課程y’則上述查詢可以表示為(y)(pq)該查詢可以轉(zhuǎn)化為如下等價形式:(y)(pq)y((pq))y((p∨q))y(p∧q)

其語義為:不存在這樣地課程y,學(xué)生95002選修了y,而學(xué)生x沒有選。2023/6/6經(jīng)濟(jì)與管理學(xué)院68SELECT學(xué)號,姓名fromstudentswherenotexists(select*fromscores1wheres1.學(xué)號='99001'andnotexists(select*fromscores2wheres.學(xué)號=s2.學(xué)號

ands1.課程號=s2.課程號

))and學(xué)號<>'99001'2023/6/6經(jīng)濟(jì)與管理學(xué)院694.集合查詢每一個select語句都能獲得一個或一組元組。若要把多個SELECT語句的結(jié)果合并為一個結(jié)果,可用UNION完成。UNION運算符將兩個或更多查詢的結(jié)果組合為單個結(jié)果集,該結(jié)果集包含聯(lián)合查詢中的所有查詢的全部行。這與使用聯(lián)接組合兩個表中的列不同。2023/6/6經(jīng)濟(jì)與管理學(xué)院70

使用UNION組合兩個查詢的結(jié)果集的兩個基本規(guī)則是:所有查詢中的列數(shù)和列的順序必須相同。數(shù)據(jù)類型必須兼容。如果使用UNION運算符,那么單獨的SELECT語句不能包含其自己的ORDERBY。只能在最后一個SELECT語句的后面使用一個ORDERBY;該子句適用于最終的組合結(jié)果集。GROUPBY和HAVING子句只能在單獨的SELECT語句中指定。2023/6/6經(jīng)濟(jì)與管理學(xué)院71例25.查詢信息系的學(xué)生或年齡小于19歲的學(xué)生。select*fromstudentwhere所在系='is'unionselect*fromstudentwhere年齡<192023/6/6經(jīng)濟(jì)與管理學(xué)院72例26查詢選修了課程“01”或“02”的學(xué)生信息例27查詢既選修了課程“01”,又選修了課程“02”的學(xué)生信息2023/6/6經(jīng)濟(jì)與管理學(xué)院733.3.2SQL更新語句1.修改(update0一般格式:UPDATE

<表名>SETcolumn_name={expression|DEFAULT|NULL}[,...n]

[WHERE<search_condition>]例24.把學(xué)生“李蘭”的姓名改為“張巖”。例25.把所有學(xué)生的年齡加2。2023/6/6經(jīng)濟(jì)與管理學(xué)院74FROM子句中指定的表的別名不能作為SETcolumn_name

子句中的限定符使用。例如,下面的內(nèi)容無效:UPDATEtitlesSETt.ytd_sales=t.ytd_sales+s.qtyFROMtitlest,salessWHEREt.title_id=s.title_idANDs.ord_date=(SELECTMAX(sales.ord_date)FROMsales)若要使上例合法,請從列名中刪除別名t。UPDATEtitlesSETytd_sales=t.ytd_sales+s.qtyFROMtitlest,salessWHEREt.title_id=s.title_idANDs.ord_date=(SELECTMAX(sales.ord_date)FROMsales)2023/6/6經(jīng)濟(jì)與管理學(xué)院752.刪除(delete)格式:DELETE

FROMtable_name

[WHERE<search_condition>]

功能:刪除表中(指定)的記錄,而不是刪除表的定義。例26.刪除學(xué)生“99001”。例27.刪除所有學(xué)生的選課記錄。2023/6/6經(jīng)濟(jì)與管理學(xué)院763.插入(insert)格式:

INSERT語句可給表添加一個或多個新行。INSERT語句在簡單的情況下有如下形式:INSERT[INTO]table_or_view[(column_list)]VALUES(data_values)2023/6/6經(jīng)濟(jì)與管理學(xué)院77

所提供的數(shù)據(jù)值必須與列的列表匹配。數(shù)據(jù)值的數(shù)目必須與列數(shù)相同,每個數(shù)據(jù)值的數(shù)據(jù)類型、精度和小數(shù)位數(shù)也必須與相應(yīng)的列匹配。由于SQLServer為以下類型的列生成值,INSERT語句將不為這些類型的列指定值:具有IDENTITY屬性的列,該屬性為列生成值。有默認(rèn)值的列,該列用NEWID函數(shù)生成一個唯一的GUID值。計算列。2023/6/6經(jīng)濟(jì)與管理學(xué)院783.4視圖3.4.1視圖概念1.視圖的概念視圖是由一個或幾個基本表(或已定義的視圖)導(dǎo)出的虛表,即數(shù)據(jù)庫中只存放視圖的定義,而不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在原來的基本表中。2023/6/6經(jīng)濟(jì)與管理學(xué)院792.視圖的優(yōu)點(1)視圖能夠簡化用戶操作。(2)視圖機(jī)制可以使用戶以不同的方式看待同一數(shù)據(jù)。(3)視圖對數(shù)據(jù)庫的重構(gòu)提供了一定程度的邏輯獨立性。(4)視圖可以對機(jī)密的數(shù)據(jù)提供安全保護(hù)。(5)適當(dāng)?shù)睦靡晥D可以更清晰的表達(dá)查詢2023/6/6經(jīng)濟(jì)與管理學(xué)院803.視圖包括的內(nèi)容(1)基表的列的子集或者行的子集,因此可以說視圖是基表其中的一部分。(2)兩個或者多個基表的聯(lián)合。(3)兩個或者多個基表的連接。(4)基表的統(tǒng)計匯總。(5)另外一個視圖的子集。(6)視圖和基表的混合。2023/6/6經(jīng)濟(jì)與管理學(xué)院813.4.2定義視圖一般格式:CREATEVIEWview_name[(

column[,...n])]AS<子查詢>[WITHCHECKOPTION]

2023/6/6經(jīng)濟(jì)與管理學(xué)院82說明:(1)WITHCHECKOPTION子句強(qiáng)制所有數(shù)據(jù)修改語句均根據(jù)視圖執(zhí)行,以符合定義視圖的SELECT語句中所設(shè)的條件。如果使用該子句,修改行時需考慮到不讓它在修改完后從視圖中消失。任何可能導(dǎo)致行消失的修改都會被取消,并顯示錯誤信息。2023/6/6經(jīng)濟(jì)與管理學(xué)院83

(2)視圖列或者全部省略,或者全部指定。但以下情況必須指定視圖的列名:其中的某個目標(biāo)列不是單純的屬性名,而是集函數(shù)或列表達(dá)式。多表連接時選出了幾個同名列作為視圖的字段需要在視圖為中某個列啟用新的更合適的名字。2023/6/6經(jīng)濟(jì)與管理學(xué)院84例1.創(chuàng)建計算機(jī)系學(xué)生的視圖。CreateviewIS_studentAsSelectno,name,agefromstudentwheredept=‘計算機(jī)系’(省略了視圖is_student的字段名,則為子查詢的所有字段名)2023/6/6經(jīng)濟(jì)與管理學(xué)院85例2.建立信息系學(xué)生的視圖,要求進(jìn)行插入和修改操作時仍需保證該視圖只有信息系的學(xué)生。createviewis_studentasselect*fromstudentwhere所在系='is'withcheckoption2023/6/6經(jīng)濟(jì)與管理學(xué)院86例3.建立計算

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論