MySQL中列子查詢與行子查詢操作的學(xué)習(xí)教程
MySQL 列子查詢及 IN、ANY、SOME 和 ALL 操作符的使用
MySQL 列子查詢
列子查詢是指子查詢返回的結(jié)果集是 N 行一列,該結(jié)果通常來(lái)自對(duì)表的某個(gè)字段查詢返回。
一個(gè)列子查詢的例子如下:
SELECT * FROM article WHERE uid IN(SELECT uid FROM user WHERE status=1)
列子查詢中使用 IN、ANY、SOME 和 ALL 操作符
由于列子查詢返回的結(jié)果集是 N 行一列,因此不能直接使用 = > < >= <= <> 這些比較標(biāo)量結(jié)果的操作符。在列子查詢中可以使用 IN、ANY、SOME 和 ALL 操作符:
- IN:在指定項(xiàng)內(nèi),同 IN(項(xiàng)1,項(xiàng)2,…)。
- ANY:與比較操作符聯(lián)合使用,表示與子查詢返回的任何值比較為 TRUE ,則返回 TRUE 。
- SOME:ANY 的別名,較少使用。
- ALL:與比較操作符聯(lián)合使用,表示與子查詢返回的所有值比較都為 TRUE ,則返回 TRUE 。
下面是原始數(shù)據(jù)表:
table1:
s1 2 10
table2:
s2 5 12 20
ANY 操作符
ANY 關(guān)鍵字必須接在一個(gè)比較操作符的后面,表示與子查詢返回的任何值比較為 TRUE ,則返回 TRUE 。一個(gè) ANY 例子如下:
SELECT s1 FROM table1 WHERE s1 > ANY (SELECT s2 FROM table2)
查詢返回結(jié)果如下所示:
s1 10
在子查詢中,返回的是 table2 的所有 s2 列結(jié)果(5,12,20),然后將 table1 中的 s1 的值與之進(jìn)行比較,只要大于 s2 的任何值即表示為 TRUE,符合查詢條件。
IN 是 = ANY 的別名,二者相同,但 NOT IN 的別名卻不是 <> ANY 而是 <> SOME。
特殊情況
如果 table2 為空表,則 ANY 后的結(jié)果為 FALSE;
如果子查詢返回如 (NULL,NULL,NULL) 列為空的結(jié)果,則 ANY 后的結(jié)果為 UNKNOWN 。
ALL 操作符
ALL 關(guān)鍵字必須接在一個(gè)比較操作符的后面,表示與子查詢返回的所有值比較為 TRUE ,則返回 TRUE 。一個(gè) ALL 例子如下:
SELECT s1 FROM table1 WHERE s1 > ALL (SELECT s2 FROM table2)
該查詢不會(huì)返回任何結(jié)果,因?yàn)?s1 中沒(méi)有比 s2 所有值都大的值。
當(dāng)然在該例子查詢中,返回了 s2 的所有值,您可以在該子查詢中添加任何條件以限制返回的查詢結(jié)果而無(wú)需全部返回。
NOT IN 是 <> ALL 的別名,二者相同。
特殊情況
如果 table2 為空表,則 ALL 后的結(jié)果為 TRUE;
如果子查詢返回如 (0,NULL,1) 這種盡管 s1 比返回結(jié)果都大,但有空行的結(jié)果,則 ALL 后的結(jié)果為 UNKNOWN 。
注意:對(duì)于 table2 空表的情況,下面的語(yǔ)句均返回 NULL:
SELECT s1 FROM table1 WHERE s1 > (SELECT s2 FROM table2) SELECT s1 FROM table1 WHERE s1 > ALL (SELECT MAX(s1) FROM table2)
MySQL 行子查詢
行子查詢是指子查詢返回的結(jié)果集是一行 N 列,該子查詢的結(jié)果通常是對(duì)表的某行數(shù)據(jù)進(jìn)行查詢而返回的結(jié)果集。
一個(gè)行子查詢的例子如下:
SELECT * FROM table1 WHERE (1,2) = (SELECT column1, column2 FROM table2)
在該例子中,在保證子查詢返回單一行數(shù)據(jù)的前提下,如果 column1=1 且 column2=2 ,則該查詢結(jié)果為 TRUE。
MySQL 行構(gòu)造符
在上面的例子中,WHERE 后面的 (1,2) 被稱為行構(gòu)造符,也可以寫(xiě)作 ROW(1,2)。行構(gòu)造符通常用于與對(duì)能返回兩個(gè)或兩個(gè)以上列的子查詢進(jìn)行比較。
MySQL 行子查詢實(shí)例
下面是用于例子的兩張?jiān)紨?shù)據(jù)表:
article 表:
blog 表:
SQL 如下:
SELECT * FROM article WHERE (title,content,uid) = (SELECT title,content,uid FROM blog WHERE bid=2)
查詢返回結(jié)果如下所示:
在該行子查詢例子中,將 article 表 title,content,uid 字段逐一與子查詢返回的行記錄作比較,如果相等則列出這些相等的記錄(理論上可能不止一條)。
相關(guān)文章
MySQL與存儲(chǔ)過(guò)程的相關(guān)資料
這篇文章主要介紹了MySQL與存儲(chǔ)過(guò)程的相關(guān)資料,需要的朋友可以參考下2007-03-03記一次MySQL Slave庫(kù)恢復(fù)實(shí)戰(zhàn)記錄
這篇文章主要介紹了記一次MySQL Slave庫(kù)恢復(fù)實(shí)戰(zhàn)記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07CMD命令操作MySql數(shù)據(jù)庫(kù)的方法詳解
今天小編就為大家分享一篇關(guān)于CMD命令操作MySql數(shù)據(jù)庫(kù)的方法詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02mysql Access denied for user ‘root’@’localhost’ (using passw
這篇文章主要介紹了mysql Access denied for user ‘root’@’localhost’ (using password: YES)解決方法,本文給出詳細(xì)的解決步驟及操作注釋,需要的朋友可以參考下2015-07-07MySQL中出現(xiàn)lock?wait?timeout?exceeded問(wèn)題及解決
這篇文章主要介紹了MySQL中出現(xiàn)lock?wait?timeout?exceeded問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08