數(shù)據(jù)庫課件-第06章_第1頁
數(shù)據(jù)庫課件-第06章_第2頁
數(shù)據(jù)庫課件-第06章_第3頁
數(shù)據(jù)庫課件-第06章_第4頁
數(shù)據(jù)庫課件-第06章_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余115頁可下載查看

下載本文檔

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

文檔簡介

1關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL2SQL語言的主要特點(diǎn)之一:SQL是一種一體化的語言,它包括了數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操縱和數(shù)據(jù)控制等方面的功能,它可以完成數(shù)據(jù)庫活動中的全部工作。而以前的非關(guān)系模型的數(shù)據(jù)語言一般包括存儲模式描述語言、概念模式描述語言、外部模式描述語言和數(shù)據(jù)操縱語言等等,這種模型的數(shù)據(jù)語言,一是內(nèi)容多,二是掌握和使用起來都不象SQL那樣簡單、實(shí)用。3SQL語言的主要特點(diǎn)之二:SQL語言是一種高度非過程化的語言,它沒有必要一步步地告訴計(jì)算機(jī)“如何”去做,而只需要描述清楚用戶要“做什么”,SQL語言就可以將要求交給系統(tǒng),自動完成全部工作。4SQL語言的主要特點(diǎn)之三:SQL語言非常簡潔,雖然SQL語言功能很強(qiáng),但它只有為數(shù)不多的幾條命令,下表給出了分類的命令動詞,另外SQL的語法也非常簡單,它很接近自然語言(英語),因此容易學(xué)習(xí)、掌握。5SQL語言的主要特點(diǎn)之四:SQL語言可以直接以命令方式交互使用,也可以嵌入到程序設(shè)計(jì)語言中以程序方式使用。現(xiàn)在很多數(shù)據(jù)庫應(yīng)用開發(fā)工具,都將SQL語言直接溶入到自身的語言之中,使用起來更方便。這些使用方式為用戶提供了靈活的選擇余地。此外,盡管SQL的使用方式不同,但SQL語言的語法基本是一致的。6SQL的數(shù)據(jù)定義功能基本表的定義視圖的定義索引的定義CREATETABLEDROPTABLEALTERTABLECREATEVIEWDROPVIEWCREATEINDEXDROPINDEX7基本表定義:CREATETABLE<表名>(<列名><數(shù)據(jù)類型>[<列級完整性約束>],<列名><數(shù)據(jù)類型>[<列級完整性約束>],……,[<表級完整性約束>])[<其它參數(shù)>]?

<表名>給出要?jiǎng)?chuàng)建的基本表的名稱;?

<列名>給出列名或字段名;?

<數(shù)據(jù)類型>?

<列級完整性約束>?

<表級完整性約束>?

<其它參數(shù)>8數(shù)據(jù)類型為列指定數(shù)據(jù)類型及其數(shù)據(jù)寬度;

關(guān)系數(shù)據(jù)庫支持非常豐富的數(shù)據(jù)類型,不同的數(shù)據(jù)庫管理系統(tǒng)支持的數(shù)據(jù)類型基本是一樣的,右表列出了常用的數(shù)據(jù)類型。

9列級完整性約束用于定義列或字段一級的完整性約束,一般包括:NOTNULL和NULL約束

PRIMARYKEY約束

UNIQUE約束

FOREIGNKEY約束

DEFAULT定義

CHECK約束

10表級完整性約束用于定義表一級的完整性約束,一般包括:PRIMARYKEY約束(復(fù)合屬性構(gòu)成的主關(guān)鍵字說明)FOREIGNKEY約束(外部關(guān)鍵字及參照關(guān)系說明)CHECK約束(同時(shí)涉及到多個(gè)屬性的域完整性約束)

11其它參數(shù)不是SQL的標(biāo)準(zhǔn)選項(xiàng),一般用于與物理存儲有關(guān)的說明,不同的數(shù)據(jù)庫管理系統(tǒng)定義的方式肯定不同,另外該項(xiàng)參數(shù)一般也不是必需的。

12建立表的例子

