-
案例一:分页查询显示员工信息:显示员工号,姓名,月薪
--每页显示四条记录
--显示第二页的员工
--按照月薪降序排列
select empno,ename,sal from emp order by sal desc;
--rownum 行号(永远从1开始,所以不能使用>,>=),只能使用<,<=,不能使用>,>=
--r是e2表的第一列,不是伪列行号的值;e1表rownum行号与e2表rownum字段重名,e2表 rownum并不是真正意义上的行号,所以e2表的rownum字段可以使用 >= 5
查看全部 -
相关子查询:将主查询中的值作为参数传递给子查询
例:找到员工表中薪水大于本部门平均薪水的员工
1、 select empno,ename,sal,c.avgsal
from emp e
where sal> (select avg(sal) from emp where deptno=e.deptno) c;
2、
select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
from emp e
where sal> (select avg(sal) from emp where deptno=e.deptno);
查看全部 -
(3)可以使用子查询的位置:where,select,having,from :
where后面的子查询中不能有分组函数
having后面的子查询中可以有分组函数
select后面的子查询得到的结果必须是单条记录
from后面的子查询是把子查询的内容当作一个新表
查看全部 -
层次查询:
自连接存在的问题:
(1)自连接不适合操作大表,也就是记录多的表,原因是自连接至少有两张表参与,并进行笛卡尔全集,连接之后的记录数就是单张表记录数的平方(笛卡尔积行数是两张表行数的乘积),如果有三张表记录数就是原来的三次方,如果原来的表包含的记录数过多,连接之后的结果就会很大,所以自连接不适合操作大表。解决办法:层次查询。注意层次查询是单表查询,不存在第二张表!因为只有在一张表的情况下才不会产生笛卡尔积,才能解决这个问题。
层次查询在某些情况下可以替代自连接,本质上是单表查询。
例: select empno,ename,sal,mgr from emp
//层次查询只涉及一张表
connect by prior empno=mgr
//层次查询的条件不用where表示,而用connect by表示上下层关系,上一层的员工号=当前这层的老板号,关键字prior表示相邻两层中的上一层。
start with mgr is null或者start with empno=7839;
//stsrt with表示起始条件,从何处开始遍历查询,只有从根节点开始时才可以使用start with..... is null 的格式,其余节点都只能使用第二种格式。
此外层次查询的树的深度用level表示,可以在select语句中加入level就可以得到深度的查询结果,还可以对查询结果进行排序如order by 1;
比较自连接和层次查询的优劣: 自连接得到的查询结果比较直观,但是不适合操作大表; 层次查询只涉及一张表单表查询,不会产生笛卡尔积,但是得到的结果不够直观。 所以不同的查询语句有不同的特点,不是万能的!
查看全部
举报