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