[DB/SQLD] DECODE, CASE, ROWNUM, ROWID, WITH

1 분 소요

DECODE

decode문으로 if문을 구현할 수 있다.

SELECT DECODE(EMPNO, 1000, 'TRUE', 'FALSE')
FROM EMP;

비교문을 통해 empno가 1000이면 “TRUE”를 출력하고, 다르면 “FALSE”를 출력한다.



CASE문

case문을 이용해 if-then else-end의 프로그래밍 언어처럼 조건문을 사용할 수 있다.

SELECT CASE
WHEN EMPNO=1000 THEN 'A'
WHEN EMPNO=1001 THEN 'B'
ELSE 'C'
FROM EMP;

조건은 when구에 사용하고 then은 해당 조건이 참이면 실행되고 거짓이면 else구가 실행된다.

위 코드는 empno가 1000이면 “A”를 출력하고 1001이면 “B”를 출력한다. 그 외 경우에 “C”를 출력한다.



ROWNUM

rownum은 oracle 데이터베이스의 select문 결과에 대해서 논리적인 일련변호를 부여한다. rownum은 조회되는 행 수를 제한할 때 많이 사용된다. rownum은 화면에 데이터를 출력할 때 부여되는 논리적 순번이다. 만약 rownum을 사용해서 페이지 단위 출력을 하기 위해서는 인라인 뷰를 사용해야 한다.

인라인뷰 인라인뷰는 select문에서 from절에 사용되는 서브쿼리를 의미한다.

select * from  // main query
(select * from emp) a;  // sub query(inline view)

rownum의 값을 1,2,3,4,5,6… 같이 순차적으로 증가하는 rownum 데이터를 얻고 싶을 때 인라인뷰를 사용하는 것이다.

select *
from (select rownum list, ename 
      from emp)
where list <=5;

인라인 뷰를 사용하고 rownum에 별칭을 사용해야 한다.

select *
from ( select rownum list, ename 
       from emp)
where list between 5 and 10;

위 코드는 웹 게시판에서 많이 사용하는 select문으로 rownum과 between구를 이용해 웹 페이지 조회를 구현할 수 있다.

top구문과 limit구문 oracle은 rownum을 사용하지만, sql server는 top문을 사용하고 mysql은 limit구를 사용한다.

SELECT TOP(10) FROM EMP;

SELECT * FROM EMP LIMIT 10;



ROWID

rowid는 oracle 데이터베이스 내에서 데이터를 구분할 수 있는 유일한 값이다. rowid를 통해 데이터가 어떤 데이터 파일, 어느 블록에 저장되어 있는지 알 수 있다.

ROWID 구조

구조 길이 설명
오브젝트 번호 1~6 오브젝트 별로 유일한 값을 가지고 있으며, 해당 오브젝트가 속해 있는 값이다.
상대 파일 번호 7~9 테이블스페이스에 속해 있는 데이터 파일에 대한 상대 파일번호이다.
블록 번호 10~15 데이터 파일 내부에서 어느 블록에 데이터가 있는지 알려준다.
데이터 번호 16~18 데이터 블록에 데이터가 저장되어 있는 순서를 의미한다.
SELECT rowid, winetypename
from winetype;

위 코드로 rowid를 조회할 수 있고 모든 테이블은 rowid를 가지고 있다.



WITH구문

with 구문은 서브쿼리를 사용해 임시 테이블이나 뷰처럼 사용할 수 있는 구문이다. 서브쿼리 블록에 별칭을 지정할 수 있다. 옵티마이저는 SQL을 인라인 뷰나 임시 테이블로 판단한다.

WITH viewData AS
(SELECT * FROM EMP
 UNION ALL
 SELECT * FROM EMP
 )
 SELECT * FROM viewData WHERE EMPNO = 1000;