倉庫職工供應(yīng)商訂購單13例:建立倉庫表CREATETABLE倉庫(

倉庫號CHAR(5)PRIMARYKEY,

城市CHAR(10),

面積INTCHECK(面積>0))14例:建立職工表CREATETABLE職工(

倉庫號CHAR(5)FOREIGNKEYREFERENCES倉庫,

職工號CHAR(5)PRIMARYKEY,

工資INTCHECK(工資>=1000AND工資<=5000)DEFAULT1200)15例:建立供應(yīng)商表CREATETABLE供應(yīng)商(

供應(yīng)商號CHAR(5)PRIMARYKEY,

供應(yīng)商名CHAR(20),

地址CHAR(20))16例:建立訂購單表CREATETABLE訂購單(職工號CHAR(5)NOTNULLFOREIGNKEYREFERENCES職工,供應(yīng)商號CHAR(5)NULLFOREIGNKEYREFERENCES供應(yīng)商,訂購單號CHAR(5)PRIMARYKEY,訂購日期DATETIMEDEFAULTgetdate())17表級約束的例子

假設(shè)職工關(guān)系的主關(guān)鍵字是(倉庫號,職工號),則相應(yīng)的命令如下:

CREATETABLE職工(倉庫號CHAR(5)FOREIGNKEYREFERENCES倉庫,職工號CHAR(5),工資INTCHECK(工資>=1000AND工資<=5000)DEFAULT1200,PRIMARYKEY(倉庫號,職工號))18修改表結(jié)構(gòu)命令A(yù)LTERTABLE<表名>ADD<列名><數(shù)據(jù)類型>[<列級完整性約束>]|DROP<完整性約束名>|DROPCOLUMN<列名>|ALTERCOLUMN<列名><數(shù)據(jù)類型>[<列級完整性約束>]

增加新的屬性(字段)

修改屬性的定義

刪除完整性約束

刪除屬性19增加新的屬性(字段)

往訂購單關(guān)系中增加一個(gè)新屬性“完成日期”ALTERTABLE訂購單

ADD完成日期DATETIMENULL20修改屬性的定義將訂購單關(guān)系的完成日期屬性的數(shù)據(jù)類型修改為SMALLDATETIMEALTERTABLE訂購單ALTERCOLUMN完成日期SMALLDATETIMENULL21刪除完整性約束建立的列級或表級完整性約束可以刪除,但是前提是在定義完整性約束時(shí)必須給出約束名稱,否則不能刪除。設(shè)有:CREATETABLE職工(倉庫號CHAR(5)FOREIGNKEY(倉庫號)REFERENCES倉庫(倉庫號),職工號CHAR(5)PRIMARYKEY,工資INTCONSTRAINTsalaryCHECK(工資>=1000AND工資<=5000)DEFAULT1200)則可以:

ALTERTABLE職工DROPCONSTRAINTsalary22刪除屬性

刪除訂購單關(guān)系中的“完成日期”屬性:ALTERTABLE訂購單DROPCOLUMN完成日期注意:有些系統(tǒng)的ALTERTABLE命令不允許刪除屬性,如果必須要?jiǎng)h除屬性,一般步驟是:先將舊表中的數(shù)據(jù)備份,然后刪除舊表、并建立新表,最后將原來的數(shù)據(jù)恢復(fù)到新表中。23刪除表命令格式:DROPTABLE<表名>例:DROPTABLE訂購單24索引定義的命令格式CREATE[UNIQUE][CLUSTERED]INDEX<索引名>ON<表名>(<列名>[ASC|DESC][,<列名>[ASC|DESC]…])

普通索引唯一(UNIQUE)索引

聚集(CLUSTERED)索引25普通索引

如果沒有指定UNIQUE或CLUSTERED等將建立普通索引。在單個(gè)字段上建立普通索引:CREATEINDEXsup_idxON訂購單(供應(yīng)商號)在多個(gè)字段上建立普通索引:CREATEINDEXsup_emp_idxON訂購單(供應(yīng)商號,職工號DESC)26職工號倉庫號工資0011wh115000002wh218000008wh116500013wh320000004wh312500005wh113000015wh41800…….…………27唯一索引通過指定UNIQUE則為表創(chuàng)建唯一索引(不允許存在索引值相同的兩個(gè)元組)。

在CREATETABLE命令中的UNIQUE約束將隱式創(chuàng)建唯一索引。

在倉庫關(guān)系的城市屬性上建立一個(gè)唯一索引:

CREATEUNIQUEINDEXcity_idxON倉庫(城市)

28聚集索引通過指定CLUSTERED建立聚集索引。(索引值與關(guān)系中元組的順序物理相同)。

在CREATETABLE命令中的PRIMARYKEY約束將隱式創(chuàng)建聚集索引。

一個(gè)表只允許建立一個(gè)聚集索引。

