在SQL語句中,子查詢需要放在圓括號中,在執行子查詢時,其執行的過程是先查詢出來子查詢的結果,然後將子查詢返回的結果作為其外層查詢的查詢條件。子查詢根據返回的結果,可以分為單行子查詢,多行子查詢和多列子查詢;根據返回的數據與外層查詢之間的關系,可以分為相關子查詢和不相關子查詢。應該說,子查詢在實際開發過程中有著非常廣泛的應用。
單行子查詢
在實際應用中,如果開發人員或者是用戶明確知道其SQL語句中使用的子查詢返回的結果是一行數據時,即時,就可以使用算術比較運算符進行子查詢的操作。其中,比較運算符包括=(等於)、>=(大於等於)、<=(小於等於)、>(大於)、<(小於)、!=(不等於)、 <>(不等於)、!>(不大於)、!<(不小於)。
多行子查詢
所謂多行子查詢是指子查詢中返回的結果集中含有多行數據。當子查詢返回的是多行數據時,需要使用多行運算符。多行運算符包括等運算符。
使用IN運算符,可以將滿足列表中滿足指定表達式的任何一個值都查詢出來。在子查詢中使用IN 運算符,則與子查詢中查詢出來的結果集中的任何一個值匹配的結果都會被查詢出來。
ANY運算符也用於多行子查詢中。ANY運算符的含義是只要與子查詢中的任何一個結果值匹配,其值都會被返回。ANY運算符在使用時需要和比較運算符(=(等於)、>=(大於等於)、<=(小於等於)、>(大於)、<(小於)、!=(不等於)、 <>(不等於))放在一起使用。SOME是ANY的一個同義詞。
多列子查詢
所謂多列子查詢,是指子查詢的語句會返回多個數據列的子查詢語句。在WHERE子句中也可以使用將多個屬性值用括號括起來的方式實現多列子查詢。在多列子查詢中,WHERE子句中需要使用括號將多個屬性括在一起,多個屬性之間需要用逗號分開。
外層查詢的WHERE子句中根據多列子查詢返回的行數不同,可以選擇使用不同的運算符。如果多列子查詢中返回的數據行是單行的,即返回的結果值只有一個,則可以使用算術比較運算符;如果子查詢中返回的數據行是多行的,即返回的結果值不只一個,則可以使用IN、ANY、ALL運算符。
(dept,profession) teaID )
相關子查詢
在前面介紹的SQL語句子查詢中,都是首先執行內層子查詢的語句,然後將子查詢返回的結果作為外層查詢的查詢條件檢索數據的。這時的子查詢只執行一次。與主查詢相關的子查詢需要引用主查詢裡的值,所以必須依賴於主查詢,因為這種聯系,與主查詢相關的子查詢不能脫離主查詢作為一條獨立的查詢命令執行。
j t2 j ( i t1); j t2 ( i t1 i j);
而也就是說,相關子查詢需要依賴與外層查詢,外層查詢和子查詢之間是存在聯系的。與主查詢相關的子查詢的工作情況是:把值從主查詢傳遞到子查詢,看她們是否滿足在自查詢中給出的條件。通常用EXISTS關鍵字或者NOT EXISTS關鍵字實現相關子查詢。帶有EXISTS關鍵字的子查詢在執行時只會返回邏輯值TRUE或者TALSE,而不會返回任何數據。也就是說,帶有EXISTS關鍵字的子查詢不關心返回的是什麼數據,而只關心返回的數據“有還是沒有”。(測試某個子查詢是否返回了數據行)。
使用NOT EXISTS關鍵字實行相關子查詢的查詢方法和使用 EXISTS關鍵字實行相關子查詢的查詢方法正好相反。如果NOT EXISTS子句的子查詢中沒有返回的結果,則外層查詢的WHERE子句就返回TRUE,則此最終查詢的結果集顯示出來;如果NOT EXISTS子句的子查詢中有返回的結果,則外層查詢的WHERE子句就返回FALSE。
在SQL語句中使用子查詢
子查詢語句除了可以應用在WHERE子句中,也可以應用在SELECT子句、FROM子句、ORDER BY子句、HAVING子句、CREATE TABLE 語句、CREATE VIEW 語句、INSERT 語句、UPDATE語句、 DELETE等語句中。
在SELECT子句中使用子查詢,查詢學生編號為s102203的成績信息
stuID R.stuID) R.stuID R.result
在FROM子句中使用子查詢,該子查詢查詢出來的結果集組成一個臨時的數據表。查詢學生編號為s102203學生的選課成績信息
R.curID R.stuID R.result
在HAVING子句中可以使用子查詢,該子查詢查詢出來的結果集組成一個臨時的數據表。查詢以學生編號s2開頭的學生的平均成績。
R.stuID, R.curID R.stuID stuID R.stuID
多重子查詢允許查詢條件中有多個子查詢語句。查詢教師信息表中職稱與教師編號為t181585教師相同但工資比該教師高的教師信息。
profession teaID teaID )
在CREATE TABLE語句中使用子查詢實現數據表的復制,通過在CREATE TABLE語句中使用子查詢可以在建立一張新的數據表的同時將原有表中的數據插入到新建的數據表中,即實現數據表中數據的復制功能。語法格式如下: