子查詢學習筆記1

dongyu2013發表於2013-12-25
子查詢必須包含括號
子查詢的好處
子查詢允許結構化的查詢,這樣就可以把一個查詢語句的每個部分隔開。
子查詢提供了另外一種方法來執行有些需要複雜的join和union 來實現的操作。
在許多人看來,子查詢可讀性較高。而實際上,這也是子查詢的又來。
子查詢的限制,目前使用者不能即在一個子查詢中修改一個表,又在同一個表中進行選擇,雖然這樣的操作可用於普通的delete,insert,replace和update語句中 ,但是對於子查詢不可以同時進行這樣的操作。
以下是一個常見的子查詢的比較例子,其中不能使用join來完成此類比較。表t1中的某些值與表t2中最大值相同,該子查詢可以查詢出所有這些行數。
select column1 from t1
where column1 = ( select Max(column2) from t2);
不能使用join來得到結果, 因為該例子涉及到對其中一個表進行統計。表t1中的有些行含有的值會在給定的列中出現兩次,該例子可以查詢出所有這些行。
select * from t1 as t
where 2 = ( select count(*) from t1 where t1.id=t.id);
any和some關鍵詞是相同。
如表t2為空表,以下語句為true
select * from t1 where 1 > all (select s1 from t2);
如果t2為空表,以下語句為NULL
select * from t1 where 1> (select s1 from t2);
如果t2為空表,以下語句為NULL
select * from t1 where 1 > all (select max(s1) from t2);
NOT IN 和 <>ALL 相同。
例子,每個美國員工至少處理過一個訂單的所有客戶。
SELECT customerid
FROM orders
WHERE employeeid IN
(SELECT employeeid FROM employees WHERE country = 'USA')
GROUP BY customerid
HAVING COUNT(employeeid) = 
( SELECT COUNT(*) FROM employees WHERE country = 'USA');
例子,返回每個月最後實際訂單日期發生的訂單
SELECT orderid,customerid,employeeid,orderdate
FROM orders
WHERE orderdate IN 
(SELECT MAX(orderdate) FROM orders
                               GROUP BY (DATE_FORMAT(orderdate,'%Y%mhm')))
EXISTS 二值返回
例子,查詢返回來自西班牙且發生過訂單的消費者。
SELECT customerid,companyname
FROM customers AS A
WHERE country = 'Spain'
    AND EXISTS (SELECT * FROM orders AS B 
                        WHERE A.customerid=B.customerid);
注:儘管通常不建議在SQL語句中使用*,因為可能會引起一些問題,但是在EXITS子查詢中*可以放心使用。EXISTS只關心是否存在,而不會去取各列的值。
列表中含有NULL值時,IN總是返回TRUE和UNKNOWN,所以NOT IN返回FALSE和UNKNOWN。
NOT EXISTS 總是返回TRUE和FALSE 這是和NOT IN的最大區別。














來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1064405/,如需轉載,請註明出處,否則將追究法律責任。

相關文章