Oracle学习笔记3—子查询/集合

来源:互联网 发布:大数据应用系统架构 编辑:程序博客网 时间:2024/06/05 02:40

接上一篇

1.相关子查询
与普通子查询的区别:先执行主查询,再执行子查询

执行过程:执行主查询,然后从查询出来的数据逐条的放入子查询的语句中进行查询,然后找出符合主查询条件的数据。(个人理解+总结)

例:查询哪些员工的工资大于其所在部门的平均工资,显示:last_name,department_id,salary

SELECT LAST_NAME,DEPARTMENT_ID,SALARYFROM EMPLOYEES EWHERE SALARY>(SELECT AVG(SALARY)              FROM EMPLOYEES          WHERE DEPARTMENT_ID=E.DEPARTMENT_ID);

分析执行过程:
1.首先执行主查询,即:

SELECT LAST_NAME,DEPARTMENT_ID,SALARYFROM EMPLOYEES E

结果如下:
这里写图片描述
2.将查询出来的结果逐条放入子查询中;
这里写图片描述
当选择第一条数据时,根据子查询的语义,找出department_id=90的平均工资,即:

SELECT AVG(SALARY)FROM EMPLOYEESWHERE DEPARTMENT_ID=90;

子查询结果为:
这里写图片描述

3.子查询结果出来后,在进行根据主查询where条件进行比较,找出符合条件的数据,即:
SALARY(此时是24000)>AVG(SALARY) (此时是19333.3333),
符合条件则保留、显示。
4.循环执行1-3步骤,直到主查询中所有数据项都执行了1-3的步骤。

这里写图片描述
每一条都执行上图的操作顺序。
———————————————————————————————————————————————
这里写图片描述
上图的标记也是相关子查询和普通子查询的不同之处。

2.集合运算:并集,交集,补集

(1)并集:UNION/UNION ALL

  • 集合运算时,各个集合中列的个数与类型的顺序必须保持一致。
  • 集合运算时,第一个集合可以决定列的别名。
  • 集合运算时,最后一个集合可以决定排序规则。
  • UNION:自动去重复值
  • UNION ALL:不去重复值,在不考虑重复值的情况下,建议使用UNION ALL,效率高。

(2)交集:INTERSECT
查询连个集合的共有的数据。

(3)补集:MINUS

例:查询employees表中收入最高的6-10员工的last_name,salary

SELECT LAST_NAME,SALARYFROM (SELECT LAST_NAME,SALARY      FROM EMPLOYEES      ORDER BY SALARY DESC)WHERE ROWNUM<=10MINUSSELECT LAST_NAME,SALARYFROM (SELECT LAST_NAME,SALARY      FROM EMPLOYEES      ORDER BY SALARY DESC)WHERE ROWNUM<=5ORDER BY 2 DESC;

3.三个序列函数

1.ROW_NUMBER() OVER(ORDER BY)——从1开始,为每一条分组记录返回一个数字;
2.RANK() OVER(ORDER BY)——Rank 是在每个分组内部进行排名的;
3.DENSE_RANK() OVER(ORDER BY)——连续排序,但是显示并列的排序。

例:

SELECT ROW_NUMBER() OVER(ORDER BY SALARY DESC) AS 名次1,       RANK() OVER(ORDER BY SALARY DESC) AS 名次2,       DENSE_RANK() OVER(ORDER BY SALARY DESC) AS 名次3,       LAST_NAME,SALARYFROM EMPLOYEES;

这里写图片描述

注意红色方框中的数据

原创粉丝点击