메뉴 데이터의 갯수를 나눠서 페이지별로 보여주고 싶을 때는 어떻게 할까요?
SELECT COUNT(*) FROM RESTAURANT_MENU;
RESTAURANT_MENU 테이블에는 고유번호인 R_NO가 있고 (PRIMARY KEY)
SEQUENCE로 처리한 상태입니다.
R_NO로 처리하려고 보니까
SEQUENCE는 INSERT에 실패해도 올라간다는 단점이 있습니다.
메뉴 데이터는 삭제가 될 수도 있기 때문에
R_NO가 정확히 1,2,3,4, ... 가 아닙니다.
그럼 어떤 방법이 있을까요..?
ROWNUM(가상필드)이라는 것을 사용하면 됩니다.
SELECT할 때마다 자동으로 부여되는 숫자값을 ROWNUM이라고 하는데요.
ROWNUM은 3가지 특징이 있습니다.
* (전체조회)랑은 같이 사용할 수 없습니다.
ORDER BY 보다 먼저 부여가 되어야 합니다.
그리고 무조건 1번부터 조회해야합니다.
예제를 살펴보겠습니다.
메뉴 이름을 가나다 순으로 정렬해서 MENU테이블의 ROWNUM 1~3까지 전체 정보를 조회
SELECT ROWNUM, R_NO,R_NAME,R_PRICE,R_NUMBER FROM RESTAURANT_MENU ORDER BY R_NAME;
SELECT ROWNUM, R_NO,R_NAME,R_PRICE,R_NUMBER
FROM RESTAURANT_MENU
WHERE ROWNUM >= 1 AND ROWNUM <= 3;
ORDER BY R_NAME
ORDER BY전에 ROWNUM이 생성되어서
SEQUENCE를 먹인 R_NO와 같게 나와버리는데요.
우리가 의도한 바는 이름순으로 먼저 정렬한 후에
그 다음에 번호값(ROWNUM)을 주기를 원했습니다.
SELECT ROWNUM, R_NO,R_NAME,R_PRICE,R_NUMBER FROM RESTAURANT_MENU ORDER BY R_NAME;
메뉴 이름을 가나다 순으로 정렬해서 MENU테이블의 ROWNUM 1~3까지 전체 정보를 조회
SELECT ROWNUM, R_NO,R_NAME,R_PRICE,R_NUMBER
FROM RESTAURANT_MENU
ORDER BY R_NAME
WHERE ROWNUM >= 1 AND ROWNUM <= 3;
코드상 결과값이 나오게 하려면 위에 처럼
WHERE절과 ORDER BY절을 바꾸면 될텐데
문법 오류가 발생합니다.
SELECT ROWNUM, R_NO, R_NAME, R_PRICE, R_NUMBER -- 2. ROWNUM을 부여
FROM (
SELECT R_NO, R_NAME, R_PRICE, R_NUMBER
FROM RESTAURANT_MENU ORDER BY R_NAME
)
WHERE ROWNUM >= 1 AND ROWNUM <= 3;
해결 방법은 VIEW라는 것을 사용하는 것입니다.
VIEW는 FROM 부분을 테이블처럼 사용하는 것입니다. (데이터 정렬 해놓고)
이것을 Inline View라고 합니다. (인라인 뷰)
subquery가 from 절에서 사용하는 경우를 인라인 뷰라고 합니다.
하나의 쿼리문 내에서 테이블처럼 사용합니다. (테이블 대체 용도)
쿼리문 종료 후에 사라지는 임시적인 뷰입니다.
그러면 뷰 (VIEW)란 무엇일까요?
진짜 테이블이 아닌 가상의 테이블, 테이블처럼 취급하는 것입니다.
사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해서 사용합니다.
그럼 진짜 테이블 쓰면 되는데 왜 굳이 사용할까요 ?
1. 무언가 숨기고 싶은 정보가 있다면,
뷰를 생성할 때 컬럼을 빼고 생성함으로써
정보 보안에 좋습니다.
2. 기존 테이블의 구조가 변경되어도
뷰의 구조를 변경하지 않아도 됩니다.
예제 하나를 더 살펴보겠습니다.
메뉴명 가나다 순으로 정렬한 후 rownum 2~4까지 메뉴 전체 정보 조회
ROWNUM은 무조건 1번부터 조회해야하기 때문에
이때는 SELECT문을 하나 더 씌워줘서
ROWNUM의 효력을 없애줍니다.
SELECT * FROM(
SELECT ROWNUM RN, R_NO, R_NAME, R_PRICE, R_NUMBER
FROM (
SELECT R_NO, R_NAME, R_PRICE, R_NUMBER
FROM RESTAURANT_MENU ORDER BY R_NAME
)
)
WHERE RN BETWEEN 2 AND 4;
ROWNUM의 효력(특징)은 가장 상단에 위치한 VIEW에 대해서만
작동하기 때문에 1이 아닌 ROWNUM에 접근할 수 있게 됩니다.
SEQUENCE의 단점을 보완할 수 있는 ROWNUMBER와
가상의 공간인 VIEW 테이블에 대해서 알아봤습니다.
'Database > 이론' 카테고리의 다른 글
[DB] 계층형 쿼리 (0) | 2025.01.03 |
---|---|
[DB] JOIN 연산의 종류 (0) | 2025.01.03 |
[DB] Join (0) | 2025.01.02 |
[DB] 서브쿼리 (1) | 2025.01.02 |
[DB] 집합연산자 (2) | 2024.12.27 |