劉薇
【摘要】:隨著大數(shù)據(jù)時代的來臨,人們對于計算機技術的依賴程度越來越高,特別是建立在數(shù)據(jù)庫基礎上的各種查詢技術為人們的工作和生活帶來了方便和快捷。在查詢技術中,多表連接查詢的使用非常頻繁,本文就常見的各種多表連接查詢的特點進行分析總結、討論優(yōu)化策略。
【關鍵字】:計算機技術 數(shù)據(jù)庫 多表連接查詢
1引言
計算機數(shù)據(jù)庫技術是一門實用性非常強的技術,隨著我國信息化建設工程的逐漸開展,在多個領域中都有了較為廣泛的應用,并逐漸的發(fā)揮出在信息化建設中的主導作用。在數(shù)據(jù)庫技術中查詢技術是最基本、最常用也是最復雜的技術之一,而多表連接查詢也是所有數(shù)據(jù)庫操作中最繁瑣所占比重最大的。所以弄清楚多表連接查詢的種類,以及在什么情況下使用哪種查詢策略是需要研究的重要問題。
2 多表連接查詢分類
在實際工作中,所查詢的內容往往涉及多張表,連接查詢是關系數(shù)據(jù)庫中最主要的查詢方式,在SQL Server中連接查詢類型分為交叉連接、內連接、外連接和自連接。
2.1交叉連接
交叉連接也稱非限制連接,它是將兩個表不加任何約束地組合起來。也就是將第一個表的所有行分別與第二個表的每一行形成一條新的記錄,交叉連接在實際應用中一般是沒有意義的,但在數(shù)據(jù)庫的數(shù)學模型上有重要作用。
2.2內連接
內連接也稱自然連接,它是組合兩個表的常用方法。連接條件通常采用“主鍵=外鍵”的形式,也就是說在兩個表中匹配的記錄才能在結果集中出現(xiàn)。
例如:有學生(學號、姓名、性別、專業(yè)),成績(學號、課程號、分數(shù))兩個表,要查詢選修了‘A001’課程的學生的姓名和專業(yè)。查詢語句如下:
select 學生.學號,姓名,專業(yè)
from 學生 join 成績 on 學生.學號=成績.學號
where 課程號=‘A001’
2.3外連接
(1)在外連接中可以只限制一個表,而另一個表中的所有行都出現(xiàn)在結果集中。外連接分為左外連接、右外連接和全外連接。分別對左表、右表和左右兩邊的表不加限制。
例如:如果我們想查看所有的學生選修A001課程的成績情況,就可以使用左外連接。查詢語句如下:
select 姓名,專業(yè),課程號,分數(shù)
from 學生 left join 成績 on 學生.學號=成績.學號
where課程號=‘A001’
以上問題也可以使用右外連接。查詢語句如下:
select 姓名,專業(yè),課程號,分數(shù)
from成績 right join 學生on 成績.學號=學生.學號
where課程號=‘A001’
這種情況下會以學生表為主,返回所有學生的信息,同時選修了A001課程的顯示分數(shù),沒有選修A001課程的顯示null
(2)全外連接結果集中除返回左表和右表內部連接的記錄以外,還在查詢結果中返回兩個表中不符合條件的記錄,并在左表或右表的相應列中填上null,bit類型以0值填充。
例如:有學生會(學號,姓名),人員分工(學號,職務)兩個表,如果想查看學生會中的所有學生,哪些學生分配了職務,哪些學生還沒有職務;學生會共設置了多少職務種類,哪些職務已經有人擔任,哪些職務還有空缺,這時候就可以使用全外連接。查詢語句如下:
select 學生會.學號,姓名,職務
from 學生會 full join 人員分工 on 學生會.學號=人員分工.學號
這種情況下會返回學生會中所有學生學號、姓名,同時也會返回人員分工表里面的所有職務,沒有職務的學生,職務填充null,沒有分配出去的職務,姓名填充null。
3 查詢優(yōu)化策略
連接的表越多,條件表達式越繁瑣,查詢的復雜度就越高,所消耗時間就越長。因此在進行查詢時我們應當在能返回正確查詢結果的前提下,盡可能的降低查詢時間,提高查詢效率。
3.1連表宜少不宜多
例如:有學生(學號、姓名、性別、專業(yè)),成績(學號、課程號、分數(shù)),課程(課程號,課程名,學時數(shù))三個表。查詢選修‘A001’課程的學生學號、姓名和課程號??梢杂靡韵聝煞N方法實現(xiàn):
方法一
select 學生.學號,姓名,課程.課程號
from 學生 join 成績 on 學生.學號=成績.學號
join 課程 on 成績.課程號=課程.課程號
where 課程號=‘A001’
方法二
select 學生.學號,姓名,成績.課程號
from 學生 join 成績 on 學生.學號=成績.學號
where 課程號=‘A001’
第一組語句連接三個表查詢,第二組語句連接兩個表查詢。前者查詢效率低,后者查詢效率高。
3.2條件表達式宜簡不宜繁
例如:要查詢張玲、李萍、王曉宇三個學生的學號、姓名、出生時間、專業(yè)。可以用以下兩種方法實現(xiàn):
方法一
select 學號,姓名,出生時間,專業(yè)
from 學生
where 姓名=‘張玲’ or 姓名=‘李萍’or 姓名=‘王曉宇’
方法二
select 學號,姓名,出生時間,專業(yè)
from 學生
where 姓名in(‘張玲’,‘李萍’,‘王曉宇’)
第一組語句的where子句后有三個條件表達式,第二組語句的where子句后有一個條件表達式。前者查詢效率低,后者查詢效率高。
4 結束語
在數(shù)據(jù)庫開發(fā)和維護過程中多表查詢的優(yōu)化設計對于提高大型數(shù)據(jù)庫系統(tǒng)的性能具有現(xiàn)實意義。以上介紹的幾種連接查詢的適用場景,以及在優(yōu)化查詢時應當遵循的原則,僅供大家參考交流。
【參考文獻】::
【1】邢文端; 簡談SQL SERVER 2000種的連接查詢;讀與寫;2009年
【2】王珊 孟小峰;數(shù)據(jù)庫系統(tǒng)導論;機械工業(yè)出版社;2010年
【3】馮玉才 陳紅 文繼榮;數(shù)據(jù)庫和數(shù)據(jù)庫管理系統(tǒng);電子工業(yè)出版社;1995年