數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)例教程(達(dá)夢(mèng)DM8) 課件 4.3數(shù)據(jù)的查詢_第1頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)例教程(達(dá)夢(mèng)DM8) 課件 4.3數(shù)據(jù)的查詢_第2頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)例教程(達(dá)夢(mèng)DM8) 課件 4.3數(shù)據(jù)的查詢_第3頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)例教程(達(dá)夢(mèng)DM8) 課件 4.3數(shù)據(jù)的查詢_第4頁(yè)
數(shù)據(jù)庫(kù)基礎(chǔ)與實(shí)例教程(達(dá)夢(mèng)DM8) 課件 4.3數(shù)據(jù)的查詢_第5頁(yè)
已閱讀5頁(yè),還剩51頁(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)介

數(shù)據(jù)庫(kù)基礎(chǔ)(基于達(dá)夢(mèng)DM8)數(shù)據(jù)查詢及管理44.3數(shù)據(jù)的查詢02查詢子句01單表查詢03連接查詢04子查詢單表查詢4.3.14.3.1單表查詢1.簡(jiǎn)單查詢

簡(jiǎn)單查詢是數(shù)據(jù)查詢操作中最基本的查詢操作。其基本語(yǔ)法如下。SELECT[TOP{起始行,}結(jié)束行]<*|<列名列表>>FROM[<模式名>.]<表名><列名列表>::=[All|DISTINCT]<列名[AS別名]{,列名[AS別名]}>①<列名列表>:指定查詢結(jié)果集中要包含列的名稱,如果表中所有的列都包含在結(jié)果集中,可以用個(gè)“*”代替列名列表。4.3.1單表查詢1.簡(jiǎn)單查詢

簡(jiǎn)單查詢是數(shù)據(jù)查詢操作中最基本的查詢操作。其基本語(yǔ)法如下。SELECT[TOP{起始行,}結(jié)束行]<*|<列名列表>>FROM[<模式名>.]<表名>[All|DISTINCT]<列名[AS別名]{,列名[AS別名]}>②ALL:返回所有被選擇的行,包括所有重復(fù)的拷貝,缺省值為ALL;③DISTINCT:從被選擇出的具有重復(fù)行的每一組中僅返回一個(gè)這些行的拷貝;④AS別名:為列表達(dá)式提供不同的名稱,使之成為列的標(biāo)題,列別名不會(huì)影響實(shí)際的名稱,別名在該查詢中被引用;4.3.1單表查詢【案例4-24】使用SELECT語(yǔ)句查詢STAFF表中前6行數(shù)據(jù)信息。SELECTTOP6*FROMSCH_FACTORY.STAFF;4.3.1單表查詢【案例4-23】使用SELECT語(yǔ)句查詢STAFF表中所有列、所行數(shù)據(jù)信息SELECT*FROMSCH_FACTORY.STAFF;4.3.1單表查詢【案例4-25】使用SELECT語(yǔ)句查詢STAFF表中的籍貫信息,命名列的別名為“職工籍貫匯總”,并去除重復(fù)的籍貫信息。SELECTDISTINCT籍貫AS職工籍貫匯總FROMSCH_FACTORY.STAFF;4.3.1單表查詢2.條件查詢

條件查詢?cè)诤?jiǎn)單查詢的基礎(chǔ)上添加了<WHERE子句>?!癢HERE子句”內(nèi)容參見(jiàn)4.2.3。4.3.1單表查詢【案例4-26】使用SELECT語(yǔ)句查詢STAFF表中部門號(hào)為100001的職工的所有信息。SELECT*FROMSCH_FACTORY.STAFFWHERE部門號(hào)=100001;4.3.1單表查詢【案例4-27】使用SELECT語(yǔ)句查詢STAFF表中年齡27歲(含)至30歲(含)之間的職工的所有信息。SELECT*FROMSCH_FACTORY.STAFFWHERE年齡BETWEEN27AND30;4.3.1單表查詢【案例4-28】使用SELECT語(yǔ)句查詢STAFF表中姓“徐”的職工的所有信息。SELECT*FROMSCH_FACTORY.STAFFWHERE姓名LIKE'徐%';查詢子句4.3.24.3.2查詢子句

