標籤:
所謂子查詢,就是指在一個查詢之中嵌套了其他的若干查詢,通過子查詢可以實現多表查詢,該查詢語句中可能包含IN,ANY,ALL和EXISTS等關鍵字,除此之外還可以包含比較子,子查詢經常出現在WHERE和FROM字句中。
WHERE字句中的子查詢:該位置處的子查詢一般返回單行單列,多行單列,單行多列資料記錄。
FROM字句中的子查詢:該位置處的子查詢一般返回多行多列資料記錄,可以當作一張暫存資料表。
1. 返回結果為單行單列和單行多列子查詢
當子查詢的返回結果為單行單列資料記錄時,該子查詢語句一般在主查詢語句的WHERE子句裡,通常會包含比較子(">","<","=","!="等)。
1.1 返回結果為單行單列子查詢
SELECT * FROM e_employee WHERE sal >(SELECT sal FROM t_employee WHERE ename=‘SMITH‘)
1.2 返回結果為單行多列子查詢
SELECT ename,sal,job FROM e_employee WHERE (sal,job) = (SELECT sal,job FROM t_employee WHERE ename=‘SMITH‘)
2. 返回結果為多行單列子查詢
當子查詢的返回結果為多行單列資料記錄時,該子查詢語句一般在主查詢語句的WHERE子句裡,通常會包含IN,ANY,ALL,EXISTS等關鍵字。
2.1 帶有關鍵字IN的子查詢
當主查詢語句的條件是子查詢的查詢結果時,就可以通過關鍵字IN來進行判斷,相反如果想實現主查詢的條件不是子查詢的查詢結果時,就可以通過關鍵字NOT IN來進行判斷。
SELECT * FROM t_employee WHERE deptno IN (SELECT deptno FROM t_dept)
2.2 帶有關鍵字ANY的子查詢
SELECT ename,sal FROM t_employee WHERE sal >ANY IN (SELECT sal FROM t_employee WHERE job=‘MANAGER‘)
關鍵字ANY用來表示主查詢的條件為滿足子查詢返回查詢結果中任意一條資料記錄,該關鍵字有三種匹配方式,分別如下:
=ANY:其功能與關鍵字IN一樣。
>ANY(>=ANY):比子查詢中返回資料記錄中最小的還要大於(大於等於)資料記錄。
<ANY(<=ANY):比子查詢中返回資料記錄中最大的還要大於(小於等於)資料記錄。
2.3 帶有關鍵字ALL的子查詢
SELECT ename,sal FROM t_employee WHERE sal >ALL IN (SELECT sal FROM t_employee WHERE job=‘MANAGER‘)
關鍵字ALL用來表示主查詢的條件為滿足子查詢返回查詢結果中所有資料記錄,該關鍵字有以下兩種匹配方式。
>ALL(>=ALL):比子查詢中返回資料記錄中最大的還要大於(大於等於)資料記錄。
<ALL(<=ALL):比子查詢中返回資料記錄中最小的還要大於(大於等於)資料記錄。
2.4 帶有關鍵字EXISTS的子查詢
關鍵字EXISTS是一個布爾類型,當返回結果集時為TRUE,不能返回結果集時為FALSE。查詢時EXISTS對外表採用遍曆方式逐條查詢,每次查詢都會比較EXISTS的條件陳述式,當EXISTS裡的條件陳述式返回記錄行時則條件為真,此時返回當前遍曆到的記錄;反之,如果EXISTS裡的條件陳述式不能返回記錄行,則丟棄當前遍曆到的記錄。
SELECT * FROM t_dept c WHERE NOT EXISTS (SELECT * FROM e_employee WHERE deptno=c.deptno);
3. 返回結果為多行多列子查詢
當子查詢的返回結果為多行多列資料記錄時,該子查詢語句一般會在主查詢語句的FROM子句裡,被當作一張暫存資料表的方式來處理。
mysql之子查詢