본문 바로가기
Programming/Database

[Database] 슈도컬럼(Pseudo-Column)

by 코딩여걸 2021. 8. 20.
728x90

슈도컬럼(Pseudo-Column) 이란?

  • 가상컬럼이라고 하기도 하며 의사컬럼이라고도 한다.
  • 오라클에서는 ROWNUM이 대표적으로 가장 많이 쓰인다.

참고 : https://blog.naver.com/zeddn2/221124792747

 

[SQL] 슈도컬럼이란? PSEUDO COLUMN, 가상컬럼

슈도컬럼(PSEUDO COLUMN) 가상컬럼 ROWNUM / ROWID 슈도컬럼(Pseudo-Column)이란...

blog.naver.com


select rowid, rownum, empno, ename
from emp;

 

select * from emp;

 

-- rowid가 책의 색인(index)정보
-- where deptno = 10;
-- rownum은 테이블에 저장되어있는 순서대로 순서값을 나타냄
select rowid, rownum, empno, ename
from emp
where rownum <= 5;  -- 정상적으로 출력

where rownum <= 5; 라고 썼으므로 index가 5까지만 출력된다.

 

select rowid, rownum, empno, ename
from emp
where rownum = 5;

rowid, rownum는 emp테이블에 속해있는 컬럼이 아니다.
rownum은 emp테이블로부터 1행(레코드)씩 읽어서 화면에 출력할 때 number를 부여한다.

 

emp테이블의 1행(레코드)

where rownum = 5; 이 조건이 거짓이면 rownum값을 부여하지 않는다.

 

select rowid, rownum, empno, ename
from emp
where rownum = 1;  -- 여기에는 1만 올 수 있다.

rownum의 기본 값은 1이다.


select deptno, trunc(AVG(sal)) avg_sal
from emp
group by deptno
order by avg_sal desc;

< from 절에 서브쿼리를 사용 >

위의 값 중에서 평균 급여가 가장 높은 상위 Top2개 부서를 출력하시오 

select deptno, trunc(AVG(sal)) avg_sal
from emp
where rownum <= 2  -- 우리가 원하는 결과 출력이 안됨
group by deptno
order by avg_sal desc;

우리가 원하는 결과 출력이 안됨

< 해결방법 >

select *
from (select deptno, trunc(AVG(sal)) avg_sal
      from emp
      group by deptno
      order by avg_sal desc)
where rownum <= 2;

  • from절에 서브쿼리를 작성한 내용을 뷰 또는 인라인 뷰라고 한다.
  • 일반적으로 from 다음에는 테이블 명이 오는데 서브쿼리도 사용 가능하다.

select a.*
from (select deptno, trunc(AVG(sal)) avg_sal
      from emp
      group by deptno
      order by avg_sal desc) a
where a.rownum <= 2;  -- 오류발생(rownum은 a테이블의 소속이 아니다.)

rowid, rownum은 그냥 오라클에서 제공해주는 컬럼이므로 어떤 테이블에 소속돼있는 것이 아니다.

rownum은 어떤 테이블에 종속된 컬럼이 아니다. (오라클에서 제공해주는 슈도컬럼)

 

select a.*
from (select deptno, trunc(AVG(sal)) avg_sal
      from emp
      group by deptno
      order by avg_sal desc) a
where rownum <= 2;  -- 이렇게 쓰면 됨

이렇게 작성하면 정상적으로 출력된다.

728x90

'Programming > Database' 카테고리의 다른 글

[Database] 다중행 서브쿼리  (0) 2021.08.20
[Database] 서브쿼리  (0) 2021.08.20

댓글