標(biāo)量子查詢:可以當(dāng)做是select列表中的一個列,唯一約束條件是子查詢的返回值必須只有一行記錄荷逞,且只能有一個列。但并不是只能返回唯一的值粹排,它可以隨當(dāng)前查詢記錄而變化种远。如:
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ù)僅返回一行記錄膝迎,所以這滿足標(biāo)量子查詢的條件。通過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)會報出如下的錯誤信息:
無法綁定由多個部分組成的標(biāo)識符"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é)果來仔細(xì)分析一下這句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)。