더북(TheBook)

07 | 의사컬럼

의사컬럼Pseudo-column이란 테이블의 컬럼처럼 동작하지만 실제로 테이블에 저장되지는 않는 컬럼을 말한다. SELECT 문에서는 의사컬럼을 사용할 수 있지만, 의사컬럼 값을 INSERT, UPDATE, DELETE 할 수는 없다. 2장의 ‘06.시퀀스’ 절에서 학습했던 NEXTVAL, CURRVAL도 의사컬럼의 일종이다. 대표적인 의사컬럼의 종류를 열거하면 다음과 같다.

CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF, LEVEL

계층형 쿼리에서 사용하는 의사컬럼이다. 계층형 쿼리는 7장에서 상세히 다룬다.

NEXTVAL, CURRVAL

시퀀스에서 사용하는 의사컬럼이다.

ROWNUM, ROWID

ROWNM은 쿼리에서 반환되는 각 로우들에 대한 순서 값을 나타내는 의사컬럼이다.

입력

    SELECT ROWNUM, employee_id
      FROM employees;

결과

    ROWNUM  EMPLOYEE_ID
    ------- -----------
         1          100
         2          101
         3          102
    ...
    107개의 행이 선택됨

테이블에 데이터가 많으면 SELECT만 하더라도 결과가 나올 때까지 시간이 많이 소요된다. 예를 들어, sales 테이블에 어떤 컬럼이 있는지 보고 싶어 ‘SELECT * FROM sales;’ 문을 실행하면 전체 로우가 반환되며 결과를 보기까지 시간이 오래 걸린다(물론 여러 가지 툴에서는 한 번에 몇 건만 화면에 출력되도록 하는 옵션이 있다. SQL Developer는 디폴트로 화면에 50건씩 뿌려진다). 이때 다음과 같이 ROWNUM이라는 의사컬럼을 사용하면 매우 편리하다.

입력

    SELECT ROWNUM, employee_id
      FROM employees
     WHERE ROWNUM < 5;

결과

    ROWNUM  EMPLOYEE_ID
    ------ -----------
        1         100
        2         101
        3         102
        4         103

ROWID는 테이블에 저장된 각 로우가 저장된 주소 값을 가리키는 의사컬럼이다. 각 로우를 식별하는 값이므로 ROWID는 유일한 값을 가진다.

입력

    SELECT ROWNUM, employee_id, ROWID
      FROM employees
     WHERE ROWNUM < 5;

결과

    ROWNUM EMPLOYEE_ID ROWID
    ------ ----------- -------------------
        1          100 AAASNVAAGAAAACDAAJ
        2          101 AAASNVAAGAAAACDAAK
        3          102 AAASNVAAGAAAACDAAL
        4          103 AAASNVAAGAAAACDAAM

2장에서 설명한 B-tree 인덱스는 테이블에서 인덱스 키로 잡혀 있는 컬럼과 해당 테이블 로우를 찾아가기 위한 주소 정보가 있다고 설명했는데, 이 주소 정보가 바로 ROWID다. 이 외에도 COLUMN_VALUE, OBJECT_ID, OBJECT_VALUE, XMLDATA란 의사컬럼 있는데, 현장에서 자주 사용하지 않아 이 장에서는 다루지 않겠다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.