資源描述:
《sql子查詢和嵌套查詢》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。
1、什么是嵌套查詢嵌套查詢是指在一個外層查詢中包含有另一個內(nèi)層查詢,即一個SQL查詢語句塊可以嵌套在另一個查詢塊的WHERE子句中。其中外層查詢稱為父查詢、主查詢。內(nèi)層查詢也稱為子查詢、從查詢。什么是子查詢子查詢是SELECT語句內(nèi)的另外一條SELECT語句,而且常常被稱為內(nèi)查詢或是內(nèi)SELECT語句。SELECT、INSERT、UPDATE或DELETE命令中允許是一個表達式的地方都可以包含子查詢,子查詢甚至可以包含在另外一個子查詢中。1.語法子查詢的句法如下:(SELECT[ALL
2、DISTINCT]FROM
3、[WHERE][GROUPBY[HAVING]])2.語法規(guī)則(1)子查詢的SELECT查詢總使用圓括號括起來。(2)不能包括COMPUTE或FORBROWSE子句。(3)如果同時指定TOP子句,則可能只包括ORDERBY子句。(4)子查詢最多可以嵌套32層,個別查詢可能會不支持32層嵌套。(5)任何可以使用表達式的地方都可以使用子查詢,只要它返回的是單個值。(6)如果某個表只出現(xiàn)在子查詢中而不出現(xiàn)在外部查詢
4、中,那么該表中的列就無法包含在輸出中。3.語法格式(1)WHERE查詢表達式[NOT]IN(子查詢)。(2)WHERE查詢表達式比較運算符[ANY
5、ALL](子查詢)。(3)WHERE[NOT]EXISTS(子查詢)。簡單嵌套查詢嵌套查詢內(nèi)層子查詢通常作為搜索條件的一部分呈現(xiàn)在WHERE或HAVING子句中。例如,把一個表達式的值和一個由子查詢生成的一個值相比較,這個測試類似于簡單比較測試。子查詢比較測試用到的運算符是:=、<>、<、>、<=、>=。子查詢比較測試把一個表達式的值和由子查詢的產(chǎn)生的一個值進行比較,返回比較結果為TRUE的記錄
6、。下面在“student”表中,查詢“課程成績”>96分的同學信息。在查詢分析器中輸入的SQL語句如下:usestudentselect*fromstudentwhere學號=(select學號fromgradewhere課程成績>96)實現(xiàn)的過程如圖1所示。圖1成績大于90分的同學信息子查詢“select學號fromgradewhere課程成績>96”的查詢結果是“B003”,即是一個值。子查詢過程如下:(1)從“grade”表中查詢出“課程成績”>96的學生學號為“B003”。(2)從學生表中查詢出“學號”是“B003”的學生信息。帶I
7、N的嵌套查詢帶IN的嵌套查詢語法格式為:WHERE查詢表達式IN(子查詢)。一些嵌套內(nèi)層的子查詢會產(chǎn)生一個值,也有一些子查詢會返回一列值,即子查詢不能返回帶幾行和幾列數(shù)據(jù)的表。原因在于子查詢的結果必須適合外層查詢的語句。當子查詢產(chǎn)生一系列值時,適合用帶IN的嵌套查詢。把查詢表達式單個數(shù)據(jù)和由子查詢產(chǎn)生的一系列的數(shù)值相比較,如果數(shù)值匹配一系列值中的一個,則返回TRUE。下面在“student”和“grade”表中,查詢參加考試的同學信息。在查詢分析器中輸入的SQL語句如下:usestudentselect*fromstudentwhere學號
8、in(select學號fromgrade)實現(xiàn)的過程如圖1所示。圖1參加考試的同學信息子查詢“select學號fromgrade”的結果如圖2所示。圖2子查詢結果子查詢生成“grade”表中學號列的數(shù)值,WHERE子句檢查主查詢記錄中的值是否與子查詢結果中的數(shù)值匹配,匹配返回TRUE值。由于主查詢記錄的“B006”的學號值與子查詢結果的數(shù)值不匹配,所以查詢結果不顯示學號為“B006”的記錄信息。帶IN的內(nèi)層嵌套還可以是多個值的列表。例如,查詢“年齡”是“22、21、24”的學生信息。SQL語句如下:usestudentselect*from
9、studentwhere年齡in(21,22,24)帶NOTIN的嵌套查詢NOTIN的嵌套查詢語法格式:WHERE查詢表達式NOTIN(子查詢)NOTIN和IN的查詢過程相類似。在“course”和“grade”表中,查詢沒有考試的課程信息。SQL語句如下:usestudentselect*fromcoursewhere課程代號notin(select課程代號fromgradewhere課程代號isnotnull)實現(xiàn)的過程如圖1所示。圖1沒有考試的課程信息查詢過程是用主查詢中“課程代號”的值與子查詢結果中的值比較,不匹配返回真值。由于主查
10、詢中的“k05”和“k06”的課程代號值與子查詢的結果的數(shù)據(jù)不匹配,返回真值。所以查詢結果顯示課程代號為“k05”和“k06”的課程信息。子查詢存在NULL值時,避免使用NOTI