查詢語(yǔ)句中的子句類型有多種。如WHERE子句、FROM子句、WITH子句、ORDERBY子句、HAVING子句等。

在查詢中根據(jù)需求使用各類查詢子句可以對(duì)結(jié)果集進(jìn)行排序、分組等操作,從而達(dá)到查詢的目的。1.分組子句

分組子句基本語(yǔ)法如下。GROUPBY<列名>{,<列名>}

在實(shí)際應(yīng)用中,用戶經(jīng)常需要獲得按照分類進(jìn)行匯總的數(shù)據(jù)。如公司導(dǎo)出職工名單希望按照部門進(jìn)行分類匯總統(tǒng)計(jì)人數(shù)、工會(huì)活動(dòng)希望按照年齡分類匯總統(tǒng)計(jì)等。GROUPBY子句是查詢語(yǔ)句的可選項(xiàng)部分,用于定義分組表。

1.分組子句

在GROUPBY子句中的列名應(yīng)屬于FROM子句中表中的列名或列的別名;分組列的數(shù)據(jù)類型不能是多媒體數(shù)據(jù)類型;分組列不能為聚集函數(shù)表達(dá)式或者在SELECT子句中定義的別名;當(dāng)分組列值包含空值時(shí),則空值作為一個(gè)獨(dú)立組;當(dāng)分組列包含多個(gè)列名時(shí),則按照GROUPBY子句中列出現(xiàn)的順序進(jìn)行分組。

使用分組字句要注意以下問(wèn)題。

1.分組子句案例SELECT籍貫

FROMSCH_FACTORY.STAFFGROUPBY籍貫;

【案例4-35】使用GROUPBY子句,對(duì)職工表STAFF的籍貫進(jìn)行分類匯總。

此處很明顯“籍貫”包含在結(jié)果集中,故可以“籍貫”列對(duì)結(jié)果集進(jìn)行分組。1.分組子句案例SELECT年齡,COUNT(*)FROMSCH_FACTORY.STAFFGROUPBY年齡;

【案例4-36】使用GROUPBY子句,對(duì)職工表STAFF按照年齡進(jìn)行人數(shù)統(tǒng)計(jì)。

此處以“年齡”列進(jìn)行分類,使用count(*)對(duì)分類進(jìn)行計(jì)數(shù)。1.分組子句案例SELECT部門號(hào),籍貫,COUNT(*)FROMSCH_FACTORY.STAFFGROUPBY部門號(hào),籍貫;

【案例4-37】使用GROUPBY子句,對(duì)職工表STAFF按照部門及籍貫進(jìn)行人數(shù)統(tǒng)計(jì)。通過(guò)該統(tǒng)計(jì)能夠統(tǒng)計(jì)出每個(gè)部門各籍貫所在地的人數(shù)。

此處以“部門號(hào)”和“籍貫”列進(jìn)行分類,即相同“部門號(hào)”和“籍貫”的員工會(huì)被分為一類;再使用count(*)對(duì)分類進(jìn)行計(jì)數(shù)。2.HAVING子句

HAVING子句是SELECT語(yǔ)句的可選項(xiàng)部分,定義了一個(gè)成組表,其中只含有搜索條件表達(dá)式為真(TRUE)的那些組。HAVING子句與組的關(guān)系正如WHERE子句與表中行的關(guān)系。WHERE子句用于選擇表中滿足條件的行,而HAVING子句用于選擇滿足條件的組。

