行号rownum问题,以及相关子查询

这篇博客探讨了SQL中的行号rownum用法,包括行号的生成顺序、限制条件及其在查询中的应用。同时,介绍了如何利用子查询进行平均薪资比较和相关子查询的操作,展示了如何通过wm_concat实现行转列的功能,并通过实例展示了统计1981年雇佣员工数量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQL> –第一题 行号 rownum(伪列)
SQL> select rownum,empno,ename,sal
2 from emp;

ROWNUM      EMPNO ENAME        SAL                                                                                  

     1       7369 SMITH        800                                                                                  
     2       7499 ALLEN       1600                                                                                  
     3       7521 WARD        1250                                                                                  
     4       7566 JONES       2975                                                                                  
     5       7654 MARTIN      1250                                                                                  
     6       7698 BLAKE       2850                                                                                  
     7       7782 CLARK       2450                                                                                  
     8       7788 SCOTT       3000                                                                                  
     9       7839 KING        5000                                                                                  
    10       7844 TURNER      1500                                                                                  
    11       7876 ADAMS       1100                                                                                  

ROWNUM      EMPNO ENAME        SAL                                                                                  

    12       7900 JAMES        950                                                                                  
    13       7902 FORD        3000                                                                                  
    14       7934 MILLER      1300                                                                                  

已选择14行。

SQL> select rownum,empno,ename,sal
2 from emp
3 where rownum<=3
4 order by sal desc;

ROWNUM      EMPNO ENAME        SAL                                                                                  

     2       7499 ALLEN       1600                                                                                  
     3       7521 WARD        1250                                                                                  
     1       7369 SMITH        800                                                                                  

SQL> /*
SQL> 注意的问题:
SQL> 1. 行号永远按照默认的顺序生成
SQL> 2. 行号只能使用< <=,不能使用> >=
SQL> */
SQL> select rownum,empno,ename,sal
2 from emp
3 order by sal desc;

ROWNUM      EMPNO ENAME        SAL                                                                                  

     9       7839 KING        5000                                                                                  
    13       7902 FORD        3000                                                                                  
     8       7788 SCOTT       3000                                                                                  
     4       7566 JONES       2975                                                                                  
     6       7698 BLAKE       2850                                                                                  
     7       7782 CLARK       2450                                                                                  
     2       7499 ALLEN       1600                                                                                  
    10       7844 TURNER      1500                                                                                  
    14       7934 MILLER      1300                                                                                  
     3       7521 WARD        1250                                                                                  
     5       7654 MARTIN      1250                                                                                  

ROWNUM      EMPNO ENAME        SAL                                                                                  

    11       7876 ADAMS       1100                                                                                  
    12       7900 JAMES        950                                                                                  
     1       7369 SMITH        800                                                                                  

已选择14行。

SQL> select rownum,empno,ename,sal
2 from emp
3 where rownum>=5 and rownum<=8;

未选定行

SQL> –rownum永远从1开始
SQL> host cls

SQL> –第一题
SQL> select rownum,empno,ename,sal
2 from (select * from emp order by sal desc)
3 where rownum<=3;

ROWNUM      EMPNO ENAME        SAL                                                                                  

     1       7839 KING        5000                                                                                  
     2       7788 SCOTT       3000                                                                                  
     3       7902 FORD        3000                                                                                  

SQL> select *
2 from (select rownum r,e1.*
3 from (select * from emp order by sal) e1
4 where rownum <=8
5 )
6 where r >=5;

     R      EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO                        

     5       7654 MARTIN     SALESMAN        7698 28-9月 -81      1250       1400         30                        
     6       7934 MILLER     CLERK           7782 23-1月 -82      1300                    10                        
     7       7844 TURNER     SALESMAN        7698 08-9月 -81      1500          0         30                        
     8       7499 ALLEN      SALESMAN        7698 20-2月 -81      1600        300         30                        

SQL> host cls