如果在創(chuàng)建表時(shí)已經(jīng)指定了主關(guān)鍵字,則不可以再創(chuàng)建聚集索引。

29使用索引的原則:

不應(yīng)該在一個(gè)表上建立太多的索引(一般不超過兩到三個(gè)),索引能改善查詢效果,但也耗費(fèi)了磁盤空間,降低了更新操作的性能,因?yàn)橄到y(tǒng)必須花時(shí)間來維護(hù)這些索引。除了為數(shù)據(jù)的完整性而建立的唯一索引外,建議在表較大時(shí)再建立普通索引,表中的數(shù)據(jù)越多,索引的優(yōu)越性才越明顯。30索引的刪除命令格式:

DROPINDEX<索引名>例:DROPINDEXsup_emp_idx31SQL的數(shù)據(jù)查詢功能基本格式:SELECT……FROM……WHERE……32SQL查詢命令格式SELECT[ALL|DISTINCT]{*|<表達(dá)式>,…,<表達(dá)式>}FROM<表名>[,<表名>…][WHERE<條件>][GROUPBY<列名>[,<列名>…][HAVING<謂詞>]][ORDERBY<列名>[ASC|DESC][,<列名>[ASC|DESC]…][COMPUTE…]33SELECT[ALL|DISTINCT]{*|<表達(dá)式>,…,<表達(dá)式>}

說明要查詢的數(shù)據(jù),ALL說明不去掉重復(fù)元組,DISTINCT說明要去掉重復(fù)元組,<表達(dá)式>一般是表中的列名,如果要查詢表中的所有列可以使用“*”表示

34FROM<表名>[,<表名>…]

說明要查詢的數(shù)據(jù)來自哪個(gè)(些)表,可以基于單個(gè)表或多個(gè)表進(jìn)行查詢35WHERE<邏輯表達(dá)式>

說明查詢條件,即選擇元組的條件,可以用于查詢條件的運(yùn)算符也非常豐富,下表列出了常用的運(yùn)算符36GROUPBY<列名>[,<列名>…][HAVING<謂詞>]

GROUPBY短語用于對查詢結(jié)果進(jìn)行分組,可以利用它進(jìn)行分組匯總;HAVING短語必須跟隨GROUPBY使用,它用來限定分組必須滿足的條件。37ORDERBY<列名>[ASC|DESC],[<列名>[ASC|DESC]]…

用來對查詢的結(jié)果進(jìn)行排序。38查詢的分類簡單查詢

排序

連接查詢

嵌套查詢

分組及計(jì)算查詢

39簡單查詢基于單個(gè)關(guān)系、簡單條件的查詢。從職工關(guān)系中檢索所有工資值。檢索倉庫關(guān)系中的所有元組。

檢索工資多于1230元的職工號。

檢索哪些倉庫有工資多于1210元的職工。

給出在倉庫WH1或WH2工作,并且工資少于1250元的職工號。

檢索出工資在1220元到1240元范圍內(nèi)的職工信息。

從供應(yīng)商關(guān)系中檢索出全部公司的信息(不要工廠或其他供應(yīng)商的信息)。

找出不在北京的全部供應(yīng)商信息。

找出尚未確定供應(yīng)商的訂購單。

列出已經(jīng)確定了供應(yīng)商的訂購單信息。

40從職工關(guān)系中檢索所有工資值SELECT工資FROM職工結(jié)果是:12201210125012301250SELECTDISTINCT工資FROM職工結(jié)果是:122012101250123041檢索倉庫關(guān)系中的所有元組

SELECT*FROM倉庫SELECT倉庫號,城市,面積FROM倉庫42檢索工資多于1230元的職工號SELECT職工號FROM職工WHERE工資>1230結(jié)果是:E4E743檢索哪些倉庫有工資多于1210元的職工

SELECTDISTINCT倉庫號FROM職工WHERE工資>1210結(jié)果是:WH2WH3WH144

給出在倉庫WH1或WH2工作,并且工資少于1250元的職工號

SELECT職工號FROM職工WHERE工資<1250AND(倉庫號='WH1'OR倉庫號='WH2')結(jié)果是:E1E345檢索出工資在1220元到1240元范圍內(nèi)的職工信息

SELECT*FROM職工WHERE工資BETWEEN1220AND1240結(jié)果是:WH2E11220WH3E61230表達(dá)式“工資BETWEEN1220AND1240“等價(jià)于(工資>=1220)AND(工資<=1240)46從供應(yīng)商關(guān)系中檢索出全部公司的信息

SELECT*FROM供應(yīng)商WHERE供應(yīng)商名LIKE'%公司'結(jié)果是:S4華通電子公司北京

這里的LIKE是字符串匹配運(yùn)算符,通配符“%”表示0個(gè)或多個(gè)字符,另外還有一個(gè)通配符“_”(下劃線)表示一個(gè)字符。47找出不在北京的全部供應(yīng)商信息

SELECT*FROM供應(yīng)商WHERE地址!='北京'或SELECT*FROM供應(yīng)商WHERENOT(地址='北京')結(jié)果是:S3振華電子廠西安S6607廠鄭州NOT的應(yīng)用范圍很廣,比如,可以有NOTIN、NOTBETWEEN等。48找出尚未確定供應(yīng)商的訂購單

SELECT*FROM訂購單WHERE供應(yīng)商號ISNULL結(jié)果是:E6NULLOR77 NULLE1NULLOR80 NULLE3NULLOR90 NULL

注意:查詢空值時(shí)要使用ISNULL,而=NULL是無效的,因?yàn)榭罩挡皇且粋€(gè)確定的值,所以不能用“=”這樣的運(yùn)算符進(jìn)行比較。49列出已經(jīng)確定了供應(yīng)商的訂購單信息