HAVING子句且通常跟隨一個(gè)GROUPBY子句。HAVING子句語(yǔ)法如下。HAVING<表達(dá)式>2.HAVING子句案例SELECT年齡,COUNT(*)FROMSCH_FACTORY.STAFFGROUPBY年齡HAVINGCOUNT(*)<2;

【案例4-38】使用HAVING子句統(tǒng)計(jì)出STAFF表中同一年齡的職工數(shù)量小于2的年齡和數(shù)量。

此處選擇滿足統(tǒng)計(jì)條件“count(*)<2”的組的結(jié)果集。3.排序子句ORDERBY<<排序項(xiàng)>{,<排序項(xiàng)>}>

排序子句可以選擇性地出現(xiàn)在查詢語(yǔ)句中。排序子句在最終結(jié)果上進(jìn)行排序,一般放在查詢語(yǔ)句的最后部。排序子句規(guī)定了當(dāng)行由查詢返回時(shí)應(yīng)具有的順序,其語(yǔ)法如下。

3.排序子句ORDERBY<<排序項(xiàng)>{,<排序項(xiàng)>}>

語(yǔ)法中的相關(guān)參數(shù)如下。①<排序項(xiàng)>:<<列名>|<第幾列>>[ASC|DESC]??梢灾付ǘ鄠€(gè)排序項(xiàng),按照順序決定排序的層次。②<列名>:可以是任何在查詢清單中的列的名稱,但不支持多媒體數(shù)據(jù)類型(如IMAGE、TEXT、BLOB和CLOB)。③<第幾列>:第幾列為數(shù)字,按照結(jié)果集中的第幾列進(jìn)行排序。④ASC:結(jié)果按照升序排序,為默認(rèn)排序方式,可省略。⑤DESC:結(jié)果按照降序排序。

3.排序子句案例SELECT*FROMSCH_FACTORY.STAFFORDERBY年齡;

【案例4-39】使用ORDERBY子句,查詢STAFF表中所有職工的信息,并按年齡進(jìn)行升序排序。

此處沒(méi)有顯式地定義升序“ASC”,因?yàn)槟J(rèn)排序方式為升序排序。3.排序子句案例SELECT職工號(hào),姓名,籍貫FROM

SCH_FACTORY.STAFFORDERBY3;

【案例4-40】使用ORDERBY子句,查詢STAFF表中職工號(hào)、姓名、籍貫,并按第3列(此處為“籍貫”)進(jìn)行升序排序。此處ORDERBY3是按照“職工號(hào),姓名,籍貫”三列中的第三列,即“籍貫”進(jìn)行排序。3.排序子句案例SELECT*FROMSCH_FACTORY.STAFFORDERBY部門號(hào),年齡DESC;

【案例4-41】使用ORDERBY子句,查詢STAFF表中所有職工的信息,并按部門號(hào)升序、年齡進(jìn)行降序排序。此處先按照“部門號(hào)”升序(默認(rèn)升序)排序,然后按照“年齡”降序排序。連接查詢4.3.34.3.3連接查詢

在開(kāi)始連接查詢的操作之前可以進(jìn)行回顧連接的關(guān)系代數(shù)運(yùn)算的內(nèi)容。

在具體的實(shí)現(xiàn)中,連接查詢就是把兩個(gè)或者多個(gè)表的行通過(guò)不同的連接方式,按照給定的條件連接生成新的結(jié)果集,從中查詢數(shù)據(jù)。

1.交叉連接查詢

交叉連接查詢的基本語(yǔ)法如下(當(dāng)連接的兩個(gè)或者多個(gè)表中用重復(fù)的列名,需要通過(guò)添加表名為“表名.列名”來(lái)進(jìn)行區(qū)分)。SELECT<*|[<表名.|別名.>]列名{,[<表名.|別名.>]列名}>FROM表名[別名]CROSSJOIN表名[別名]{,CROSSJOIN表名[別名]}[WHERE子句]

