摘 要:關(guān)系數(shù)據(jù)庫語言的國際標(biāo)準(zhǔn)在1987年被確定,到目前為止,版本由SQL—89標(biāo)準(zhǔn)、SQL—92標(biāo)準(zhǔn)升級到SQL—99標(biāo)準(zhǔn),這些版本全稱為SQL3。SQL現(xiàn)在已成為數(shù)據(jù)庫領(lǐng)域中使用最為廣泛的一個主流語言。它主要由數(shù)據(jù)查詢(Data Query)、數(shù)據(jù)操縱(Data Manipulation)、數(shù)據(jù)定義(Data Definition)和數(shù)據(jù)控制(Data Control)四個功能組成。其中數(shù)據(jù)查詢是SQL的核心功能,這其中多表查詢也是最為復(fù)雜的查詢,本文正是立足于SQL的多表查詢在實(shí)際應(yīng)用中的應(yīng)用研究。
關(guān)鍵詞:關(guān)系數(shù)據(jù)庫;關(guān)系模型;數(shù)據(jù)查詢;多表查詢
中圖分類號:TP311.52
關(guān)系數(shù)據(jù)庫是基于關(guān)系模型作為數(shù)據(jù)的組織方式的,它借助于集合代數(shù)等數(shù)學(xué)概念和方法來處理數(shù)據(jù)庫中的數(shù)據(jù)?,F(xiàn)實(shí)世界中的各種實(shí)體以及實(shí)體之間的各種聯(lián)系均用關(guān)系模型來表示。它是由埃德加·科德于1970年首先提出的,并配合“科德十二定律”?,F(xiàn)如今雖然對此模型有一些批評意見,但它還是數(shù)據(jù)存儲的傳統(tǒng)標(biāo)準(zhǔn)。標(biāo)準(zhǔn)數(shù)據(jù)查詢語言SQL就是一種基于關(guān)系數(shù)據(jù)庫的語言,這種語言執(zhí)行對關(guān)系數(shù)據(jù)庫中數(shù)據(jù)的檢索和操作。
1 數(shù)據(jù)查詢
所謂數(shù)據(jù)查詢(數(shù)據(jù)檢索)就是從關(guān)系數(shù)據(jù)庫的數(shù)據(jù)表中找出用戶所需的數(shù)據(jù),只要表(關(guān)系)中存在,則可以通過各種各樣的方式將它找出來,SQL的查詢功能就是實(shí)現(xiàn)這一功能的。本文主要研究討論多表查詢。
在實(shí)際應(yīng)用中,由于一個關(guān)系數(shù)據(jù)庫根據(jù)需求分析后得到很多表,而且表與表之間互相存在一對一,一對多或是多對多的表間關(guān)系,這些表中的數(shù)據(jù)往往互相有較為緊密的復(fù)雜聯(lián)系,在這種情況下,要查找用戶所需的數(shù)據(jù)時就得用多表查詢才能實(shí)現(xiàn)用戶的查詢目的和要求,比如在倉庫數(shù)據(jù)庫中分別有四張表,倉庫表,職工表,訂單表和供應(yīng)商表,這四個表兩兩存在一對多的表間關(guān)系,一個倉庫可以有多名職工,一名職工只能屬于一個倉庫;一名職工可以經(jīng)手多筆訂單,一筆訂單只能由一名職工經(jīng)手;一家供應(yīng)商可以完成多表訂單,一筆訂單只能由一家供應(yīng)商完成,在實(shí)際應(yīng)用中,如果要根據(jù)倉庫表中的數(shù)據(jù)作為條件查詢檢索供應(yīng)商表中的數(shù)據(jù)時,必須得用基于多表的連接查詢才能完成。
1.1 簡單連接查詢。簡單連接查詢的SQL語句格式可總結(jié)如下。Select <查找數(shù)據(jù)所在的字段名,字段間用逗號隔開,如果是一個表的所有字段,則用*號表示,但必須通過“表名.*”的方式做限定是哪個表的所有字段,如果不做限定,直接一個*,則表示要查找的是from后面跟的所有表的所有字段> from <至少兩張或兩張以上的表名,這些表之間往往存在著一對一或是一對多,或是多對多的表間關(guān)系的>
如果from后面跟兩張表,則是兩個表的簡單連接查詢,有一個連接條件,如果from后面跟三張表,則有兩個連接條件,如果from 后面跟四張表,則有三個連接條件,依此類推。而且查找數(shù)據(jù)的條件和連接條件必須用and連接,連接條件之間也用and連接。
示例:在倉庫管理數(shù)據(jù)庫的四張表中檢索出回民所在倉庫的倉庫信息。對應(yīng)的SQL語句為:select 倉庫表.* from 倉庫表,職工表 where 民族=’回’ and 倉庫表.倉庫號=職工表.倉庫號。
從這個簡單連接查詢實(shí)例來看。在基于多表的簡單連接查詢中,第一先確定最終要查詢的數(shù)據(jù)所在的字段來自于幾張表的幾個字段,查找數(shù)據(jù)的條件涉及到幾個表的幾個字段,其次根據(jù)表間關(guān)系確定查詢涉及到幾張表,然后確定連接條件。且where是必選項(xiàng)。
1.2 嵌套查詢。嵌套查詢的意思是,一個查詢語句(select-from-where)塊可以嵌套在另外一個查詢塊的where子句中,稱為嵌套查詢。其中外層查詢也稱為父查詢或主查詢。內(nèi)層查詢也稱子查詢或從查詢。嵌套查詢的工作方式是:先處理內(nèi)查詢,由內(nèi)向外處理,外層查詢需要內(nèi)層查詢的結(jié)果來支持,但內(nèi)層查詢不需要外層查詢的支持。示例:Select城市from倉庫表where倉庫號in(select倉庫號from職工表where工資=4532)。
在這類嵌套查詢中,帶有IN或ONT IN謂詞的嵌套查詢在實(shí)際應(yīng)用中用的最多,這里的IN相當(dāng)于集合運(yùn)算符∈。本文在闡述嵌套查詢中就以帶有IN或NOT IN謂詞的嵌套查詢進(jìn)行闡述,帶有比較運(yùn)算符的子查詢、帶有ANY或ALL謂詞的子查詢、帶有EXISTS謂詞的子查詢就再不做詳細(xì)闡述了。
1.3 超連接查詢。超連接查詢分為內(nèi)連接和外連接,外連接又分為左外連接,右外連接和全外連接。如果表中不匹配的數(shù)據(jù)不需要出現(xiàn)在查詢結(jié)果中,則用內(nèi)連接。如果在查詢結(jié)果中兩個表中不匹配的數(shù)據(jù)都要出現(xiàn)在查詢結(jié)果中的話,則用全外連接,其對應(yīng)表中對應(yīng)字段用NULL表示。其SQL語句格式為(以基于兩張表的超連接為主):Select<跟簡單連接查詢的要求一樣>from<主表表名>
2 三種多表查詢的特點(diǎn)及規(guī)律
在以上研究的三種多表查詢中,基于多表的簡單連接查詢中,要查詢的數(shù)據(jù)所在的字段可以是來自于一張表的字段,也可以是來自于多張表的字段,而查找數(shù)據(jù)的條件可以來自于一張表的字段,也可以來自于多張表的字段,即使沒有查找數(shù)據(jù)的條件,但連接條件必須得有,在其SQL語句格式中,where是必選項(xiàng)。
在嵌套查詢中,通過實(shí)際應(yīng)用可以得出,嵌套查詢不管由幾個查詢語句塊組成,它們都是基于單表的簡單查詢構(gòu)成的,而且最內(nèi)層的查詢結(jié)果就是其外層查詢的條件,沒有內(nèi)層查詢的結(jié)果,就不可能得到外層查詢的結(jié)果,執(zhí)行順序都是由內(nèi)往外執(zhí)行的。
在超連接查詢中,這種查詢往往是在有關(guān)系的表中出現(xiàn)了所謂的不匹配數(shù)據(jù)時,根據(jù)用戶的不同需要而使用的查詢,到底選用哪一種主要取決于查詢結(jié)果中要不要出現(xiàn)不匹配的數(shù)據(jù)和出現(xiàn)哪個表中的不匹配數(shù)據(jù)而定。
如果要查找的數(shù)據(jù)來自于多張表的多個字段,則可用連接查詢和內(nèi)連接查詢,查詢結(jié)果相同。如果要查找的數(shù)據(jù)來自于一張表的字段,而條件發(fā)生在不同的表中,則可用連接查詢,嵌套查詢和內(nèi)連接查詢,查詢結(jié)果相同。
3 結(jié)束語
SQL的查詢功能,尤其是多表查詢有很大的靈活性,在實(shí)際應(yīng)用中要視具體情況來決定用哪一類,這需要在實(shí)踐中摸索總結(jié),只有這樣才能對SQL語句的查詢功能運(yùn)用的得心應(yīng)手。
參考文獻(xiàn):
[1]薩師煊.王珊.數(shù)據(jù)庫系統(tǒng)概論(第三版)[M].北京:高等教育出版社,2000.
[2]賀桂英.數(shù)據(jù)庫原理及應(yīng)用—SQL Server 2008[M].北京:中國人民大學(xué)出版社,2013.
作者簡介:王勇(1978.02-),男,助教,研究方向:數(shù)據(jù)庫。
作者單位:蘭州外語職業(yè)學(xué)院信息技術(shù)系,蘭州 730101