MySQL筆記之子查詢使用介紹
子查詢是將一個(gè)查詢語(yǔ)句嵌套在另一個(gè)查詢語(yǔ)句中
內(nèi)層查詢語(yǔ)句的查詢結(jié)果,可以為外層查詢語(yǔ)句提供查詢條件
因?yàn)樵谔囟ㄇ闆r下,一個(gè)查詢語(yǔ)句的條件需要另一個(gè)查詢語(yǔ)句來(lái)獲取
參考表: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 | 男 | 湖南長(zhǎng)沙市 |
+------+------+--------+------+------+--------------------+
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)
這里查詢出了哪些部門沒(méi)有年齡為24歲的員工,看起來(lái)有點(diǎn)復(fù)雜
此外,運(yùn)算符還有很多,這里不再贅述
帶EXISTS關(guān)鍵字的子查詢
EXISTS關(guān)鍵字表示存在。使用EXISTS關(guān)鍵字時(shí),內(nèi)層查詢語(yǔ)句不返回查詢的記錄,而是返回一個(gè)真假值,如果內(nèi)層查詢語(yǔ)句查詢到滿足條件的記錄,就返回true,否則返回false
當(dāng)返回的值為true時(shí),外層查詢語(yǔ)句將進(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)并沒(méi)有查詢到滿足條件的結(jié)果,因此返回false,外層查詢不執(zhí)行
NOT EXISTS剛好與之相反
當(dāng)然,EXISTS關(guān)鍵字可以與其他的查詢條件一起使用
條件表達(dá)式與EXISTS關(guān)鍵字之間用AND或者OR來(lái)連接
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 | 男 | 湖南長(zhǎng)沙市 |
+------+------+--------+------+------+--------------------+
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 | 男 | 湖南長(zhǎng)沙市 |
| 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í)不明白這兩條語(yǔ)句是什么意思,到時(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語(yǔ)句
相關(guān)文章
Mysql中FIND_IN_SET()和IN區(qū)別簡(jiǎn)析
這篇文章主要介紹了Mysql中FIND_IN_SET()和IN區(qū)別簡(jiǎn)析,設(shè)計(jì)實(shí)例代碼,具有一定參考價(jià)值。需要的朋友可以了解。2017-10-10
MySQL數(shù)據(jù)庫(kù)遠(yuǎn)程連接很慢的解決方案
本文給大家分享的是MySQL數(shù)據(jù)庫(kù)遠(yuǎn)程連接很慢的解決方法,簡(jiǎn)單的說(shuō)就是開啟skip-name-resolve,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下2016-12-12
MySQL通過(guò)自定義函數(shù)實(shí)現(xiàn)遞歸查詢父級(jí)ID或者子級(jí)ID
這篇文章主要介紹了MySQL通過(guò)自定義函數(shù)實(shí)現(xiàn)遞歸查詢父級(jí)ID或者子級(jí)ID,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
Linux下安裝mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz
這篇文章主要介紹了Linux下安裝mysql-5.6.12-linux-glibc2.5-x86_64.tar.gz的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09

