子查询

子查询子查询

 
子查询遵循的原则
1.子查询放在园括号中(),优先父查询被执行
2.一般无需对子查询的结果进行排序
 
非相关子查询
子查询仅执行一次,子查询返回的结果集可以与父查询中每一行进行比较。
 
按返回结果划分
1. 单行单列子查询,通常与比较预算符=,>,<,!=,<=,>=联合使用来比较运算
2.多行单列子查询返回单列多行数据时,必须使用特定的关键字any,all
子查询
 1 --子查询: sql语句内的另外一条select语句,也曾为内查询或内select 查询
 2 --任何在 select、insert、update或delete命令中允许表达式的地方都
 3 --在emp表中查询部门名称(dname)为“RESEARCH”的员工信息;
 4 select empno,ename,job from emp where deptno=(select deptno from dept where dname ='RESEARCH' );
 5 --多表连接的方式
 6 select empno,ename,job from emp join dept on emp.deptno=dept.deptno
 7 where dept.dname='RESEARCH';
 8 --相对于多表关联查询,子查询的使用更加灵活、功能更强,而且更容易理解
 9 --但是多表连接的效率要高于子查询;
10 --子查询语句
11 select deptno from dept
12 where dname ='RESEARCH'
13 --外查询语句
14 select  empno,ename,job from emp;
15 --一般情况下,外查询语句检索一行,子查询语句需要检索一遍数据,然后判断外查询语句的条件是否满足。
16 --如果条件满足,将检索的数据添加的结果集中,不满足则检索下一行的数据,所以说子查询相对于关联查询要更慢一些;
17 --(1)子查询必须用括号“()”括起来。(2)子查询不能包括ORDER BY子句。(3)子查询允许嵌套多层,但不能超过255层。
18 --(1)单行子查询 (2)多行子查询(3)关联子查询
19 --单行子查询 :查询emp表中既不是最高工资,也不是最低工资的员工信息;
20 --子查询返回的行数据
21 select empno,ename,sal from emp where sal >(select min(sal) from emp)
22 and sal <(select max(sal) from emp);
23 --多行子查询:查询不是销售部 的员工信息    (in,any,all)
24 --子查询返回的是多行的数据
25 select empno,ename,job from emp where deptno in(select deptno from dept where dname <>'SALES');
26 --查询工资大于部门编号为10 的任意一个员工即可的其他部门的员工信息
27 select deptno,ename,sal from emp where sal >any (select sal from emp where deptno =10) and deptno<>10;
28 --查询工资大于部门编号为30的所有员工的工资信息
29 select deptno,ename,sal from emp where sal>all (select sal from emp where deptno =30);

 子查询子查询

--相关子查询
当一个子查询引用了父查询中的一个或多个列时,这种查询称为相关子查询
--检索工资大于(同职位的平均工资)的员工信息
select empno,ename,sal from emp f
where sal>(select avg(sal) from emp where job = f.job)order by job;
 
oracle group by中rollup和cube的区别: 
Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是ROLLUP(A, B, C)的话, 
首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。 
如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C), 
最后对全表进行GROUP BY操作。