SELECT*FROM訂購單WHERE供應(yīng)商號ISNOTNULL結(jié)果是:E3 S3 OR91 2002-07-1300:00:00.000E7 S4 OR76 2002-05-2500:00:00.000E3 S4 OR79 2002-06-1300:00:00.000E1 S4 OR73 2002-07-2800:00:00.000E3 S7 OR67 2002-06-2300:00:00.00050排序可以對查詢的結(jié)果進(jìn)行排序,可以是升序或降序,可以按多列排序。按職工的工資值升序檢索出全部職工信息

先按倉庫號排序,再按工資排序并輸出全部職工信息

51按職工的工資值升序檢索出全部職工信息

SELECT*FROM職工ORDERBY工資結(jié)果是:WH1E31210WH2E11220WH3E61230WH2E41250WH1E7125052先按倉庫號排序再按工資排序輸出全部職工信息SELECT*FROM職工ORDERBY倉庫號,工資結(jié)果是:WH1E31210WH1E71250WH2E11220WH2E41250WH3E6123053練習(xí):1、檢索出面積大于200的倉庫信息;2、給出在wh2或wh3工作,并且工資大于1210元的職工號,倉庫號;3、檢索出工資在1210元到1250元范圍內(nèi)的職工號;4、從供應(yīng)商關(guān)系中檢索出全部工廠的信息(不要公司或其他供應(yīng)商的信息);5、找出不在西安的全部供應(yīng)商信息;6、按職工的工資值降序檢索出全部職工信息。5455連接查詢當(dāng)查詢的結(jié)果出自多個(gè)表時(shí),需要通過表之間的連接操作來完成。一般連接別名和自連接查詢

廣義笛卡爾積

內(nèi)連接

外連接

56一般連接常規(guī)的兩個(gè)表或多個(gè)表之間的連接。找出工資多于1230元的職工號和他們所在的城市

找出工作在面積大于400的倉庫的職工號以及這些職工工作所在的城市給出有北京倉庫訂購單的北京供應(yīng)商的名稱

57找出工資多于1230元的職工號和他們所在的城市SELECT職工號,城市FROM職工,倉庫WHERE(工資>1230)AND(職工.倉庫號=倉庫.倉庫號)SELECT職工號,城市FROM職工JOIN倉庫ON職工.倉庫號=倉庫.倉庫號WHERE工資>1230或結(jié)果是:E4上海E7北京58新的SQL標(biāo)準(zhǔn)中規(guī)定了專門的連接語句格式:SELECT<屬性或表達(dá)式列表>FROM<關(guān)系1>JOIN<關(guān)系2>[JOIN<關(guān)系3>…][[ON…][ON<連接條件2>]]ON<連接條件1>WHERE<查詢條件>GROUPBY…HAVING…ORDERBY…注意:JOIN的順序和ON的順序是逆著的。59找出工作在面積大于400的倉庫的職工號以及這些職工工作所在的城市