SQL> –第二题
SQL> select empno,ename,sal,avgsal
2 from emp e, (select deptno,avg(sal) avgsal from emp group deptno) d
3 where e.deptno=d.deptno and e.sal>d.avgsal;
from emp e, (select deptno,avg(sal) avgsal from emp group deptno) d
*
第 2 行出现错误:
ORA-00924: 缺失 BY 关键字

SQL> ed
已写入 file afiedt.buf

1 select empno,ename,sal,avgsal
2 from emp e, (select deptno,avg(sal) avgsal from emp group by deptno) d
3* where e.deptno=d.deptno and e.sal>d.avgsal
SQL> /

 EMPNO ENAME        SAL     AVGSAL                                                                                  

  7698 BLAKE       2850 1566.66667                                                                                  
  7499 ALLEN       1600 1566.66667                                                                                  
  7902 FORD        3000       2175                                                                                  
  7788 SCOTT       3000       2175                                                                                  
  7566 JONES       2975       2175                                                                                  
  7839 KING        5000 2916.66667                                                                                  

已选择6行。

SQL> –相关子查询
SQL> – : 将主查询中的某个值作为参数传递给子查询
SQL> select empno,ename,sal,(select avg(sal) from emp where deptno=e.deptno) avgsal
2 from emp e
3 where sal > (select avg(sal) from emp where deptno=e.deptno);

 EMPNO ENAME        SAL     AVGSAL                                                                                  

  7499 ALLEN       1600 1566.66667                                                                                  
  7566 JONES       2975       2175                                                                                  
  7698 BLAKE       2850 1566.66667                                                                                  
  7788 SCOTT       3000       2175                                                                                  
  7839 KING        5000 2916.66667                                                                                  
  7902 FORD        3000       2175                                                                                  

已选择6行。

SQL> host cls

SQL> –wm_concat 行转列 (组函数)
SQL> select deptno,wm_concat(ename) names
2 from emp
3 group by deptno;

DEPTNO

NAMES

    10                                                                                                              

CLARK,KING,MILLER

    20                                                                                                              

SMITH,FORD,ADAMS,SCOTT,JONES

    30                                                                                                              

ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD

SQL> set linesize 150
SQL> col deptno for 99
SQL> /

DEPTNO

NAMES

10                                                                                                                                                

CLARK,KING,MILLER

20                                                                                                                                                

SMITH,FORD,ADAMS,SCOTT,JONES

30                                                                                                                                                

ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD

SQL> col names for a50
SQL> select deptno,wm_concat(ename) names
2 from emp
3 group by deptno;

DEPTNO NAMES


10 CLARK,KING,MILLER                                                                                                                              
20 SMITH,FORD,ADAMS,SCOTT,JONES                                                                                                                   
30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD                                                                                                           

SQL> host cls

SQL> –第三题
SQL> –81年为例
SQL> select hiredate from emp;

HIREDATE

17-12月-80
20-2月 -81
22-2月 -81
02-4月 -81
28-9月 -81
01-5月 -81
09-6月 -81
13-7月 -87
17-11月-81
08-9月 -81
13-7月 -87

HIREDATE

03-12月-81
03-12月-81
23-1月 -82

已选择14行。

SQL> /*
SQL> HIREDATE count81=0
SQL> ———————-
SQL> 17-12月-80 0
SQL> 20-2月 -81 1
SQL> 22-2月 -81 1
SQL> 02-4月 -81 1
SQL> 28-9月 -81 1
SQL> 01-5月 -81 1
SQL> 09-6月 -81 1
SQL> 13-7月 -87 0
SQL> 17-11月-81 1
SQL> 08-9月 -81 1
SQL> 13-7月 -87 0
SQL> 03-12月-81 1
SQL> 03-12月-81 1
SQL> 23-1月 -82 0
SQL> =========================
SQL> 10
SQL>
SQL> sum(if hiredate=1981 then 1 else 0)
SQL> */
SQL> spool off

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值