交叉連接查詢又稱笛卡爾積查詢。在實(shí)際數(shù)據(jù)庫(kù)管理工作中一般不會(huì)使用交叉連接查詢,因?qū)τ诤瘮?shù)較多的表進(jìn)行交叉連接會(huì)產(chǎn)生很大的結(jié)果集,造成數(shù)據(jù)庫(kù)資源極大占用。1.交叉連接查詢案例SELECT職工號(hào),STAFF.部門號(hào),DEPT.部門名FROMSCH_FACTORY.STAFFCROSSJOINSCH_FACTORY.DEPT;

【案例4-42】交叉連接查詢職工表和部門表,選取職工號(hào)、職工表的部門號(hào)、部門名的信息。

此處將STAFF表與DEPT表進(jìn)行交叉連接,然后選擇職工號(hào)、STAFF表中的部門號(hào)、DEPT表中的部門名。2.自然連接查詢

把兩張連接表中的同名列作為連接條件,進(jìn)行等值連接,這樣的連接稱為自然連接。自然連接的連接表中必須存在同名列,如果連接表中沒(méi)有同名列,或者同名列類型不匹配則報(bào)錯(cuò)。如果有多個(gè)同名列則會(huì)產(chǎn)生多個(gè)等值連接條件。

自然連接的基本語(yǔ)法如下。SELECT<*|[<表名.|別名.>]列名{,[<表名.|別名.>]列名}>FROM表名[別名]NATURALJOIN表名[別名]{,NATURALJOIN表名[別名]}[WHERE子句]2.自然連接案例SELECT*FROMSCH_FACTORY.MANAGERNATURALJOINSCH_FACTORY.STAFFNATURALJOINSCH_FACTORY.DEPT;

【案例4-43】查詢“經(jīng)理表”自然連接“職工表”再自然連接“部門表”的所有數(shù)據(jù)的結(jié)果。

此處“經(jīng)理表”與“職工表”自然連接,“職工表”與“部門表”自然連接。

3.內(nèi)連接查詢

根據(jù)連接條件對(duì)表內(nèi)一個(gè)或多個(gè)共享列值進(jìn)行比較,結(jié)果集僅包含滿足全部連接條件的記錄,這樣的連接稱為內(nèi)連接。

內(nèi)連接的基本語(yǔ)法為。SELECT<*|[<表名.|別名.>]列名{,[<表名.|別名.>]列名}>FROM表名[別名][INNER]JOIN表名[別名]ON<連接條件>{,[INNER]JOIN表名[別名]}[WHERE子句]3.內(nèi)連接查詢

內(nèi)連接分等值連接和非等值連接。等值連接使用“=”運(yùn)算符設(shè)置<連接條件>的連接;非等值連接則使用“<、>、<=、>=、<>”等運(yùn)算符設(shè)置<連接條件>的連接。在實(shí)際運(yùn)用中,常使用等值連接。

內(nèi)連接的基本語(yǔ)法為。SELECT<*|[<表名.|別名.>]列名{,[<表名.|別名.>]列名}>FROM表名[別名][INNER]JOIN表名[別名]ON<連接條件>{,[INNER]JOIN表名[別名]}[WHERE子句]3.內(nèi)連接查詢SELECT職工號(hào),姓名,D.部門號(hào),部門名FROMSCH_FACTORY.STAFFSINNERJOINSCH_FACTORY.DEPTDONS.部門號(hào)=D.部門號(hào);

【案例4-44】通過(guò)職工表中的部門號(hào)等值連接部門表中的部門號(hào),查詢“職工表”內(nèi)連接“部門表”的職工號(hào)、姓名、部門號(hào)、部門名列的結(jié)果集。

此處通過(guò)STAFF表的“部門號(hào)”和DEPT表的”部門號(hào)”進(jìn)行等值連接。4.外連接查詢

