陳誠 向沖
摘要:本文通過對《SQL Server數(shù)據庫》課程中的連接查詢和嵌套查詢從定義、分類、使用等方面對比分析得出:兩者有時可以互換,各有其優(yōu)缺點。在實際查詢過程中,可根據實際需求以及使用習慣,選取合適的查詢方式。
關鍵詞:SQL Server數(shù)據庫;連接查詢;嵌套查詢
中圖分類號:TP3文獻標志碼:A文章編號:2095-9214(2015)06-0147-02
1.引言
SQL語言是目前數(shù)據庫領域中非常實用、流行的主流語言。SQL是Structure Query Language的英文縮寫,意思是結構化查詢語言。包括:數(shù)據查詢(SQL)、數(shù)據操縱(DML)、數(shù)據定義(DDL)和數(shù)據控制(DCL)等功能于一體。數(shù)據查詢是數(shù)據庫的核心內容,也是我們最常用的操作。數(shù)據查詢是通過SQL語句來實現(xiàn)的,利用SQL語句可以從數(shù)據庫中查詢出我們所需要的各種數(shù)據。[1]
數(shù)據查詢分為單表查詢和多表查詢。單表查詢是對一個表的查詢,因為比較簡單,這里不再說明。多表查詢是對多個表,將分布在不同表中的數(shù)據根據需要進行查詢。多表查詢可以通過連接查詢和嵌套查詢來實現(xiàn)。[2]下面以學生管理數(shù)據庫為例,介紹以上兩種查詢。其中學生表和成績表的關系模式如下:學生(學號,姓名,性別,出生日期,籍貫,班級代碼);成績(學號,課程號,成績)。
1.1什么是連接查詢
1.1.1定義。根據各個表之間的邏輯關系從兩個或多個表中查詢數(shù)據。如:查詢學生的學號、姓名、課程名稱和成績,涉及到的數(shù)據表有學生、課程和成績。
1.2連接查詢的分類
1.2.1內連接。內連接(inner join)是一種最常用的連接類型。內連接是一種任意條件的查詢,如果兩個表的相關字段滿足連接條件,就從這兩個表中提取數(shù)據并組合成新的記錄,也就是在內連接查詢中,只有滿足條件的元組才能出現(xiàn)在結果關系中。[3]
例如:要查詢每個已經選課的學生的情況,查詢語句為:
SELECT * FROM學生INNER JOIN成績ON學生.學號=成績.學號
連接查詢根據比較方式分為:
1.2.1.1等值連接:使用等號(=)運算符比較被連接的列的列值,稱為等值連接。
1.2.1.2不等連接:使用除等于運算符以外的其它比較運算符比較被連接的列的列值,稱為不等連接。包括>、>=、<=、<、!>、!<和<>等運算符。
1.2.1.3自然連接:使用等于(=)運算符比較被連接列的列值,但刪除連接表中的重復列,稱為自然連接。它屬于等值連接的一種特殊情況。
1.2.2外連接。外連接是指將不滿足限制條件的表中的數(shù)據也顯示在最終結果中。
根據限制表的不同,外連接分為三種情況:
1.2.2.1左外連接(LEFTOUTER JOIN)
左外連接是限制連接條件右邊的表中的數(shù)據必須滿足連接條件,而不關左邊的表中的數(shù)據是否滿足連接條件,均輸出左邊表中的內容。
例如:要查詢所有學生的選課情況,包括已經選課的和還沒有選課的學生,查詢語句為:
SELECT學生.學號,姓名,班級代碼,課程號,成績
FROM學生LEFT OUTER JOIN成績ON學生.學號=成績.學號
左外連接查詢中左邊表中的所有元組的信息都得到了保留。
1.2.2.2右外連接(RIGHTOUTERJOIN)。右外連接與左外連接類似,只是右端表中的所有元組都列出,限制左端表的數(shù)據必須滿足連接條件,而不管右端表中的數(shù)據是否滿足連接條件,均輸出表中的內容。
例如:同上例內容,查詢語句為
SELECT學生.學號,姓名,班級代碼,課程號,成績
FROM學生RIGHTOUTERJOIN成績ON學生.學號=成績.學號
右外連接查詢中右邊表中的所有元組的信息都得到了保留。
1.2.2.3全外連接(FULL OUTER JOIN)。全外連接查詢的特點是左、右兩端表中的元組都輸出,如果沒能找到匹配的元組,就使用NULL來代替。
例如:同左外連接例子內容,查詢語句為:
SELECT學生.學號,姓名,班級代碼,課程號,成績
FROM學生FULL OUTER JOIN成績ON學生.學號=成績.學號
全外連接查詢中所有表中的元組信息都得到了保留。
1.2.3自連接。在同一個表內進行自身連接,這種查詢稱為自連接查詢,自連接必須為表指定兩個別名。
例如:要求檢索出和劉鑫同班同學的信息,查詢語句為:
SELECT 學生.*FROM學生JOIN學生AS學1 ON學生.班級代碼=學生1.班級代碼
WHERE學生1.姓名=‘劉鑫and學生1.學號<>學生.學號
1.2.4交叉連接。交叉連接即笛卡兒乘積,是指兩個關系中所有元組的任意組合。一般情況下,交叉查詢是沒有實際意義的。
例如:如果希望得到學生和成績兩個關系模式的乘積,查詢語句為:
2.SELECT * FROM學生CROSS JOIN成績
2.1什么是嵌套查詢
2.1.1定義。嵌套查詢是指在一個SELECT語句的WHERE子句中嵌套另一條SELECT語句的查詢,又稱為子查詢。
2.2嵌套查詢的分類
2.2.1無關子查詢。無關子查詢的執(zhí)行不依賴于外部嵌套。查詢的執(zhí)行過程為:首先執(zhí)行子查詢,子查詢得到的結果作為外部查詢的條件使用,然后執(zhí)行外部查詢。通常使用比較運算符或[NOT]IN關鍵字。
2.2.1.1返回一個值的子查詢。子查詢的返回值只有一個時,可以使用比較運算符如=、<、>、>=、<=、!=等將父查詢和子查詢連接起來。
例如:要求檢索出和劉鑫同班同學的信息,查詢語句為:
SELECT * FROM 學生 WHERE 班級代碼=
(SELECT 班級代碼FROM 學生 WHERE 姓名=劉鑫)AND 姓名<>劉鑫
2.2.1.2返回一組值的子查詢。子查詢的返回值不止一個,而是一個集合時,可以在比較運算符和子查詢之間插入ANY、SOME或ALL關鍵字。其中等值關系可以使用IN關鍵字。
例如:查詢成績高于選修了“計算機基礎”課程平均成績的學生的學號和姓名。
SELECT學生.學號,學生.姓名FROM成績JOIN學生ON學生.學號=成績.學號
JOIN課程ON成績.課程號=課程.課程號WHERE課程名='計算機基礎' AND
成績>ANY(SELECT avg(成績)FROM成績,課程WHERE成績.課程號=課程.課程號and課程名=‘計算機基礎)
2.2.2相關子查詢。相關子查詢是指在子查詢中,子查詢的查詢條件中引用了外層查詢表中的值。執(zhí)行時先執(zhí)行外部查詢語句,然后根據外部查詢返回的結果執(zhí)行內部查詢語句。通常使用[NOT]EXISTS 關鍵字。
例如:查詢沒有學習任何課程的學生的學號和姓名。
SELECT 學號,姓名FROM 學生WHERE NOT EXISTS(SELECT * FROM 成績 WHERE 成績.學號=學生.學號)
3.連接查詢和嵌套查詢對比分析
從“要求檢索出和劉鑫同班同學的信息”這個例子中我們可以看到,使用連接查詢和嵌套查詢實現(xiàn)該查詢的結果完全相同。由此我們可以得出這樣一個結論:連接查詢和嵌套查詢之間有時是可以相互替換的,但不是所有情況下都可以互換。下面將分別介紹連接查詢和嵌套查詢的優(yōu)劣。
3.1連接查詢的優(yōu)勢和劣勢。連接查詢使用簡單,但因為在各表連接的同時對所有的條件綜合查詢,所以不易發(fā)現(xiàn)錯誤,一旦出錯,糾錯也比較麻煩。另外,連接查詢實際上是將所有表根據條件先合并成一個表。因此在數(shù)據量很大的情況下,對計算機系統(tǒng)的要求較高,需占用更多的系統(tǒng)資源。
3.2嵌套查詢的優(yōu)勢和劣勢。嵌套查詢是用戶必須清楚每一個子查詢的結果及各表之間的邏輯關系,對用戶要求較高。但嵌套查詢是逐步求解,需要的計算機系統(tǒng)開銷較小。
3.3怎樣合理運用連接查詢和嵌套查詢。綜上可以看出,連接查詢和嵌套查詢各自有其優(yōu)勢和劣勢,在實際查詢過程中到底采用哪種查詢方式,因根據使用習慣及對兩種查詢方式的熟練程度確定,也可以混合使用。
4.總結
綜上所述,查詢的優(yōu)化必須符合以下條件:滿足查詢需求的同時提高查詢速度,并能減少計算機系統(tǒng)開銷為原則。熟練掌握SQL查詢功能及技巧是基礎,另外了解每種查詢的優(yōu)劣才能更好的選擇合適的查詢方式。筆者首先介紹了連接查詢和嵌套查詢的定義和分類,然后通過兩者的對比分析,比較了兩者的優(yōu)勢和劣勢,總結出實際使用過程中可根據自身的實際需求和使用習慣選擇合適的查詢方式。
(作者單位:1.武昌職業(yè)學院;2.湖北華秦教育軟件技術有限公司)
參考文獻:
[1]王良元,SQ連接、嵌套與混合查詢[J],電腦學習,2005
[2]張文雯,SQ嵌套查詢[J],信息技術,2011
[3]雷琳,SQL查詢語句優(yōu)化的研究[J],武漢船舶職業(yè)技術學院,2011