子查詢是將一個查詢語句嵌套在另一個查詢語句中
內(nèi)層查詢語句的查詢結(jié)果,可以為外層查詢語句提供查詢條件
因為在特定情況下,一個查詢語句的條件需要另一個查詢語句來獲取
參考表:employee

參考表:department

復(fù)制代碼 代碼如下:
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)
接著查詢employee表中以d_id為條件的所有字段信息
NOT IN的效果與上面剛好相反
帶比較運算符的子查詢
復(fù)制代碼 代碼如下:
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)
此外,運算符還有很多,這里不再贅述
帶EXISTS關(guān)鍵字的子查詢
EXISTS關(guān)鍵字表示存在。使用EXISTS關(guān)鍵字時,內(nèi)層查詢語句不返回查詢的記錄,而是返回一個真假值,如果內(nèi)層查詢語句查詢到滿足條件的記錄,就返回true,否則返回false
當(dāng)返回的值為true時,外層查詢語句將進行查詢,否則不進行查詢
復(fù)制代碼 代碼如下:
mysql> SELECT * FROM employee
    -> WHERE EXISTS
    -> (SELECT d_name FROM department WHERE d_id=1004);
Empty set (0.00 sec)
NOT EXISTS剛好與之相反
當(dāng)然,EXISTS關(guān)鍵字可以與其他的查詢條件一起使用
條件表達式與EXISTS關(guān)鍵字之間用AND或者OR來連接
復(fù)制代碼 代碼如下:
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)鍵字表示滿足其中任一條件
復(fù)制代碼 代碼如下:
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)鍵字表示滿足其中所有條件
復(fù)制代碼 代碼如下:
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)
UNION合并查詢結(jié)果
復(fù)制代碼 代碼如下:
mysql> SELECT d_id FROM employee
    -> UNION
    -> SELECT d_id FROM department;
+------+
| d_id |
+------+
| 1001 |
| 1002 |
| 1004 |
| 1003 |
+------+
 rows in set (0.00 sec)
如果想保存重復(fù)記錄可以使用UNION ALL語句
新聞熱點
疑難解答
圖片精選