SELECT職工號,城市FROM倉庫,職工WHERE(面積>400)AND(職工.倉庫號=倉庫.倉庫號)SELECT職工號,城市FROM職工JOIN倉庫ON職工.倉庫號=倉庫.倉庫號WHERE面積>400或結(jié)果是:E1上海E4上海60給出有北京倉庫訂購單的北京供應(yīng)商的名稱SELECT供應(yīng)商名FROM供應(yīng)商,訂購單,職工,倉庫WHERE地址='北京'AND城市='北京'AND供應(yīng)商.供應(yīng)商號=訂購單.供應(yīng)商號AND訂購單.職工號=職工.職工號AND職工.倉庫號=倉庫.倉庫號SELECT供應(yīng)商名FROM供應(yīng)商JOIN訂購單JOIN職工JOIN倉庫ON職工.倉庫號=倉庫.倉庫號ON訂購單.職工號=職工.職工號ON供應(yīng)商.供應(yīng)商號=訂購單.供應(yīng)商號WHERE地址='北京'AND城市='北京'或61別名和自連接查詢一個(gè)表通過不同的屬性與其自身的連接稱作自連接。這種關(guān)系中的一些元組,根據(jù)出自同一值域的兩個(gè)不同的屬性,可以與另外一些元組有一種對應(yīng)關(guān)系(一對多的聯(lián)系)。為了實(shí)現(xiàn)自連接需要將一個(gè)關(guān)系看作兩個(gè)邏輯關(guān)系,為此需要給關(guān)系指定別名。

62定義別名的方法:

在連接操作中,經(jīng)常需要使用關(guān)系名作前綴,有時(shí)顯得很麻煩,因此,SQL允許在From短語中為關(guān)系名定義別名,格式:

<關(guān)系名><別名>63例:找出工作在面積大于400的倉庫的職工號以及這些職工工作的城市Select職工號,城市From倉庫W,職工EWhere(面積>400)and(E.倉庫號=W.倉庫號)64自連接查詢設(shè)有如下圖所示的雇員關(guān)系,其中雇員號和經(jīng)理兩個(gè)屬性出自同一個(gè)值域,同一元組的這兩個(gè)屬性值是“上、下級”關(guān)系。

查詢:根據(jù)雇員關(guān)系列出上一級經(jīng)理及其職員(被其領(lǐng)導(dǎo))的清單。SELECTS.雇員姓名,‘領(lǐng)導(dǎo)’,E.雇員姓名FROM雇員S,雇員EWHERES.雇員號=E.經(jīng)理結(jié)果是:趙涌領(lǐng)導(dǎo)錢潮趙涌領(lǐng)導(dǎo)孫潔孫潔領(lǐng)導(dǎo)李淥65通過定義別名形成了兩個(gè)邏輯關(guān)系,一個(gè)是經(jīng)理關(guān)系S,一個(gè)是職員關(guān)系E,結(jié)果在關(guān)系S和E上的連接實(shí)現(xiàn)了檢索要求,另外,在Select短語中可以有常量,如這里的“領(lǐng)導(dǎo)”。66廣義笛卡爾積在新的SQL標(biāo)準(zhǔn)中還支持廣義笛卡爾積(CROSS)運(yùn)算,SQLServer也支持該運(yùn)算。廣義笛卡爾積(CROSS)運(yùn)算的一般格式是:

SELECT<屬性或表達(dá)式列表>FROM<表名>CROSSJOIN<表名>[WHERE<限定條件>]其中FROM<表名>CROSSJOIN<表名>指出了廣義笛卡爾積運(yùn)算,如下命令將得到純粹的廣義笛卡爾積運(yùn)算的結(jié)果:SELECT*FROM<表名>CROSSJOIN<表名>67廣義笛卡爾積運(yùn)算實(shí)例得到倉庫關(guān)系和職工關(guān)系的廣義笛卡爾積的運(yùn)算結(jié)果

SELECT*FROM倉庫

CROSSJOIN職工

對倉庫關(guān)系和職工關(guān)系進(jìn)行傳統(tǒng)的連接

SELECT*FROM倉庫,職工

WHERE倉庫.倉庫號=職工.倉庫號

結(jié)果是:WH2 上海 500 WH2 E1 1220WH1 北京 370 WH1 E3 1210WH2 上海 500 WH2 E4 1250WH3 廣州 200 WH3 E6 1230WH1 北京 370 WH1 E7 125068內(nèi)連接在新的SQL標(biāo)準(zhǔn)中內(nèi)連接(INNER)運(yùn)算的一般格式是:

