msyql中子查詢IN,EXISTS,ANY,ALL,SOME,UNION介紹

1.ANY關鍵字

假設any內部的查詢語句返回的結果個數是三個,如:result1,result2,result3,那麼,mysql

select ...from ... where a > any(...);sql

->優化

select ...from ... where a > result1 or a > result2 or a > result3;spa

2.ALL關鍵字

ALL關鍵字與any關鍵字相似,只不過上面的or改爲and。即:code

select ...from ... where a > all(...);blog

->table

select ...from ... where a > result1 and a > result2 and a > result3;class

3.SOME關鍵字

some關鍵字和any關鍵字是同樣的功能。因此:效率

select ...from ... where a > some(...);select

->

select ...from ... where a > result1 or a > result2 or a > result3;

4.IN關鍵字

IN運算符用於WHERE表達式中,以列表項的形式支持多個選擇,語法以下:

  WHERE column IN (value1,value2,...)
  WHERE column NOT IN (value1,value2,...)
當 IN 前面加上 NOT運算符時,表示與 IN 相反的意思,即不在這些列表項內選擇。代碼以下:

查詢
SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B)             //查詢B表中AID的記錄
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)        //意思和上面相反
刪除
delete from articles where id in (1,2,3);                         //刪除id=1,id=2,id=3的記錄
delete from articles where id not in (1);                         //刪除id!=1的記錄

詞語IN"=ANY"的別名。所以,這兩個語句是同樣的:

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);

5.EXISTS關鍵字

MySQL EXISTS 和 NOT EXISTS 子查詢語法以下:

  SELECT ... FROM table WHERE  EXISTS (subquery)
該語法能夠理解爲:將主查詢的數據,放到子查詢中作條件驗證,根據驗證結果(TRUE 或 FALSE)來決定主查詢的數據結果是否得以保留

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);

提示:
•EXISTS (subquery) 只返回 TRUEFALSE,所以子查詢中的 SELECT * 也能夠是 SELECT 1 或其餘,官方說法是實際執行時會忽略 SELECT 清單,所以沒有區別。
•EXISTS 子查詢的實際執行過程可能通過了優化而不是咱們理解上的逐條對比,若是擔心效率問題,可進行實際檢驗以肯定是否有效率問題。
•EXISTS 子查詢每每也能夠用條件表達式、其餘子查詢或者 JOIN 來替代,何種最優須要具體問題具體分析

6.UNION關鍵字

MySQL UNION 用於把來自多個 SELECT 語句的結果組合到一個結果集合中。語法爲:

  SELECT column,... FROM table1 
  UNION [ALL]
  SELECT column,... FROM table2
  ...

在多個 SELECT 語句中,對應的列應該具備相同的字段屬性,且第一個 SELECT 語句中被使用的字段名稱也被用於結果的字段名稱

UNION 與 UNION ALL 的區別

當使用 UNION 時,MySQL 會把結果集中重複的記錄刪掉,而使用 UNION ALL ,MySQL 會把全部的記錄返回,且效率高於 UNION。

mysql> SELECT d_id FROM employee
    -> UNION
    -> SELECT d_id FROM department;
+------+
| d_id |
+------+
| 1001 |
| 1002 |
| 1004 |
| 1003 |
+------+

合併比較好理解,也就是將多個查詢的結果合併在一塊兒,而後去除其中的重複記錄,若是想保存重複記錄可使用UNION ALL語句。

相關文章
相關標籤/搜索