[DB/SQLD] DECODE, CASE, ROWNUM, ROWID, WITH
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;