外連接對(duì)結(jié)果集進(jìn)行了擴(kuò)展,會(huì)返回一張表的所有記錄,對(duì)于另一張表無(wú)法匹配的字段用NULL填充返回。DM數(shù)據(jù)庫(kù)支持三種方式的外連接:左外連接、右外連接、全外連接。外連接中位于左側(cè)的表,稱為左表;位于右側(cè)的表,稱為右表。

外連接的基本語(yǔ)法如下。SELECT<*|[<表名.|別名.>]列名{,[<表名.|別名.>]列名}>FROM表名[別名]<LEFT|RIGHT|FULL>[OUTER]JOIN表名[別名]{,<LEFT|RIGHT|FULL>[OUTER]JOIN表名[別名]}[WHERE子句]4.外連接查詢SELECTS.職工號(hào),S.姓名,P.項(xiàng)目號(hào),P.項(xiàng)目名,P.項(xiàng)目開(kāi)始時(shí)間,SP.加入時(shí)間FROMSCH_FACTORY.STAFFSLEFTJOINSCH_FACTORY.STAFF_PROJECTSPONS.職工號(hào)=SP.職工號(hào)LEFTJOINSCH_FACTORY.PROJECTPONSP.項(xiàng)目號(hào)=P.項(xiàng)目號(hào);

【案例4-45】分別用左外連接、右外連接、全外連接來(lái)連接職工表STAFF、職工參與項(xiàng)目表STAFF_PROJECT和項(xiàng)目表PROJECT。結(jié)果集顯示職工號(hào)、姓名、項(xiàng)目號(hào)、項(xiàng)目名、項(xiàng)目開(kāi)始時(shí)間、(職工)加入時(shí)間。1)左外連接4.外連接查詢SELECTS.職工號(hào),S.姓名,P.項(xiàng)目號(hào),P.項(xiàng)目名,P.項(xiàng)目開(kāi)始時(shí)間,SP.加入時(shí)間FROMSCH_FACTORY.STAFFSRIGHTJOINSCH_FACTORY.STAFF_PROJECTSPONS.職工號(hào)=SP.職工號(hào)RIGHTJOINSCH_FACTORY.PROJECTPONSP.項(xiàng)目號(hào)=P.項(xiàng)目號(hào);

【案例4-45】分別用左外連接、右外連接、全外連接來(lái)連接職工表STAFF、職工參與項(xiàng)目表STAFF_PROJECT和項(xiàng)目表PROJECT。結(jié)果集顯示職工號(hào)、姓名、項(xiàng)目號(hào)、項(xiàng)目名、項(xiàng)目開(kāi)始時(shí)間、(職工)加入時(shí)間。2)右外連接4.外連接查詢SELECTS.職工號(hào),S.姓名,P.項(xiàng)目號(hào),P.項(xiàng)目名,P.項(xiàng)目開(kāi)始時(shí)間,SP.加入時(shí)間FROMSCH_FACTORY.STAFFSFULLJOINSCH_FACTORY.STAFF_PROJECTSPONS.職工號(hào)=SP.職工號(hào)FULLJOINSCH_FACTORY.PROJECTPONSP.項(xiàng)目號(hào)=P.項(xiàng)目號(hào);

【案例4-45】分別用左外連接、右外連接、全外連接來(lái)連接職工表STAFF、職工參與項(xiàng)目表STAFF_PROJECT和項(xiàng)目表PROJECT。結(jié)果集顯示職工號(hào)、姓名、項(xiàng)目號(hào)、項(xiàng)目名、項(xiàng)目開(kāi)始時(shí)間、(職工)加入時(shí)間。3)全外連接子查詢4.3.44.3.4子查詢

子查詢指的是一個(gè)查詢語(yǔ)句中包含另一個(gè)查詢語(yǔ)句,外層的查詢語(yǔ)句就稱為外部查詢,內(nèi)層的查詢語(yǔ)句稱為內(nèi)部查詢或子查詢。

在DM_SQL中,一個(gè)SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊。如果在一個(gè)查詢塊中嵌套一個(gè)或多個(gè)查詢塊,這種查詢稱為子查詢。4.3.4子查詢

