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란 의사컬럼 있는데, 현장에서 자주 사용하지 않아 이 장에서는 다루지 않겠다.