国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

mysql支持子查詢嗎

2024-07-24 12:34:21
字體:
供稿:網(wǎng)友
  mysql支持子查詢。
  
  子查詢是 MySQL 中比較常用的查詢方法,通過子查詢可以實(shí)現(xiàn)多表查詢。子查詢指將一個(gè)查詢語句嵌套在另一個(gè)查詢語句中。子查詢可以在 SELECT、UPDATE 和 DELETE 語句中使用,而且可以進(jìn)行多層嵌套。在實(shí)際開發(fā)時(shí),子查詢經(jīng)常出現(xiàn)在 WHERE 子句中。
 
  子查詢在 WHERE 中的語法格式如下:
 
  WHERE <表達(dá)式> <操作符> (子查詢)
  其中,操作符可以是比較運(yùn)算符和 IN、NOT IN、EXISTS、NOT EXISTS 等關(guān)鍵字;子查詢必須在括號(hào)中關(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
 
  使用子查詢在 tb_students_info 表和 tb_course 表中查詢學(xué)習(xí) Java 課程的學(xué)生姓名
 
  mysql> SELECT name FROM tb_students_info
      -> WHERE course_id IN (SELECT id FROM tb_course WHERE course_name = 'Java');
  
  結(jié)果顯示,學(xué)習(xí) Java 課程的只有 Dany 和 Henry。上述查詢過程也可以分為以下 2 步執(zhí)行,實(shí)現(xiàn)效果是相同的。
 
  1)首先單獨(dú)執(zhí)行內(nèi)查詢,查詢出 tb_course 表中課程為 Java 的 id,SQL 語句和運(yùn)行結(jié)果如下。
 
  mysql> SELECT id FROM tb_course
      -> WHERE course_name = 'Java';
 
  可以看到,符合條件的 id 字段的值為 1。
 
  2)然后執(zhí)行外層查詢,在 tb_students_info 表中查詢 course_id 等于 1 的學(xué)生姓名。SQL 語句和運(yùn)行結(jié)果如下。
 
  mysql> SELECT name FROM tb_students_info
      -> WHERE course_id IN (1);
 
  習(xí)慣上,外層的 SELECT 查詢稱為父查詢,圓括號(hào)中嵌入的查詢稱為子查詢(子查詢必須放在圓括號(hào)內(nèi))。MySQL 在處理上例的 SELECT 語句時(shí),執(zhí)行流程為:先執(zhí)行子查詢,再執(zhí)行父查詢。
 
  例 2
 
  與例 1 類似,在 SELECT 語句中使用 NOT IN 關(guān)鍵字,查詢沒有學(xué)習(xí) Java 課程的學(xué)生姓名,SQL 語句和運(yùn)行結(jié)果如下。
 
  mysql> SELECT name FROM tb_students_info
      -> WHERE course_id NOT IN (SELECT id FROM tb_course WHERE course_name = 'Java');
 
  可以看出,運(yùn)行結(jié)果與例 1 剛好相反,沒有學(xué)習(xí) Java 課程的是除了 Dany 和 Henry 之外的學(xué)生。
 
  例 3
 
  使用=運(yùn)算符,在 tb_course 表和 tb_students_info 表中查詢出所有學(xué)習(xí) Python 課程的學(xué)生姓名,SQL 語句和運(yùn)行結(jié)果如下。
 
  mysql> SELECT name FROM tb_students_info
      -> WHERE course_id = (SELECT id FROM tb_course WHERE course_name = 'Python');
 
  結(jié)果顯示,學(xué)習(xí) Python 課程的學(xué)生只有 Jane。
 
  例 4
 
  使用<>運(yùn)算符,在 tb_course 表和 tb_students_info 表中查詢出沒有學(xué)習(xí) Python 課程的學(xué)生姓名,SQL 語句和運(yùn)行結(jié)果如下。
 
  mysql> SELECT name FROM tb_students_info
      -> WHERE course_id <> (SELECT id FROM tb_course WHERE course_name = 'Python');
 
  可以看出,運(yùn)行結(jié)果與例 3 剛好相反,沒有學(xué)習(xí) Python 課程的是除了 Jane 之外的學(xué)生。
 
  例 5
 
  查詢 tb_course 表中是否存在 id=1 的課程,如果存在,就查詢出 tb_students_info 表中的記錄,SQL 語句和運(yùn)行結(jié)果如下。
 
  mysql> SELECT * FROM tb_students_info
      -> WHERE EXISTS(SELECT course_name FROM tb_course WHERE id=1);
 
  由結(jié)果可以看到,tb_course 表中存在 id=1 的記錄,因此 EXISTS 表達(dá)式返回 TRUE,外層查詢語句接收 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ùn)行結(jié)果如下。
 
  mysql> SELECT * FROM tb_students_info
      -> WHERE age>24 AND EXISTS(SELECT course_name FROM tb_course WHERE id=1);
 
  結(jié)果顯示,從 tb_students_info 表中查詢出了一條記錄,這條記錄的 age 字段取值為 25。內(nèi)層查詢語句從 tb_course 表中查詢到記錄,返回 TRUE。外層查詢語句開始進(jìn)行查詢。根據(jù)查詢條件,從 tb_students_info 表中查詢 age 大于 24 的記錄。
 
  拓展
 
  子查詢的功能也可以通過表連接完成,但是子查詢會(huì)使 SQL 語句更容易閱讀和編寫。
 
  一般來說,表連接(內(nèi)連接和外連接等)都可以用子查詢替換,但反過來卻不一定,有的子查詢不能用表連接來替換。子查詢比較靈活、方便、形式多樣,適合作為查詢的篩選條件,而表連接更適合于查看連接表的數(shù)據(jù)。
 
  關(guān)于“mysql支持子查詢嗎”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永和县| 盐亭县| 兴和县| 平和县| 綦江县| 临泉县| 益阳市| 双柏县| 连平县| 永顺县| 衡阳县| 廉江市| 德格县| 吉林省| 商丘市| 讷河市| 桦川县| 安陆市| 五常市| 清水河县| 莱阳市| 樟树市| 福鼎市| 宁化县| 钟祥市| 松阳县| 固原市| 台南市| 凤阳县| 砚山县| 涟水县| 得荣县| 元江| 喀喇沁旗| 泽普县| 洛川县| 阳高县| 两当县| 平潭县| 扎赉特旗| 阿图什市|