原创:oracle 子查询介绍<七>

论坛 期权论坛 脚本     
匿名技术用户   2020-12-30 08:26   45   0

前几节课中我们渐渐的对oracle的知识,有了进一步的了解与掌握,随着时间的推移,在这节课程中我们来讲解SQL子查询的知识,希望通过授课中的内容对你有所帮助!

Java代码 复制代码 收藏代码
  1. 子查询概念 :当一个查询的结果是另一个查询的条件时,称之为子查询。
  2. 使用子查询注意事项:
  3. 子查询可以嵌套多层
  4. 子查询需要圆括号()括起来
  5. 子查询语法:
  6. SELECT select_list
  7. FROM table
  8. WHERE expr operator
  9. (SELECT select_list
  10. FROM table);
  11. ? 子查询 (内查询) 在主查询之前一次执行完成。
  12. ? 子查询的结果被主查询使用 (外查询)。
  13. 举例:查询员工的工资大于JONES的员工信息
  14. 分析过程如下:
  15. 首先:查询JONES的员工工资是多少 :结果2975
  16. SQL> select sal from emp where ename='JONES';
  17. 实际上我们要查询的是:薪资大于2975的员工的信息写法如下:
  18. SQL> select * from emp where sal>2975;
  19. //综合以上写出子查询的结果如下:
  20. SQL> select * from emp where sal>(select sal from emp where ename='JONES');
  21. 注意:
  22. ? 子查询要包含在括号内。
  23. ? 将子查询放在比较条件的右侧。
  24. 根据查询的结果(内部嵌套查询的结果)把子查询的类型分为单行子查询与多行子查询,
  25. 注意:
  26. ? 单行操作符对应单行子查询,多行操作符对应多行子查询。
  27. 单行操作符
  28. >、>=、 <、 <= 、<>、=
  29. 举例:
  30. //查询编号7876相同职位的员工信息 并且薪资大于编号为7521的薪资的员工信息
  31. SQL> select * from emp where job=( select job from emp where empno=7876) and sal>( select sal from emp where empno=7521);
  32. //子查询含有组函数
  33. SQL> select * from emp where sal>(select avg(nvl(sal,0)) from emp);
  34. //子查询含有having子句 查询部门的最小工资大于20号部门最小工资的部门号及最小工资数
  35. SQL> select deptno,min(sal) from emp group by deptno having min(sal)>( select min(sal) from emp where deptno=20);
  36. 备注:子查询可以返回空行 没要查询到结果是可以的。
  37. 多行子查询
  38. ? 返回多行。
  39. ? 使用多行比较操作符。
  40. 操作符如下图:
  41. 操作符 描述
  42. In 等于列表中的任何一个
  43. Any 子查询返回的任意一个值比较 相同还有some
  44. All 和子查询返回的所有值比较
  45. Exists
  46. //查询薪水小于工作岗位CLERK的任何一个薪资的员工信息 并且不包含工作岗位为CLERK的员工信息
  47. SQL> select * from emp where sal < any (select sal from emp where job='CLERK') and job<>'CLERK';
  48. //all与所有值比较 >all 代表的是大于查询结果的最大值
  49. SQL> select * from emp where sal > all (select sal from emp where job='CLERK') and job<>'CLERK';
  50. //查询岗位与部门编号为10相同的员工信息 不包含自己。
  51. SQL> select * from emp where job in(select job from emp where deptno=10) and deptno<>10;
  52. 只做思考?
  53. SQL> select * from emp where exists(select * from dept);
  54. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
  55. ----- ---------- --------- ----- ----------- --------- --------- ------
  56. 7369 SMITH CLERK 7902 1980-12-17 800.00 20
  57. 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
  58. 7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
  59. …..
  60. SQL> select * from emp where exists(select * from dept where deptno=80);
  61. EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
  62. ----- ---------- --------- ----- ----------- --------- --------- ------
  63. 以上内容版权归redarmy_chen所有,如需转载请附带出处,如有疑问请发送邮件至redarmy_chen@qq.com
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP