-
这期视频的意思就是,我们先不要打乱行号rownum的顺序,所以只能分两次查询,括号里的查询是第一次,他把薪水按照降序排列,因为没有查询行号,所以行号这个伪列不用考虑进去,那么第二次查询才给括号里查到的数据(当成一个新的表)加上行号,就可以实现目的了查看全部
-
单行子查询与多行子查询: 只返回一条记录就叫做单行子查询,返回多条记录就叫做多行子查询。 单行子查询只能使用单行操作符,多行子查询只能使用多行操作符。 单行操作符:=,>,>=,<,<=,<> 多行操作符:IN,ANY,ALL IN等于列表中的任何一个 ANY和子查询返回的任意一个值比较 ALL和子查询返回的所有值比较查看全部
-
自己写的代码: select * from emp e,(select deptno,avg(sal) avgsal from emp group by deptno) d where e.sal>d.avgsal and e.deptno=d.deptno 老师的代码: 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);查看全部
-
行号只能使用<,<= ;不能使用>,>= 将会在分页查询中用到 所谓的TOP-N问题就是在在一个记录集中只截取前几条记录作为我们的查询结果,比如找到员工表中工资最高的前三名,这种问题就先要对子查询进行排序,排完序可以在父查询中使用rownum行号选择满足条件的前几项,注意rownum只能使用<,<= ,不能使用 >,>=。查看全部
-
select rownum,empno,ename,sal from (select * from emp order by sal desc) where rownum<=3;查看全部
-
一般不在子查询中使用排序,但在TOP-N问题中必须对子查询排序。 rownum 行号,伪列 找到员工表中工资最高的前三名 例:select rownum,empno,ename,sal from emp where rownum<=3 order by sal desc; 这样的执行结果不正确,问题在于: (1)行号永远按照默认的顺序生成 (2)行号只能使用<,<= ;不能使用>,>=查看全部
-
select * from emp where deptno=(select deptno from dept where dname='SALES'); 使用多表查询: select e.* from emp e,dept d where e.deptno=d.deptno and d.dname='SALES' ; 理论上应该尽量使用多表查询,因为上面的子查询有两个from语句,所以要对数据库访问查询两次,而下面的多表查询只访问了一次!这是理论上的结论,并没有考虑实际比如多表查询中产生的笛卡尔积的大小,具体情况还是要具体对待。查看全部
-
示例一: select * from (select empno,ename,sal from emp); 示例二: select * from (select empno,ename,sal,12*sal 年薪 from emp);查看全部
-
group by 后面不能使用子查询 例:select avg(sal) from emp group by (select deptno from emp); 执行时系统提示错误 第3行错误: ORA-22818:这里不允许出现子查询表达式查看全部
-
(1)select后面的子查询必须是一个单行子查询,即子查询结果只返回一条记录 例:select empno,ename,sal,(select job from emp where empno=7839) from emp; 注意子查询要有小括号! (2)having后面的子查询 select deptno,avg(sal) from emp group by deptno having avg(sal)> (select max(sal) from emp where deptno=30); 注意这种情况不能用where代替,因为含有组函数! (3)from后面的子查询实际上就是将子查询的结果看作一张表。 例: select * from (select empno,ename,sal from emp);查看全部
-
子查询注意的问题: 可以使用子查询的位置:where select having from; 不可以使用子查询的位置:group by; 强调:from后面的子查询; 主查询和子查询可以使用的不是同一张表; 一般不在子查询中使用排序,但在TOP-N分析问题中必须对子查询排序; 一般先执行子查询再执行子查询,但相关子查询例外; 单行子查询只能使用单行操作符,多行子查询只能使用多行操作符; 注意:子查询中是null值问题查看全部
-
自连接存在的问题: (1)自连接不适合操作大表,也就是记录多的表,原因是自连接至少有两张表参与,并进行笛卡尔全集,连接之后的记录数就是单张表记录数的平方(笛卡尔积行数是两张表行数的乘积),如果有三张表记录数就是原来的三次方,如果原来的表包含的记录数过多,连接之后的结果就会很大,所以自连接不适合操作大表。解决办法:层次查询。注意层次查询是单表查询,不存在第二张表!因为只有在一张表的情况下才不会产生笛卡尔积,才能解决这个问题。 层次查询在某些情况下可以替代自连接,本质上是单表查询。 例: select empno,ename,sal,mgr from emp //层次查询只涉及一张表 connect by prior empno=mgr //层次查询的条件不用where表示,而用connect by表示,上一层的员工号=当前曾的老板号 start with mgr is null或者start with empno=7839; //stsrt with表示从何处开始遍历查询,只有从根节点开始时才可以使用 * is null 的格式,其余节点都只能使用第二种格式。 此外层次查询的树的深度用level表示,可以在select语句中加入level就可以得到深度的查询结果,还可以对查询结果进行排序如order by 1; 比较自连接和层次查询的优劣: 自连接得到的查询结果比较直观但是不适合操作大表; 层次查询只涉及一张表,不产生笛卡尔积,但是得到的结果不够直观。 所以不同的查询语句有不同的特点,不是万能的!查看全部
-
自连接:通过别名,将一张表视为多张表。查看全部
-
select d.deptno,d.dname,count(e.empno) from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.name; 注意这样得出的结果不完全正确,因为40号部门在员工表中不存在但是在部门表中存在,为了在结果中显示40号部门,要使用外连接!外连接的作用就是把对于连接条件不成立的记录仍然包含在最后的结果中,分为左外连接和右外连接。 特别注意左外连接和右外连接的写法,位置与名字相反,符号用括号内加号表示: 左外连接where e.deptno=d.deptno(+); 右外连接where e.deptno(+)=d.deptno;查看全部
-
笛卡尔积: 笛卡尔积的列数等于各表列数相加,行数等于各表行数相乘。 为了避免笛卡尔全集,可以在where加入有效的连接条件,原因是笛卡尔全集中的记录有可能存在错误。 在实际运行环境中,应尽量避免使用笛卡尔全集。 where后的连接条件至少有n-1个,n为表的个数。查看全部
举报
0/150
提交
取消