SELECT<屬性或表達(dá)式列表>FROM<表名>[INNER]JOIN<表名>ON<連接條件>[WHERE<限定條件>]內(nèi)連接就是傳統(tǒng)的連接操作,其中INNER可以省略,這里用ON短語指定連接條件,用WHERE短語指定其它限定條件。69外連接

外連接與前面所介紹的等值連接和自然連接不同。原來的連接是只有滿足連接條件,相應(yīng)的結(jié)果才會出現(xiàn)在結(jié)果表中;而外連接可以使不滿足連接條件的元組也出現(xiàn)在結(jié)果表中。按連接方式外連接又可以分為左連接(LEFT)、右連接(RIGHT)和全連接(FULL)三種。

70外連接(OUTER)運(yùn)算的一般格式左連接在結(jié)果表中包含第一個(gè)表中滿足條件的所有記錄;如果是在連接條件上匹配的元組,則第二個(gè)表返回相應(yīng)值,否則第二個(gè)表返回空值。

右連接在結(jié)果表中包含第二個(gè)表中滿足條件的所有記錄;如果是在連接條件上匹配的元組,則第一個(gè)表返回相應(yīng)值,否則第一個(gè)表返回空值。

全連接在結(jié)果表中包含兩個(gè)表中滿足條件的所有記錄;如果是在連接條件上匹配的元組,則另一個(gè)表返回相應(yīng)值,否則另一個(gè)表返回空值。

SELECT<屬性或表達(dá)式列表>FROM<表名>LEFT|RIGHT|FULL[OUTER]JOIN<表名>ON<連接條件>[WHERE<限定條件>]71舉例設(shè)有倉庫和職工兩個(gè)關(guān)系,如果是等值或自然連接

SELECT倉庫.倉庫號,城市,面積,職工號,工資

FROM倉庫JOIN職工

ON倉庫.倉庫號=職工.倉庫號結(jié)果是:WH2 上海 500 E1 1220WH1 北京 370 E3 1210WH2 上海 500 E4 1250WH3 廣州 200 E6 1230WH1 北京 370 E7 125072舉例設(shè)有倉庫和職工兩個(gè)關(guān)系,如果是左連接

SELECT倉庫.倉庫號,城市,面積,職工號,工資

FROM倉庫LEFTJOIN職工

ON倉庫.倉庫號=職工.倉庫號結(jié)果是:WH1 北京

370 E3 1210WH1 北京

370 E7 1250WH2 上海

500 E1 1220WH2 上海

500 E4 1250WH3 廣州

200 E6 1230WH4 武漢

400 NULL NULL73嵌套查詢普通嵌套查詢

使用量詞的嵌套查詢

內(nèi)、外層互相關(guān)嵌套查詢

使用EXISTS的嵌套查詢

74普通嵌套查詢當(dāng)檢索關(guān)系X中的元組時(shí),它的條件依賴于相關(guān)的關(guān)系Y中的元組的屬性值,這時(shí)使用普通的嵌套查詢將非常方便。

哪些城市至少有一個(gè)倉庫的職工的工資為1250元?找出和職工E4掙同樣工資的所有職工。

找出哪些城市的倉庫向北京的供應(yīng)商發(fā)出了訂購單。

