ITPub博客

首页 > 数据库 > Oracle > 使用子查询

使用子查询

原创 Oracle 作者:brj880719 时间:2017-09-27 10:10:31 0 删除 编辑

一、语法

  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博客 ” ,链接:https://blog.itpub.net/24851054/viewspace-2145482/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 使用集合运算符
请登录后发表评论 登录
全部评论

注册时间:2014-12-06

  • 博文量
    75
  • 访问量
    67554