子查詢會(huì)返回一個(gè)值(標(biāo)量子查詢,即只返回一行一列)或一個(gè)表(表子查詢,即返回多行多列)。它通常采用“(查詢語(yǔ)句)”的形式嵌套在表達(dá)式中。

通常子查詢出現(xiàn)在外部查詢的WHERE子句中,并與比較運(yùn)算符、列表運(yùn)算符IN、存在運(yùn)算符EXISTS等一起構(gòu)成查詢條件,完成查詢操作。4.3.4子查詢

<查詢表達(dá)式>一般就是SELECT查詢語(yǔ)句,但需要注意以下幾點(diǎn)問(wèn)題。在子查詢中不得有ORDERBY子句;子查詢不能包含在聚集函數(shù)中;在子查詢中允許嵌套子查詢。

子查詢語(yǔ)法如下。<子查詢>::=(<查詢表達(dá)式>)1.比較運(yùn)算符子查詢

標(biāo)量子查詢是一個(gè)普通SELECT查詢,它只應(yīng)該返回一行一列記錄。標(biāo)量子查詢可以配合比較運(yùn)算符與外部查詢的列進(jìn)行比較。比較結(jié)果為真的行添加入結(jié)果集,否則不加入結(jié)果集。1.比較運(yùn)算符子查詢案例SELECTAVG(年齡)FROMSCH_FACTORY.STAFF;

【案例4-46】使用子查詢找出STAFF表中小于平均年齡職工的所有信息。

此處首先考慮計(jì)算出STAFF表中所有職工的評(píng)價(jià)年齡。1.比較運(yùn)算符子查詢案例SELECT*FROMSCH_FACTORY.STAFFWHERE年齡<(SELECTAVG(年齡)FROMSCH_FACTORY.STAFF);

【案例4-46】使用子查詢找出STAFF表中小于平均年齡職工的所有信息。

再將平均年齡的結(jié)果作為子查詢放入上一層查詢中,以年齡小于平均年齡作為條件查詢所有滿足條件的職工信息。2.關(guān)鍵字IN子查詢

如果子查詢返回的是單列多個(gè)值的情況,可以將結(jié)果集作為一個(gè)集合,使用IN運(yùn)算符來(lái)對(duì)外部查詢的列值進(jìn)行判斷。比較結(jié)果為真的行添加入結(jié)果集,否則不加入結(jié)果集。可以使用NOTIN獲得與IN相反的結(jié)果集。

2.關(guān)鍵字IN子查詢案例SELECT部門號(hào)FROMSCH_FACTORY.DEPTWHERELEN(部門名)>3;

【案例4-47】使用子查詢查找出部門名大于3個(gè)字符的職工的所有信息。

首先查出部門大于3個(gè)字符的部門號(hào)。

此處使用內(nèi)置函數(shù)LEN(char),可以得到給定字符串表達(dá)式的字符(而不是字節(jié))個(gè)數(shù),其中不包含尾隨空格。2.關(guān)鍵字IN子查詢案例SELECT*FROMSCH_FACTORY.STAFFWHERE部門號(hào)IN(SELECT部門號(hào)FROMSCH_FACTORY.DEPTWHERELEN(部門名)>3);

【案例4-47】使用子查詢查找出部門名大于3個(gè)字符的職工的所有信息。

字符數(shù)大于3的部門名所篩選的結(jié)果集是一個(gè)1列2行的結(jié)果集。將該語(yǔ)句作為子句,結(jié)合IN運(yùn)算符,放入一個(gè)包含判斷部門號(hào)WHERE子句的職工表外部查詢中。3.EXISTS關(guān)鍵字子查詢

EXISTS判斷是對(duì)子查詢返回結(jié)果是否為非空集合的判別操作。若表子查詢返

溫馨提示

  • 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)論