75哪些城市至少有一個(gè)倉庫的職工的工資為1250元?SELECT城市FROM倉庫WHERE倉庫號IN(SELECT倉庫號

FROM職工

WHERE工資=1250)結(jié)果是:北京上海76找出和職工E4掙同樣工資的所有職工。SELECT職工號FROM職工WHERE工資=(SELECT工資

FROM職工

WHERE職工號=“E4”)結(jié)果是:E4E777找出哪些城市的倉庫向北京的供應(yīng)商發(fā)出了訂購單SELECT城市FROM倉庫WHERE倉庫號IN(SELECT倉庫號FROM職工WHERE職工號IN(SELECT職工號FROM訂購單WHERE供應(yīng)商號IN(SELECT供應(yīng)商號FROM供應(yīng)商WHERE地址='北京')))結(jié)果是:北京上海78使用量詞的嵌套查詢在嵌套查詢中可以使用ANY、SOME、ALL等量詞,它們的形式是:<表達(dá)式><比較運(yùn)算符>[ANY|ALL|SOME](子查詢)其中ANY和SOME是同義詞,在進(jìn)行比較運(yùn)算時(shí)只要子查詢中有一行能使結(jié)果為真,則結(jié)果就為真;而ALL則要求子查詢中的所有行都使結(jié)果為真時(shí),結(jié)果才為真。79檢索有職工的工資大于或等于WH1倉庫中任何一名職工的工資的倉庫號SELECTDISTINCT倉庫號FROM職工WHERE工資>=ANY(SELECT工資FROM職工

WHERE倉庫號='WH1')SELECTDISTINCT倉庫號FROM職工WHERE工資>=(SELECTMIN(工資)FROM職工

WHERE倉庫號='WH1')等價(jià)于:結(jié)果是:WH1WH2WH380檢索有職工的工資大于或等于WH1倉庫中所有職工的工資的倉庫號SELECTDISTINCT倉庫號FROM職工WHERE工資>=ALL(SELECT工資FROM職工

WHERE倉庫號='WH1')SELECTDISTINCT倉庫號FROM職工WHERE工資>=(SELECTMAX(工資)FROM職工

WHERE倉庫號='WH1')等價(jià)于:結(jié)果是:WH1WH281內(nèi)、外層互相關(guān)嵌套查詢一般的嵌套查詢都是外層查詢依賴于內(nèi)層查詢的結(jié)果,而內(nèi)層查詢與外層查詢無關(guān)。事實(shí)上,有時(shí)也需要內(nèi)、外層互相關(guān)的查詢,即內(nèi)層查詢需要外層查詢提供數(shù)據(jù),而外層查詢又依賴內(nèi)層查詢的結(jié)果。

82在訂購單關(guān)系中加入一個(gè)新字段總金額,說明完成該訂購單所應(yīng)付出的總金額數(shù)

查詢要求:列出每個(gè)職工經(jīng)手的具有最高總金額的訂購單信息

83列出每個(gè)職工經(jīng)手的具有最高總金額的訂購單信息SELECT職工號,供應(yīng)商號,訂購單號,訂購日期,MAX(總金額)FROM訂購單GROUPBY職工號SELECT*FROM訂購單outaWHERE總金額=(SELECTMAX(總金額)FROM訂購單inneraWHEREouta.職工號=innera.職工號)結(jié)果是:E7S4 OR76 2002-05-257250.00E6S6 OR77 2002-06-296000.00E3S7 OR67 2002-06-2335000.00E1S6 OR80 2002-07-2925600.0084使用EXISTS的嵌套查詢在嵌套查詢中還可以使用[NOT]EXISTS,具體形式是:

[NOT]EXISTS(子查詢)EXISTS或NOTEXISTS是用來檢查在子查詢中是否有結(jié)果返回(即存在元組或不存在元組)。85注意:Exists代表存在量詞,帶有Exists謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”,或著邏輯假值”false”.86檢索那些倉庫中還沒有職工的倉庫的信息。

SELECT*FROM倉庫WHERENOTEXISTS(SELECT*FROM職工

WHERE倉庫號=倉庫.倉庫號)SELECT*FROM倉庫WHERE倉庫號NOTIN(SELECT倉庫號FROM職工)等價(jià)于結(jié)果是:WH4武漢40087檢索那些倉庫中至少已經(jīng)有一個(gè)職工的倉庫的信息

SELECT*FROM倉庫WHEREEXISTS(SELECT*FROM職工

WHERE倉庫號=倉庫.倉庫號)等價(jià)于SELECT*FROM倉庫WHERE倉庫號IN(SELECT倉庫號FROM職工)結(jié)果是:WH1北京370WH2上海500WH3廣州20088注意:[NOT]EXISTS只是判斷子查詢中是否有或沒有結(jié)果返回,它本身并沒有任何運(yùn)算或比較。[NOT]EXISTS實(shí)際是一種內(nèi)、外層互相關(guān)的嵌套查詢,只有在內(nèi)層引用了外層的值,這種查詢才有意義。89分組及計(jì)算查詢SQL語言不僅可以從數(shù)據(jù)庫中查詢原始信息,而且還可以直接對查詢結(jié)果進(jìn)行計(jì)算和匯總。SQL語言支持分組的計(jì)算和匯總。用于計(jì)算檢索的函數(shù)主要有:COUNT——計(jì)數(shù)

SUM——求和

AVG——計(jì)算平均值

MAX——求最大值

MIN——求最小值

90找出供應(yīng)商所在地的數(shù)目

SELECTCOUNT(DISTINCT地址)FROM供應(yīng)商結(jié)果為391求支付的工資總數(shù)

SELECTSUM(工資)FROM職工結(jié)果是:616092求在“上?!眰}庫工作的職工的最高工資值

