七、SQL-子查詢④(標量子查詢select)

標量子查詢:可以當做是select列表中的一個列,唯一約束條件是子查詢的返回值必須只有一行記錄,且只能有一個列。但并不是只能返回唯一的值,它可以隨當前查詢記錄而變化。如:


SELECT FId,FName,(SELECT MAX(FYearPublished) 
FROM T_Book WHERE T_Book. FCategoryId= T_Category.FId) FROM T_Category

SELECT語句首先檢索FId、FName兩個字段,第三個字段不是一個列而是一個子查詢。這個子查詢位于主查詢的內(nèi)部,它返回一類圖書的最新出版年份。因為聚合函數(shù)僅返回一行記錄,所以這滿足標量子查詢的條件。通過WHERE語句,這個子查詢也被連接到外部的SELECT查詢語句中,因為這個連接,MAX(FYearPublished)將返回每類圖書的最新出版年份。

注意:這里的子查詢依賴于外部查詢中的字段,不可以單獨執(zhí)行。(這里的子查詢是依賴于外部查詢中的T_Category.FId字段的,這個子查詢是無法單獨執(zhí)行的)若在數(shù)據(jù)庫系統(tǒng)中執(zhí)行以下SQL語句:


SELECT MAX(FYearPublished) FROM T_Book WHERE T_Book. FCategoryId= T_Category.FId

執(zhí)行后數(shù)據(jù)庫系統(tǒng)會報出如下的錯誤信息:

無法綁定由多個部分組成的標識符"T_Category.FId"。

因為這個子查詢中引用了外部查詢中的字段。這種引用了外部查詢中字段的子查詢被稱為相關(guān)子查詢。

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


FId FName
1 Story 2002
2 History 2008
3 Theory 1971
4 Technology 2005
5 Art 1771
6 Philosophy 2001

下面結(jié)合執(zhí)行結(jié)果來仔細分析一下這句SQL語句。首先看執(zhí)行結(jié)果中的第一行,它的FId是1.子查詢通過T_Book表中的FCategoryId字段和T_Category表中的FId連接到外部查詢。對于第一行,F(xiàn)Id是1,因此子查詢在T_Book表中檢索FCategoryId字段等于1的所有圖書的FYearPublished字段的最大值;接著查看外部查詢的第二行,F(xiàn)Id是2,這次子查詢檢索T_Book表中FCategoryId字段等于2的所有圖書的FYearPublished字段的最大值;然后查看外部查詢的第三行……以此類推。

如果沒有子查詢中的WHERE子句將子查詢連接到外部查詢,則結(jié)果將只是子查詢返回的所有記錄的最大值。

如:修改上以上SQL語句,將子查詢中WHERE 子句刪除,得到如下SQL語句:


SELECT FId,FName,(SELECTMAX(FYearPublished) 
FROM T_Book) FROM T_Category

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


FId FName
1 Story 2008
2 History 2008
3 Theory 2008
4 Technology 2008
5 Art 2008
6 Philosophy 2008

MAX(FYearPublished) 現(xiàn)在是T_Book 表中所有記錄的最大出版年份,它不與任何書籍分類相關(guān)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。