七、SQL-子查詢⑤(標(biāo)量子查詢where)

先看一個(gè)簡(jiǎn)單的例子

例:要檢索喜歡“Story”的讀者主鍵列表,(可以使用連接來完成,但使用子查詢的實(shí)現(xiàn)思路也比使用連接簡(jiǎn)單)使用子查詢來完成。

1、首先肯定要到T_Category 表中查找FName等于“Story”的記錄的FId字段值:

SELECT FId FROM T_Category WHERE FName=" Story "

因?yàn)檫@個(gè)查詢的返回值是單列且單行的,所以可以當(dāng)作標(biāo)量子查詢使用。
2、然后,將這個(gè)子查詢結(jié)果來構(gòu)造外部查詢:

SELECT FReaderId FROM T_ReaderFavorite 
WHERE FCategoryId=(SELECT FId FROM T_Category WHERE FName="Story")

執(zhí)行結(jié)果:

FReaderId
1
6
7
12
3

再看一個(gè)復(fù)雜點(diǎn)的例子

例:假設(shè)需要檢索每一種書籍類別中出版年份最早的書籍的名稱,如果有兩本或者多本書籍在同一年出版,則均顯示它們的名字。要求檢索結(jié)果中顯示出類型的名字、書的名字和它的出版年份。

檢索每種類型圖書中出版時(shí)間最早的圖書非常簡(jiǎn)單,只要使用GROUP BY 子句以及聚合函數(shù)就可以輕松完成這個(gè)任務(wù),SQL語句如下:

SELECT T_Category.FId,MIN(T_Book.FYearPublished)
FROM T_Category INNER JOIN T_Book ON
T_Category.FId=T_Book.FCategoryId GROUP BY T_Category.FId

執(zhí)行結(jié)果:

FId
1 1999
2 1700
3 1930
4 2003
5 1771
6 1995

查詢結(jié)果是正確的,不過這個(gè)查詢結(jié)果沒有提供書名,嘗試將圖書的名字加入到SELECT語句中,如下:

SELECT T_Category.FId, T_Book. FName,MIN(T_Book.FYearPublished) 
FROM T_Category INNER JOIN T_Book ON T_Category.FId=T_Book.FCategoryId GROUP BY T_Category.FId

執(zhí)行該SQL語句會(huì)提示錯(cuò)誤信息:
選擇列表中的列"T_Book.FName" 無效,因?yàn)樵摿袥]有包含在聚合函數(shù)或GROUP BY子句中。

錯(cuò)誤原因: 所有在SELECT列表中的字段如果沒有包含在聚合函數(shù)中,則必須放到GROUP BY 子句中,所以將T_Book. FName加入到GROUP BY 子句中,修改后的SQL語句如下:

SELECT T_Category.FId, T_Book. FName,MIN(T_Book.FYearPublished) 
FROM T_Category INNER JOIN T_Book ON T_Category.FId=T_Book.FCategoryId GROUP BY T_Category.FId, T_Book. FName

執(zhí)行結(jié)果:

FId FName
1 Jane Eyre 2001
1 Oliver Twist 2002
1 Two Cites 1999
2 History of America 1700
2 History of China 1982
2 History of England 1860
2 History of TheWorld 2008
3 Astronomy 1971
3 Atom 1930
3 Computer 1970
3 RELATIVITY 1945
4 About J2EE 2005
4 Learning Hibernate 2003
5 How To Singing 1771
6 DaoDeJing 2001
6 Obedience to Authority 1995

這個(gè)執(zhí)行結(jié)果顯然是錯(cuò)誤的,因?yàn)樗鼈兪歉鶕?jù)T_Category.FId和T_Book.FName這兩個(gè)字段進(jìn)行的分組,所以MIN(T_Book.FYearPublished)返回值不是一個(gè)特定書籍類型的最早出版年份,而是每本圖書中的最早出版年份。

而真正需要的是:查詢每種書籍類型中的最早出版的書籍,可以使用子查詢來輕松完成這個(gè)任務(wù)。在SQL查詢中,需要將一本書籍的出版年份與該類型的所有書籍的出版年份進(jìn)行比較,并且僅僅在它們匹配時(shí),才返回一個(gè)記錄,實(shí)現(xiàn)SQL語句如下:

SELECT T_Category.FId, T_Book. FName,T_Book.FYearPublished 
FROM T_Category INNER JOIN T_Book ON T_Category.FId=T_Book.FCategoryId 
WHERE T_Book.FYearPublished=(SELECT MIN(T_Book.FYearPublished) 
FROM T_Book WHERE T_Book.FCategoryId=T_Category.FId)

在這個(gè)SQL語句中:
首先T_Category表和T_Book表進(jìn)行內(nèi)部連接,然后使用WHERE子句中使用子查詢來進(jìn)行數(shù)據(jù)的過濾。
這個(gè)子查詢是一個(gè)相關(guān)子查詢,它返回外部查詢中當(dāng)前圖書類別中的圖書的最早出版年份。在外部查詢的WHERE子句中,T_Book的FYearPublished與子查詢的返回值進(jìn)行比較,這樣就可以得到每種書籍類型中的出版最早的書籍了。

執(zhí)行結(jié)果:

FId FName FYearPublished
1 Two Cites 1999
2 History of America 1700
3 Atom 1930
4 Learning Hibernate 2003
5 How To Singing 1771
6 Obedience to Authority 1995

在where語句中,子查詢是使用最多的一種之一。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容