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