七、SQL–子查詢②(單值子查詢)

單值子查詢

單值子查詢:語法和普通的SELECT語句一樣,唯一的限制是子查詢的返回值必須只有一行記錄,而且只能有一個(gè)列。這樣的子查詢又被稱為標(biāo)量子查詢,標(biāo)量子查詢可以用在SELECT語句的列表中、表達(dá)式中、WHERE 語句中等很多場合。

首先來看一個(gè)在SELECT語句列表中使用的最簡單的標(biāo)量子查詢。SQL語句如下:

MYSQL,MSSQLServer:
SELECT 1 AS f1,2,(SELECT MIN(FYearPublished) FROM T_Book),(SELECT MAX(FYearPublished) FROM T_Book) AS f4
Oracle:
SELECT 1 AS f1,2,(SELECT MIN(FYearPublished) FROM T_Book),(SELECT MAX(FYearPublished) FROM T_Book) AS f4 FROM DUAL
DB2:
SELECT 1 AS f1,2,(SELECT MIN(FYearPublished) FROM T_Book),(SELECT MAX(FYearPublished) FROM T_Book) AS f4 FROM SYSIBM.SYSDUMMY1

這個(gè)SQL語句一共返回四列,第一列是數(shù)字1,第二列是數(shù)字2,第三列則是一個(gè)標(biāo)量子查詢,它返回最早出版圖書的年份,第四列也是一個(gè)標(biāo)量子查詢,它返回最晚出版圖書的年份。這里完全可以將標(biāo)量子查詢當(dāng)成一個(gè)普通的列,而且還可以為標(biāo)量子查詢列取一個(gè)別名。

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

f1 f4
1 2 1700 2008

如果一個(gè)子查詢返回值不止一行記錄或者有多個(gè)列的話都不能當(dāng)作標(biāo)量子查詢使用,否則會(huì)出錯(cuò)。
如下面SQL語句是錯(cuò)的:

SELECT 1 AS f1,2,(SELECT FYearPublished FROM T_Book)

由于這句SQL 語句中的子查詢會(huì)返回多行記錄,所以在執(zhí)行的時(shí)候數(shù)據(jù)庫會(huì)提示如下錯(cuò)誤信息:
子查詢返回的值不止一個(gè)。

當(dāng)子查詢跟隨在 =、!=、<、<=、>、>= 之后,或子查詢用作表達(dá)式時(shí),這種情況是不允許的。

下面的SQL 語句也是錯(cuò)誤的:

SELECT 1 AS f1,2,(SELECT MAX(FYearPublished),MIN(FYearPublished) FROM T_Book)

由于這句SQL語句中的子查詢會(huì)返回包含兩列數(shù)據(jù)的結(jié)果集,所以在執(zhí)行的時(shí)候數(shù)據(jù)庫會(huì)提示如下的錯(cuò)誤信息:
當(dāng)沒有用EXISTS 引入子查詢時(shí),在選擇列表中只能指定一個(gè)表達(dá)式。

上面舉的例子都是在執(zhí)行前就能確定是否正確的,但是有的時(shí)候一個(gè)子查詢是否使用正確是要到運(yùn)行時(shí)才能確定的。
如:在數(shù)據(jù)庫系統(tǒng)中執(zhí)行下面的SQL語句:

SELECT 1 AS f1,2,(SELECT FYearPublished FROM T_Book where FYearPublished<2000)

在數(shù)據(jù)庫系統(tǒng)中執(zhí)行后這句SQL語句會(huì)報(bào)錯(cuò),因?yàn)榘l(fā)行日期小于2000年的書有不止一本,所以子查詢的返回結(jié)果集也就有不止一條記錄。

如果我們調(diào)整這句SQL 語句,轉(zhuǎn)而查詢發(fā)行日期小于1750年的書,SQL語句如下:

SELECT 1 AS f1,2,(SELECT FYearPublished FROM T_Book where FYearPublished<1750)

因?yàn)閿?shù)據(jù)庫中發(fā)行日期小于1750年的書恰恰只有一本,所以這句SQL語句能夠執(zhí)行成功,執(zhí)行結(jié)果如下:

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