子查詢是將一個查詢語句嵌套在另一個查詢語句中
內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件
因為在特定情況下,一個查詢語句的條件需要另一個查詢語句來擷取
參考表:employee
參考表:department
帶IN關鍵字的子查詢
mysql> SELECT * FROM employee -> WHERE d_id IN -> (SELECT d_id FROM department);+------+------+--------+------+------+--------------------+| num | d_id | name | age | sex | homeaddr |+------+------+--------+------+------+--------------------+| 1 | 1001 | 張三 | 26 | 男 | 北京市海澱區 || 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區 || 3 | 1002 | 王五 | 25 | 男 | 湖南長沙市 |+------+------+--------+------+------+--------------------+3 rows in set (0.00 sec)
此處首先查詢出department表中所有d_id欄位的資訊,並將結果作為條件
接著查詢employee表中以d_id為條件的所有欄位資訊
NOT IN的效果與上面剛好相反
帶比較子的子查詢
mysql> SELECT d_id, d_name FROM department -> WHERE d_id!= -> (SELECT d_id FROM employee WHERE age=24);+------+-----------+| d_id | d_name |+------+-----------+| 1002 | 生產部 || 1003 | 銷售部 |+------+-----------+2 rows in set (0.00 sec)
這裡查詢出了哪些部門沒有年齡為24歲的員工,看起來有點複雜
此外,運算子還有很多,這裡不再贅述
帶EXISTS關鍵字的子查詢
EXISTS關鍵字表示存在。使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄,而是返回一個真假值,如果內層查詢語句查詢到滿足條件的記錄,就返回true,否則返回false
當返回的值為true時,外層查詢語句將進行查詢,否則不進行查詢
mysql> SELECT * FROM employee -> WHERE EXISTS -> (SELECT d_name FROM department WHERE d_id=1004);Empty set (0.00 sec)
此處內層迴圈並沒有查詢到滿足條件的結果,因此返回false,外層查詢不執行
NOT EXISTS剛好與之相反
當然,EXISTS關鍵字可以與其他的查詢條件一起使用
條件運算式與EXISTS關鍵字之間用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 | 男 | 北京市海澱區 || 3 | 1002 | 王五 | 25 | 男 | 湖南長沙市 |+------+------+--------+------+------+--------------------+2 rows in set (0.00 sec)
帶ANY關鍵字的子查詢
ANY關鍵字表示滿足其中任一條件
mysql> SELECT * FROM employee -> WHERE d_id!=ANY -> (SELECT d_id FROM department);+------+------+--------+------+------+--------------------+| num | d_id | name | age | sex | homeaddr |+------+------+--------+------+------+--------------------+| 1 | 1001 | 張三 | 26 | 男 | 北京市海澱區 || 2 | 1001 | 李四 | 24 | 女 | 北京市昌平區 || 3 | 1002 | 王五 | 25 | 男 | 湖南長沙市 || 4 | 1004 | Aric | 15 | 男 | England |+------+------+--------+------+------+--------------------+4 rows in set (0.00 sec)
帶ALL關鍵字的子查詢
ALL關鍵字表示滿足其中所有條件
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 |+------+------+------+------+------+----------+1 row in set (0.00 sec)
暫時不明白這兩條語句是什麼意思,到時候再補上
UNION合并查詢結果
mysql> SELECT d_id FROM employee -> UNION -> SELECT d_id FROM department;+------+| d_id |+------+| 1001 || 1002 || 1004 || 1003 |+------+4 rows in set (0.00 sec)
合并比較好理解,也就是將多個查詢的結果合并在一起,然後去除其中的重複記錄
如果想儲存重複記錄可以使用UNION ALL語句