您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)在mysql中進(jìn)行子查詢(xún)的方法,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
在mysql中,子查詢(xún)是指將一個(gè)查詢(xún)語(yǔ)句嵌套在另一個(gè)查詢(xún)語(yǔ)句中,可以在SELECT、UPDATE和 DELETE語(yǔ)句中配合WHERE子句進(jìn)行實(shí)現(xiàn),WHERE子句中語(yǔ)法格式為“WHERE <表達(dá)式> <操作符> (另一個(gè)查詢(xún)語(yǔ)句)”。
子查詢(xún)是 MySQL 中比較常用的查詢(xún)方法,通過(guò)子查詢(xún)可以實(shí)現(xiàn)多表查詢(xún)。子查詢(xún)指將一個(gè)查詢(xún)語(yǔ)句嵌套在另一個(gè)查詢(xún)語(yǔ)句中。子查詢(xún)可以在 SELECT、UPDATE 和 DELETE 語(yǔ)句中使用,而且可以進(jìn)行多層嵌套。在實(shí)際開(kāi)發(fā)時(shí),子查詢(xún)經(jīng)常出現(xiàn)在 WHERE 子句中。
子查詢(xún)?cè)?WHERE 中的語(yǔ)法格式如下:
WHERE <表達(dá)式> <操作符> (子查詢(xún)語(yǔ)句)
其中,操作符可以是比較運(yùn)算符和 IN、NOT IN、EXISTS、NOT EXISTS 等關(guān)鍵字。
1)IN | NOT IN
當(dāng)表達(dá)式與子查詢(xún)返回的結(jié)果集中的某個(gè)值相等時(shí),返回 TRUE,否則返回 FALSE;若使用關(guān)鍵字 NOT,則返回值正好相反。
2)EXISTS | NOT EXISTS
用于判斷子查詢(xún)的結(jié)果集是否為空,若子查詢(xún)的結(jié)果集不為空,返回 TRUE,否則返回 FALSE;若使用關(guān)鍵字 NOT,則返回的值正好相反。
例 1
使用子查詢(xún)?cè)?tb_students_info 表和 tb_course 表中查詢(xún)學(xué)習(xí) Java 課程的學(xué)生姓名,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> SELECT name FROM tb_students_info -> WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = 'Java'); +-------+ | name | +-------+ | Dany | | Henry | +-------+ 2 rows in set (0.01 sec)
結(jié)果顯示,學(xué)習(xí) Java 課程的只有 Dany 和 Henry。上述查詢(xún)過(guò)程也可以分為以下 2 步執(zhí)行,實(shí)現(xiàn)效果是相同的。
1)首先單獨(dú)執(zhí)行內(nèi)查詢(xún),查詢(xún)出 tb_course 表中課程為 Java 的 id,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> SELECT id FROM tb_course -> WHERE course_name = 'Java'; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
可以看到,符合條件的 id 字段的值為 1。
2)然后執(zhí)行外層查詢(xún),在 tb_students_info 表中查詢(xún) course_id 等于 1 的學(xué)生姓名。SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> SELECT name FROM tb_students_info -> WHERE course_id IN (1); +-------+ | name | +-------+ | Dany | | Henry | +-------+ 2 rows in set (0.00 sec)
習(xí)慣上,外層的 SELECT 查詢(xún)稱(chēng)為父查詢(xún),圓括號(hào)中嵌入的查詢(xún)稱(chēng)為子查詢(xún)(子查詢(xún)必須放在圓括號(hào)內(nèi))。MySQL 在處理上例的 SELECT 語(yǔ)句時(shí),執(zhí)行流程為:先執(zhí)行子查詢(xún),再執(zhí)行父查詢(xún)。
例 2
與例 1 類(lèi)似,在 SELECT 語(yǔ)句中使用 NOT IN 關(guān)鍵字,查詢(xún)沒(méi)有學(xué)習(xí) Java 課程的學(xué)生姓名,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> SELECT name FROM tb_students_info -> WHERE course_id NOT IN (SELECT id FROM tb_course WHERE course_name = 'Java'); +--------+ | name | +--------+ | Green | | Jane | | Jim | | John | | Lily | | Susan | | Thomas | | Tom | | LiMing | +--------+ 9 rows in set (0.01 sec)
可以看出,運(yùn)行結(jié)果與例 1 剛好相反,沒(méi)有學(xué)習(xí) Java 課程的是除了 Dany 和 Henry 之外的學(xué)生。
例 3
使用=運(yùn)算符,在 tb_course 表和 tb_students_info 表中查詢(xún)出所有學(xué)習(xí) Python 課程的學(xué)生姓名,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> SELECT name FROM tb_students_info -> WHERE course_id = (SELECT id FROM tb_course WHERE course_name = 'Python'); +------+ | name | +------+ | Jane | +------+ 1 row in set (0.00 sec)
結(jié)果顯示,學(xué)習(xí) Python 課程的學(xué)生只有 Jane。
例 4
使用<>運(yùn)算符,在 tb_course 表和 tb_students_info 表中查詢(xún)出沒(méi)有學(xué)習(xí) Python 課程的學(xué)生姓名,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> SELECT name FROM tb_students_info -> WHERE course_id <> (SELECT id FROM tb_course WHERE course_name = 'Python'); +--------+ | name | +--------+ | Dany | | Green | | Henry | | Jim | | John | | Lily | | Susan | | Thomas | | Tom | | LiMing | +--------+ 10 rows in set (0.00 sec)
可以看出,運(yùn)行結(jié)果與例 3 剛好相反,沒(méi)有學(xué)習(xí) Python 課程的是除了 Jane 之外的學(xué)生。
例 5
查詢(xún) tb_course 表中是否存在 id=1 的課程,如果存在,就查詢(xún)出 tb_students_info 表中的記錄,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> SELECT * FROM tb_students_info -> WHERE EXISTS(SELECT course_name FROM tb_course WHERE id=1); +----+--------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | +----+--------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | | 2 | Green | 23 | 男 | 158 | 2 | | 3 | Henry | 23 | 女 | 185 | 1 | | 4 | Jane | 22 | 男 | 162 | 3 | | 5 | Jim | 24 | 女 | 175 | 2 | | 6 | John | 21 | 女 | 172 | 4 | | 7 | Lily | 22 | 男 | 165 | 4 | | 8 | Susan | 23 | 男 | 170 | 5 | | 9 | Thomas | 22 | 女 | 178 | 5 | | 10 | Tom | 23 | 女 | 165 | 5 | | 11 | LiMing | 22 | 男 | 180 | 7 | +----+--------+------+------+--------+-----------+ 11 rows in set (0.01 sec)
由結(jié)果可以看到,tb_course 表中存在 id=1 的記錄,因此 EXISTS 表達(dá)式返回 TRUE,外層查詢(xún)語(yǔ)句接收 TRUE 之后對(duì)表 tb_students_info 進(jìn)行查詢(xún),返回所有的記錄。
EXISTS 關(guān)鍵字可以和其它查詢(xún)條件一起使用,條件表達(dá)式與 EXISTS 關(guān)鍵字之間用 AND 和 OR 連接。
例 6
查詢(xún) tb_course 表中是否存在 id=1 的課程,如果存在,就查詢(xún)出 tb_students_info 表中 age 字段大于 24 的記錄,SQL 語(yǔ)句和運(yùn)行結(jié)果如下。
mysql> SELECT * FROM tb_students_info -> WHERE age>24 AND EXISTS(SELECT course_name FROM tb_course WHERE id=1); +----+------+------+------+--------+-----------+ | id | name | age | sex | height | course_id | +----+------+------+------+--------+-----------+ | 1 | Dany | 25 | 男 | 160 | 1 | +----+------+------+------+--------+-----------+ 1 row in set (0.01 sec)
結(jié)果顯示,從 tb_students_info 表中查詢(xún)出了一條記錄,這條記錄的 age 字段取值為 25。內(nèi)層查詢(xún)語(yǔ)句從 tb_course 表中查詢(xún)到記錄,返回 TRUE。外層查詢(xún)語(yǔ)句開(kāi)始進(jìn)行查詢(xún)。根據(jù)查詢(xún)條件,從 tb_students_info 表中查詢(xún) age 大于 24 的記錄。
拓展
子查詢(xún)的功能也可以通過(guò)表連接完成,但是子查詢(xún)會(huì)使 SQL 語(yǔ)句更容易閱讀和編寫(xiě)。
一般來(lái)說(shuō),表連接(內(nèi)連接和外連接等)都可以用子查詢(xún)替換,但反過(guò)來(lái)卻不一定,有的子查詢(xún)不能用表連接來(lái)替換。子查詢(xún)比較靈活、方便、形式多樣,適合作為查詢(xún)的篩選條件,而表連接更適合于查看連接表的數(shù)據(jù)。
關(guān)于在mysql中進(jìn)行子查詢(xún)的方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。