MySQL中子查詢IN,EXISTS,ANY,ALL,SOME,UNION介紹
1.ANY關鍵字
假設any內部的查詢語句返回的結果個數是三個,如:result1,result2,result3,那麽,
select ...from ... where a > any(...);
->
select ...from ... where a > result1 or a > result2 or a > result3;
2.ALL關鍵字
ALL關鍵字與any關鍵字類似,只不過上面的or改成and。即:
select ...from ... where a > all(...);
->
select ...from ... where a > result1 and a > result2 and a > result3;
3.SOME關鍵字
some關鍵字和any關鍵字是一樣的功能。所以:
select ...from ... where a > some(...);
->
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) 只返回 TRUE 或 FALSE,因此子查詢中的 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語句。
MySQL中子查詢IN,EXISTS,ANY,ALL,SOME,UNION介紹