본문 바로가기

Oracle/SQL

SQL ROWNUM - 출력되는 행 제한시키기

ROWNUM( 감추는 컬럼 ), 출력되는 행 제한

앞에서 배운 ROW_NUMBER 와 비슷한 기능을 갖는 함수이다.

ROW_NUMBER 함수는 : order by 절을 반드시 사용

ROWNUM 함수는 : order by 절 없이 출력되는, 행 그대로 번호를 부여할 수 있는 shadow (감춰진) 컬럼

->  모든 테이블에 존재한다.

select rownum, empno, ename, sal
from emp;

select rownum, empno, ename, sal
from emp 
where deptno = 20;

→ 부서번호가 20 번인 사원들만 출력하면서 rownum 번호를 부여해 준다.

문제 265

select rownum, empno, ename, sal 
from emp
where deptno = 20
     and rownum =1;

→ rownum 은 첫행만 출력되고 , 두번째 행 부터는 단일행으로 출력 할 수 없다.

이유는... Rownum 특성상 , 앞서 출력된 행을 바탕으로 다음행이 출력 되기 때문에 첫행은 기본출력이 가능하지만 

           첫행이 존재하지 않는 두번째행, 두번째행이 존재하지 않는 세번째행은 출력 할 수 없다. 

만약 rownum 에서 2번을 출력하고싶다면 from 절에 서브쿼리 사용해야한다.

select * 
from (
       select rownum as 번호, empno, ename, sal
       from emp
       where deptno = 20
       ) 
where 번호 = 2;

반드시 from 절 서브쿼리 select 절 ROW에 별칭 을 써주어서

메인 쿼리 where 절에 별칭으로 입력해 주어야한다.

문제 266 : 통신사가 kt인 학생들의 이름, 나이, 통신사를 뽑고, 첫번째 행만 출력 

select ename, age, telecom
from emp14_address 
where telecom ='kt' 
     and rownum =1;

문제 267 : 통신사가 kt 인 학생들의 이름과 나이와 통신사를 출력하는데 출력되는 결과에서 두번째행 학생을 출력

select * 
from ( 
     select rownum as 번호, ename, age, lower(telecom) 
      from emp14 
      where telecom = 'kt'
      )
where 번호 = 2;

문제 : kt 통신사를 이용하는 학생 이름,나이, 통신사와 나이순대로 출력되는 번호1~ 5번째까지만 뽑으시오

select * 
from ( 
       select ename, age, lower(telecom), row_number() over (order by age desc)번호
         from emp14
         where lower(telecom) = 'kt'
         ) 
where 번호 <= 5;