MySQL筆記之子查詢使用介紹_MySQL教程

      編輯Tag賺U幣

      推薦:MySQL筆記之觸發器的應用
      觸發器是由事件來觸發某個操作,這些事件包括INSERT語句,UPDATE語句和DELETE語句

      子查詢是將一個查詢語句嵌套在另一個查詢語句中

      內層查詢語句的查詢結果,可以為外層查詢語句提供查詢條件

      因為在特定情況下,一個查詢語句的條件需要另一個查詢語句來獲取

      參考表:employee

       

      參考表:department

      帶IN關鍵字的子查詢
      復制代碼 代碼如下:www.wf0088.com

      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 | 男 | 湖南長沙市 |
      +------+------+--------+------+------+--------------------+
      rows in set (0.00 sec)

      此處首先查詢出department表中所有d_id字段的信息,并將結果作為條件

      接著查詢employee表中以d_id為條件的所有字段信息

      NOT IN的效果與上面剛好相反

      帶比較運算符的子查詢

      復制代碼 代碼如下:www.wf0088.com

      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 | 銷售部 |
      +------+-----------+
      rows in set (0.00 sec)

      這里查詢出了哪些部門沒有年齡為24歲的員工,看起來有點復雜

       

      此外,運算符還有很多,這里不再贅述


      帶EXISTS關鍵字的子查詢

      EXISTS關鍵字表示存在。使用EXISTS關鍵字時,內層查詢語句不返回查詢的記錄,而是返回一個真假值,如果內層查詢語句查詢到滿足條件的記錄,就返回true,否則返回false

      當返回的值為true時,外層查詢語句將進行查詢,否則不進行查詢

      復制代碼 代碼如下:www.wf0088.com

      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來連接

      復制代碼 代碼如下:www.wf0088.com

      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 | 男 | 湖南長沙市 |
      +------+------+--------+------+------+--------------------+
      rows in set (0.00 sec)

       

      帶ANY關鍵字的子查詢

      ANY關鍵字表示滿足其中任一條件

      復制代碼 代碼如下:www.wf0088.com

      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 |
      +------+------+--------+------+------+--------------------+
      rows in set (0.00 sec)

       

      帶ALL關鍵字的子查詢

      ALL關鍵字表示滿足其中所有條件

      復制代碼 代碼如下:www.wf0088.com

      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合并查詢結果

      復制代碼 代碼如下:www.wf0088.com

      mysql> SELECT d_id FROM employee
      -> UNION
      -> SELECT d_id FROM department;
      +------+
      | d_id |
      +------+
      | 1001 |
      | 1002 |
      | 1004 |
      | 1003 |
      +------+
      rows in set (0.00 sec)

      合并比較好理解,也就是將多個查詢的結果合并在一起,然后去除其中的重復記錄

       

      如果想保存重復記錄可以使用UNION ALL語句

      分享:MySQL筆記之視圖的使用詳解
      使用視圖的大部分情況是為了保障數據安全性,提高查詢效率

      來源:模板無憂//所屬分類:MySQL教程/更新時間:2013-05-04
      相關MySQL教程