在mysql中,子查詢是指將一個查詢語句嵌套在另一個查詢語句中,可以在SELECT、UPDATE和DELETE語句中配合WHERE子句進行實現,WHERE子句中語法格式為「WHERE <表達式> <運算子> (另一個查詢語句)」。
(推薦教學:mysql影片教學)
子查詢是MySQL 中比較常用的查詢方法,透過子查詢可以實現多表查詢。子查詢指將一個查詢語句嵌套在另一個查詢語句中。子查詢可以在 SELECT、UPDATE 和 DELETE 語句中使用,而且可以進行多層巢狀。在實際開發時,子查詢經常出現在 WHERE 子句中。
子查詢在 WHERE 中的語法格式如下:
WHERE <表达式> <操作符> (子查询语句)
其中,運算子可以是比較運算子和 IN、NOT IN、EXISTS、NOT EXISTS 等關鍵字。
1)IN | NOT IN
當表達式與子查詢傳回的結果集中的某個值相等時,傳回TRUE,否則傳回FALSE;若使用關鍵字NOT,則傳回值正好相反。
2)EXISTS | NOT EXISTS
用來判斷子查詢的結果集是否為空,若子查詢的結果集不為空,回傳TRUE,否則回傳FALSE;若使用關鍵字NOT,則傳回的值正好相反。
範例 1
使用子查詢在 tb_students_info 表和 tb_course 表中查詢學習 Java 課程的學生姓名,SQL 語句和運行結果如下。
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)
結果顯示,學習 Java 課程的只有 Dany 和 Henry。上述查詢過程也可以分成以下 2 步驟執行,實現效果是相同的。
1)先單獨執行內查詢,查詢出 tb_course 表中課程為 Java 的 id,SQL 語句和運行結果如下。
mysql> SELECT id FROM tb_course -> WHERE course_name = 'Java'; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
可以看到,符合條件的 id 欄位的值為 1。
2)接著執行外層查詢,在 tb_students_info 表中查詢 course_id 等於 1 的學生姓名。 SQL 語句和執行結果如下。
mysql> SELECT name FROM tb_students_info -> WHERE course_id IN (1); +-------+ | name | +-------+ | Dany | | Henry | +-------+ 2 rows in set (0.00 sec)
習慣上,外層的 SELECT 查詢稱為父查詢,圓括號中嵌入的查詢稱為子查詢(子查詢必須放在圓括號內)。 MySQL 在處理上例的 SELECT 語句時,執行流程為:先執行子查詢,再執行父查詢。
範例2
與範例1 類似,在SELECT 語句中使用NOT IN 關鍵字,查詢沒有學習Java 課程的學生姓名,SQL 語句和運行結果如下。
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)
可以看出,運行結果與例 1 剛好相反,沒有學習 Java 課程的是除了 Dany 和 Henry 之外的學生。
範例 3
使用=運算符,在 tb_course 資料表和 tb_students_info 表中查詢出所有學習 Python 課程的學生姓名,SQL 語句和運行結果如下。
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)
結果顯示,學習 Python 課程的學生只有 Jane。
例4
使用<>運算符,在tb_course 表和tb_students_info 表中查詢出沒有學習Python 課程的學生姓名,SQL 語句和運行結果如下。
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)
可以看出,運行結果與例 3 剛好相反,沒有學習 Python 課程的是除了 Jane 之外的學生。
範例5
查詢tb_course 表中是否存在id=1 的課程,如果存在,就查詢出tb_students_info 表中的記錄,SQL 語句和運行結果如下。
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)
由結果可以看到,tb_course 表中存在 id=1 的記錄,因此 EXISTS 表達式傳回 TRUE,外層查詢語句接收 TRUE 之後會對表 tb_students_info 進行查詢,傳回所有的記錄。
EXISTS 關鍵字可以和其它查詢條件一起使用,條件表達式與 EXISTS 關鍵字之間以 AND 和 OR 連接。
範例6
查詢tb_course 表中是否存在id=1 的課程,如果存在,就查詢出tb_students_info 表中age 欄位大於24 的記錄,SQL 語句和運行結果如下。
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)
結果顯示,從 tb_students_info 表中查詢出了一筆記錄,這條記錄的 age 欄位取值為 25。內層查詢語句從 tb_course 表中查詢到記錄,傳回 TRUE。外層查詢語句開始進行查詢。根據查詢條件,從 tb_students_info 表中查詢 age 大於 24 的記錄。
拓展
子查詢的功能也可以透過資料表連接完成,但是子查詢會使 SQL 語句更容易閱讀和編寫。
一般來說,表連接(內連接和外連接等)都可以用子查詢替換,但反過來卻不一定,有的子查詢不能用表連接來替換。子查詢比較靈活、方便、形式多樣,適合作為查詢的篩選條件,而表格連接則較適合檢視連接表的資料。
以上是在mysql中如何進行子查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!