使用子查詢

brj880719發表於2017-09-27

一、語法

  1. SELECT SELECT_LIST
  2.   FROM TABLE
  3.  WHERE EXPR OPERATOR (SELECT SELECT_LIST FROM TABLE);
子查詢(內查詢)在主查詢(外查詢)之前執行。
主查詢使用子查詢結果。

二、單行子查詢

WHERE子句中使用單行子查詢時,可以使用單行比較運算子(=,>,>=,<,<=,<>),將子查詢的返回結果當做單一數值來使用。
需要小心的是子查詢返回的結果的不確定,即返回空值或多值。具體分為三種情況:
1、返回單行:即為單行子查詢。
2、未返回任何行:如果子查詢未返回任何行(相當於返回NULL),則主查詢將不再執行,所以主查詢也不會返回任何結果。
3、返回多行:是多行子查詢,此時不允許使用單行比較運算子,否則出錯。

三、多行子查詢

在WHERE子句中使用多行子查詢時,可以使用多行比較運算子(IN,ALL,ANY),將子查詢的返回結果當做數值集合來使用。其中,ALL和ANY運算子必須與單行比較運算子(=,>,>=,<,<=,<>)結合使用。例如WHERE sal>ALL(子查詢)。

1、IN:等於任何一個
2、ALL:和子查詢返回的所有值比較。例如:sal>ALL(1,2,3)等價於sal>3,即大於所有。
3、ANY:和子查詢返回的任意一個值比較。例如:sal>ANY(1,2,3)等價於sal>1,即大於任意一個就可以。
4、EXISTS:判斷子查詢是否有返回結果(不關心具體行數和內容),如果返回則為TRUE,否則為FALSE。(常用於相關子查詢)

四、例子

  1. --單行子查詢
  2. --1.如何查得所有比“CLARK”工資高的員工的資訊
  3. --普通查詢
  4. SELECT ENAME, SAL FROM EMP WHERE ENAME = 'CLARK';
  5. SELECT * FROM EMP WHERE SAL > 2450;

  6. --子查詢
  7. SELECT * FROM EMP WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'CLARK');


  8. --2.查詢工資高於平均工資的僱員名字和工資
  9. SELECT ENAME, SAL FROM EMP WHERE SAL > (SELECT AVG(SAL) FROM EMP);



  10. --多行子查詢
  11. --any:查詢工資低於任何一個“CLERK”的工資的僱員資訊。
  12. select *
  13. from emp
  14. where sal < any(
  15.       select sal from emp where job='CLERK'
  16. );


  17. --all:查詢工資比所有的“SALESMAN”都高的僱員的編號、名字和工資。
  18. select empno, ename, sal
  19. from emp
  20. where sal>all(
  21.       select sal
  22.       from emp
  23.       where job='SALESMAN'
  24. )
  25.  
  26. --in:查詢部門20中職務同部門10的僱員一樣的僱員資訊。
  27. select *
  28. from emp
  29. where job in(
  30.       select job
  31.       from emp
  32.       where deptno=10
  33. ) and deptno=20;

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

相關文章