子查詢學習筆記1
子查詢必須包含括號。
子查詢的好處:
子查詢允許結構化的查詢,這樣就可以把一個查詢語句的每個部分隔開。
子查詢提供了另外一種方法來執行有些需要複雜的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的最大區別。
子查詢的好處:
子查詢允許結構化的查詢,這樣就可以把一個查詢語句的每個部分隔開。
子查詢提供了另外一種方法來執行有些需要複雜的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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MYSQL學習筆記26: 多表查詢|子查詢MySql筆記
- MYSQL學習筆記25: 多表查詢(子查詢)[標量子查詢,列子查詢]MySql筆記
- 關於SQLServer2005的學習筆記——子查詢SQLServer筆記
- (MySQL學習筆記)分頁查詢MySql筆記
- oracle學習筆記(十一) 高階查詢Oracle筆記
- MySQL必知必會 學習筆記 第十四章 使用子查詢MySql筆記
- mysql,where條件查詢等學習筆記MySql筆記
- 資料庫學習筆記之查詢表資料庫筆記
- Oracle學習筆記整理之日期查詢篇Oracle筆記
- MYSQL學習筆記24: 多表查詢(聯合查詢,Union, Union All)MySql筆記
- ES[7.6.x]學習筆記(十)聚合查詢筆記
- MYSQL學習筆記6: DQL條件查詢(where)MySql筆記
- MYSQL學習筆記8: DQL分組查詢(group by)MySql筆記
- 資料庫學習(五)子查詢資料庫
- 學習筆記1筆記
- 學習筆記-1筆記
- 第一個完整的spring查詢功能學習筆記【Spring工程學習筆記(二)】Spring筆記
- Mybatis學習筆記 3:Mybatis 多種條件查詢MyBatis筆記
- MYSQL學習筆記11: DQL查詢執行順序MySql筆記
- SQL筆記之 子查詢080812SQL筆記
- swift學習筆記《1》Swift筆記
- Vue學習筆記1Vue筆記
- Numpy學習筆記 1筆記
- HTML學習筆記1HTML筆記
- flex:1學習筆記Flex筆記
- Numpy學習筆記(1)筆記
- SLAM學習筆記(1)SLAM筆記
- Oracle學習筆記1Oracle筆記
- mysql學習筆記-1MySql筆記
- Zynq學習筆記(1)筆記
- scapy學習筆記(1)筆記
- Git—學習筆記1Git筆記
- perl學習筆記1筆記
- Oracle學習筆記-1Oracle筆記
- git學習筆記 1Git筆記
- HTML學習筆記(1)HTML筆記
- git學習筆記1Git筆記
- golang 學習筆記1Golang筆記