MySQL筆記之子查詢使用介紹
子查詢是將一個(gè)查詢語句嵌套在另一個(gè)查詢語句中
內(nèi)層查詢語句的查詢結(jié)果,可以為外層查詢語句提供查詢條件
因?yàn)樵谔囟ㄇ闆r下,一個(gè)查詢語句的條件需要另一個(gè)查詢語句來獲取
參考表:employee
參考表:department
mysql> SELECT * FROM employee
-> WHERE d_id IN
-> (SELECT d_id FROM department);
+------+------+--------+------+------+--------------------+
| num | d_id | name | age | sex | homeaddr |
+------+------+--------+------+------+--------------------+
| 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區(qū) |
| 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區(qū) |
| 3 | 1002 | 王五 | 25 | 男 | 湖南長沙市 |
+------+------+--------+------+------+--------------------+
rows in set (0.00 sec)
此處首先查詢出department表中所有d_id字段的信息,并將結(jié)果作為條件
接著查詢employee表中以d_id為條件的所有字段信息
NOT IN的效果與上面剛好相反
帶比較運(yùn)算符的子查詢
mysql> SELECT d_id, d_name FROM department
-> WHERE d_id!=
-> (SELECT d_id FROM employee WHERE age=24);
+------+-----------+
| d_id | d_name |
+------+-----------+
| 1002 | 生產(chǎn)部 |
| 1003 | 銷售部 |
+------+-----------+
rows in set (0.00 sec)
這里查詢出了哪些部門沒有年齡為24歲的員工,看起來有點(diǎn)復(fù)雜
此外,運(yùn)算符還有很多,這里不再贅述
帶EXISTS關(guān)鍵字的子查詢
EXISTS關(guān)鍵字表示存在。使用EXISTS關(guān)鍵字時(shí),內(nèi)層查詢語句不返回查詢的記錄,而是返回一個(gè)真假值,如果內(nèi)層查詢語句查詢到滿足條件的記錄,就返回true,否則返回false
當(dāng)返回的值為true時(shí),外層查詢語句將進(jìn)行查詢,否則不進(jìn)行查詢
mysql> SELECT * FROM employee
-> WHERE EXISTS
-> (SELECT d_name FROM department WHERE d_id=1004);
Empty set (0.00 sec)
此處內(nèi)層循環(huán)并沒有查詢到滿足條件的結(jié)果,因此返回false,外層查詢不執(zhí)行
NOT EXISTS剛好與之相反
當(dāng)然,EXISTS關(guān)鍵字可以與其他的查詢條件一起使用
條件表達(dá)式與EXISTS關(guān)鍵字之間用AND或者OR來連接
mysql> SELECT * FROM employee
-> WHERE age>24 AND EXISTS
-> (SELECT d_name FROM department WHERE d_id=1003);
+------+------+--------+------+------+--------------------+
| num | d_id | name | age | sex | homeaddr |
+------+------+--------+------+------+--------------------+
| 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區(qū) |
| 3 | 1002 | 王五 | 25 | 男 | 湖南長沙市 |
+------+------+--------+------+------+--------------------+
rows in set (0.00 sec)
帶ANY關(guān)鍵字的子查詢
ANY關(guān)鍵字表示滿足其中任一條件
mysql> SELECT * FROM employee
-> WHERE d_id!=ANY
-> (SELECT d_id FROM department);
+------+------+--------+------+------+--------------------+
| num | d_id | name | age | sex | homeaddr |
+------+------+--------+------+------+--------------------+
| 1 | 1001 | 張三 | 26 | 男 | 北京市海淀區(qū) |
| 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區(qū) |
| 3 | 1002 | 王五 | 25 | 男 | 湖南長沙市 |
| 4 | 1004 | Aric | 15 | 男 | England |
+------+------+--------+------+------+--------------------+
rows in set (0.00 sec)
帶ALL關(guān)鍵字的子查詢
ALL關(guān)鍵字表示滿足其中所有條件
mysql> SELECT * FROM employee
-> WHERE d_id>=ALL
-> (SELECT d_id FROM department);
+------+------+------+------+------+----------+
| num | d_id | name | age | sex | homeaddr |
+------+------+------+------+------+----------+
| 4 | 1004 | Aric | 15 | 男 | England |
+------+------+------+------+------+----------+
row in set (0.00 sec)
暫時(shí)不明白這兩條語句是什么意思,到時(shí)候再補(bǔ)上
UNION合并查詢結(jié)果
mysql> SELECT d_id FROM employee
-> UNION
-> SELECT d_id FROM department;
+------+
| d_id |
+------+
| 1001 |
| 1002 |
| 1004 |
| 1003 |
+------+
rows in set (0.00 sec)
合并比較好理解,也就是將多個(gè)查詢的結(jié)果合并在一起,然后去除其中的重復(fù)記錄
如果想保存重復(fù)記錄可以使用UNION ALL語句
相關(guān)文章
mysql存儲(chǔ)過程游標(biāo)之loop循環(huán)解讀
這篇文章主要介紹了mysql存儲(chǔ)過程游標(biāo)之loop循環(huán)解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07MySQL數(shù)據(jù)庫設(shè)計(jì)之利用Python操作Schema方法詳解
這篇文章主要介紹了MySQL數(shù)據(jù)庫設(shè)計(jì)之利用Python操作Schema方法詳解,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-11-11數(shù)據(jù)庫崩潰,利用備份和日志進(jìn)行災(zāi)難恢復(fù)
我相信數(shù)據(jù)庫崩潰都不是大家所愿意看到的,但是這種情況發(fā)生時(shí)我們要采取補(bǔ)救措施,本文就是介紹了如何利用備份和日志進(jìn)行災(zāi)難恢復(fù),需要的朋友可以參考下2015-07-07mysql exists與not exists實(shí)例詳解
這篇文章主要介紹了mysql exists與not exists實(shí)例詳解的相關(guān)資料,鑒于 not exists 的效率往往要高于 not in , 所以一般情況下會(huì)使用前者替代后者,需要的朋友可以參考下2017-07-07千萬級記錄的Discuz論壇導(dǎo)致MySQL CPU 100%的優(yōu)化筆記
談到自己在解決一個(gè)擁有 60 萬條記錄的 MySQL 數(shù)據(jù)庫訪問時(shí),導(dǎo)致 MySQL CPU 占用 100% 的經(jīng)過。在解決問題完成優(yōu)化(optimize)之后,我發(fā)現(xiàn) Discuz 論壇也存在這個(gè)問題,當(dāng)時(shí)稍微提了一下2010-12-12MySQL錯(cuò)誤:You can‘t specify target table&n
在編寫MySQL的UPDATE或DELETE語句時(shí),如果子查詢中直接引用了要操作的目標(biāo)表,可能會(huì)遇到一個(gè)常見的錯(cuò)誤:You can’t specify target table ‘xxx’ for update in FROM clause,這個(gè)錯(cuò)誤讓許多開發(fā)者感到困惑,本文將深入分析其原因,并提供多種解決方案,2025-02-02