SELECTMAX(工資)FROM職工WHERE倉庫號IN(SELECT倉庫號FROM倉庫

WHERE城市=‘上海’)結(jié)果是:125093求每個(gè)倉庫的職工的平均工資

SELECT倉庫號,AVG(工資)FROM職工GROUPBY倉庫號結(jié)果是:WH11230WH21235WH3123094求至少有兩個(gè)職工的每個(gè)倉庫的平均工資

SELECT倉庫號,COUNT(*),AVG(工資)FROM職工GROUPBY倉庫號HAVINGCOUNT(*)>=2結(jié)果是:WH121230WH22123595Groupingsets子句groupingsets子句允許你指定多個(gè)groupby選項(xiàng)。增強(qiáng)了groupby的功能??梢酝ㄟ^一條select語句實(shí)現(xiàn)復(fù)雜繁瑣的多條select語句的查詢。96計(jì)算各倉庫的平均工資和工資小計(jì)select倉庫號,平均工資=avg(工資),sum(工資)

as工資總額from職工groupbygroupingsets( (倉庫號))其效果等同于:select

倉庫號,平均工資=avg(工資),sum(工資)

as

工資總額

from

職工group

by

倉庫號9798計(jì)算各倉庫的平均工資和工資小計(jì),最后給出全體職工的平均工資和工資總和

select倉庫號,平均工資=avg(工資),sum(工資)

as工資總額from職工groupbygroupingsets( (倉庫號), ())另一種實(shí)現(xiàn)方式:select

倉庫號,平均工資=avg(工資),sum(工資)

as

工資總額

from

職工group

by

倉庫號

with

rollup99100101102視圖視圖:是從一個(gè)或幾個(gè)基本表(或視圖)導(dǎo)出的表,它與基本表不同,是一個(gè)虛表。數(shù)據(jù)庫中只存放視圖的定義,而不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在原來的基本表中,因此基本表中的數(shù)據(jù)發(fā)生變化,從視圖中查詢出的數(shù)據(jù)也就隨之改變了。視圖就像一個(gè)窗口,透過它可以看到數(shù)據(jù)庫中自己感興趣的數(shù)據(jù)及其變化。103SQLServer處理視圖的過程:首先在數(shù)據(jù)庫中找到視圖的定義,然后將其對視圖的查詢轉(zhuǎn)換為對基表的查詢的等價(jià)查詢語句,并且執(zhí)行這個(gè)等價(jià)查詢語句。通過這種方法可以保持表的完整性。104視圖視圖倉庫號城市面積倉庫號職工號工資倉庫號城市職工號工資倉庫號面積基本表視圖105定義視圖的命令

視圖是根據(jù)對基本表的查詢定義的,其命令格式如下:CREATEVIEW<視圖名>AS<SELECT-查詢塊>從單個(gè)表派生出的視圖從多個(gè)表派生出的視圖視圖中的虛列106定義視圖的例:CREATEVIEWe_wASSELECT職工號,倉庫號FROM職工基于視圖進(jìn)行查詢:

SELECT*FROMe_w某個(gè)用戶對職工關(guān)系只需知道職工號和所工作的倉庫號107某個(gè)用戶對倉庫關(guān)系只需查詢北京倉庫的信息。這里的v_bj中只有北京倉庫的信息,因此城市屬性就不需要了CREATEVIEWv_bjASSELECT倉庫號,面積FROM倉庫WHERE城市='北京'

108定義視圖的例子:CREATEVIEWv_sampleASSELECT供應(yīng)商名FROM供應(yīng)商

WHERE地址='北京'AND供應(yīng)商號IN(SELECT供應(yīng)商號FROM訂購單WHERE職工號IN(SELECT職工號FROM職工WHERE倉庫號IN(SELECT倉庫號FROM倉庫

WHERE城市='北京')))基于視圖的查詢:SELECT*FROMv_sample給出有北京倉庫訂購單的北京供應(yīng)商的名稱。109定義視圖的例子:向用戶提供職工號、職工的工資和職工工作所在城市的信息。CREATEVIEWv_empASSELECT職工號,工資,城市FROM職工,倉庫WHERE職工.倉庫號=倉庫.倉庫號;對用戶就好象有一個(gè)表:110定義視圖的例子:定義一個(gè)視圖,它包含職工號、月工資和年工資三個(gè)屬性

溫馨提示

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

最新文檔

評論

0/150

提交評論