日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
創(chuàng)新互聯(lián)數(shù)據(jù)庫(kù)教程:MySQL子查詢

前面我們介紹了如何使用 SELECT、INSERT、UPDATE 和 DELETE 語(yǔ)句對(duì) MySQL 進(jìn)行簡(jiǎn)單訪問(wèn)和操作。下面在此基礎(chǔ)上開(kāi)始學(xué)習(xí)子查詢。

創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司,提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

子查詢是 MySQL 中比較常用的查詢方法,通過(guò)子查詢可以實(shí)現(xiàn)多表查詢。
子查詢指將一個(gè)查詢語(yǔ)句嵌套在另一個(gè)查詢語(yǔ)句中。子查詢可以在 SELECT、UPDATE 和 DELETE 語(yǔ)句中使用,而且可以進(jìn)行多層嵌套。在實(shí)際開(kāi)發(fā)時(shí),子查詢經(jīng)常出現(xiàn)在 WHERE 子句中。

子查詢?cè)?WHERE 中的語(yǔ)法格式如下:

WHERE <表達(dá)式> <操作符> (子查詢)

其中,操作符可以是比較運(yùn)算符和 IN、NOT IN、EXISTS、NOT EXISTS 等關(guān)鍵字。

1)IN | NOT IN

當(dāng)表達(dá)式與子查詢返回的結(jié)果集中的某個(gè)值相等時(shí),返回 TRUE,否則返回 FALSE;若使用關(guān)鍵字 NOT,則返回值正好相反。

2)EXISTS | NOT EXISTS

用于判斷子查詢的結(jié)果集是否為空,若子查詢的結(jié)果集不為空,返回 TRUE,否則返回 FALSE;若使用關(guān)鍵字 NOT,則返回的值正好相反。

例 1

使用子查詢?cè)?tb_students_info 表和 tb_course 表中查詢學(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。上述查詢過(guò)程也可以分為以下 2 步執(zhí)行,實(shí)現(xiàn)效果是相同的。

1)首先單獨(dú)執(zhí)行內(nèi)查詢,查詢出 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í)行外層查詢,在 tb_students_info 表中查詢 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 查詢稱為父查詢,圓括號(hào)中嵌入的查詢稱為子查詢(
子查詢必須放在圓括號(hào)內(nèi))。MySQL 在處理上例的 SELECT 語(yǔ)句時(shí),執(zhí)行流程為:
先執(zhí)行子查詢,再執(zhí)行父查詢。

例 2

與例 1 類似,在 SELECT 語(yǔ)句中使用 NOT IN 關(guā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 表中查詢出所有學(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 表中查詢出沒(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

查詢 tb_course 表中是否存在 id=1 的課程,如果存在,就查詢出 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,外層查詢語(yǔ)句接收 TRUE 之后對(duì)表 tb_students_info 進(jìn)行查詢,返回所有的記錄。

EXISTS 關(guān)鍵字可以和其它查詢條件一起使用,條件表達(dá)式與 EXISTS 關(guān)鍵字之間用 AND 和 OR 連接。

例 6

查詢 tb_course 表中是否存在 id=1 的課程,如果存在,就查詢出 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 表中查詢出了一條記錄,這條記錄的 age 字段取值為 25。內(nèi)層查詢語(yǔ)句從 tb_course 表中查詢到記錄,返回 TRUE。外層查詢語(yǔ)句開(kāi)始進(jìn)行查詢。根據(jù)查詢條件,從 tb_students_info 表中查詢 age 大于 24 的記錄。

拓展

子查詢的功能也可以通過(guò)表連接完成,但是子查詢會(huì)使 SQL 語(yǔ)句更容易閱讀和編寫。

一般來(lái)說(shuō),表連接(內(nèi)連接和外連接等)都可以用子查詢替換,但反過(guò)來(lái)卻不一定,有的子查詢不能用表連接來(lái)替換。子查詢比較靈活、方便、形式多樣,適合作為查詢的篩選條件,而表連接更適合于查看連接表的數(shù)據(jù)。


當(dāng)前題目:創(chuàng)新互聯(lián)數(shù)據(jù)庫(kù)教程:MySQL子查詢
當(dāng)前鏈接:http://www.5511xx.com/article/codiiii.html