數(shù)據(jù)庫基礎(chǔ)與實例教程(達(dá)夢DM8) 課件 4.3數(shù)據(jù)的查詢_第1頁
數(shù)據(jù)庫基礎(chǔ)與實例教程(達(dá)夢DM8) 課件 4.3數(shù)據(jù)的查詢_第2頁
數(shù)據(jù)庫基礎(chǔ)與實例教程(達(dá)夢DM8) 課件 4.3數(shù)據(jù)的查詢_第3頁
數(shù)據(jù)庫基礎(chǔ)與實例教程(達(dá)夢DM8) 課件 4.3數(shù)據(jù)的查詢_第4頁
數(shù)據(jù)庫基礎(chǔ)與實例教程(達(dá)夢DM8) 課件 4.3數(shù)據(jù)的查詢_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

1.分組子句

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

使用分組字句要注意以下問題。

1.分組子句案例SELECT籍貫

FROMSCH_FACTORY.STAFFGROUPBY籍貫;

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

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

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

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

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

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

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

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

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

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

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

3.排序子句ORDERBY<<排序項>{,<排序項>}>

語法中的相關(guān)參數(shù)如下。①<排序項>:<<列名>|<第幾列>>[ASC|DESC]。可以指定多個排序項,按照順序決定排序的層次。②<列名>:可以是任何在查詢清單中的列的名稱,但不支持多媒體數(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)行升序排序。

此處沒有顯式地定義升序“ASC”,因為默認(rèn)排序方式為升序排序。3.排序子句案例SELECT職工號,姓名,籍貫FROM

SCH_FACTORY.STAFFORDERBY3;

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

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

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

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

1.交叉連接查詢

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

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

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

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

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

自然連接的基本語法如下。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ù)連接條件對表內(nèi)一個或多個共享列值進(jìn)行比較,結(jié)果集僅包含滿足全部連接條件的記錄,這樣的連接稱為內(nèi)連接。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

首先查出部門大于3個字符的部門號。

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

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

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

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

溫馨提示

  • 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

提交評論