SELECT * FROM NOTICE;과 같은 쿼리문을 실행하게 되면
NOTICE의 테이블의 모든 컬럼명과 레코드를 조회한다.
그렇다면 우리가 페이지를 나눠서 칼럼명을 조회하고 싶다면 어떻게 해야할까?
이를테면,
1번 레코드부터 10번 레코드 까지는 1페이지에
11번 레코드부터 20번 레코드느 2페이지에
식이 의외로 간단하다.
SELECT ROWNUM,NOTICE.* FROM NOTICE WHERE ROWNUM BETWEEN 0 AND 10;
이미지와 같이 레코드명에 숫자가 붙어 출력된다.
그러나 SELECT ROWNUM,NOTICE.* FROM NOTICE WHERE ROWNUM BETWEEN 10 AND 20;
위의 식은 불가능하다.
왜 안될까?
이를테면 ROWNUM>5의 조건을 WHERE절에 걸게되면
처음 레코드가 만족하지않고 다음 레코드가 실행
다음 레코드도 만족하지 않기 때문에 다음 레코드가 실행의 과정을 반복하게 되면서 원하는 결과가 나오지 않는다.
해결방법 :
FROM 절 뒤에는 테이블만 가능한 것이 아니라, 격자형의 데이터가 오면 실행이 가능하다.
사칙연산처럼 SELECT * FROM NOTICE를 먼저 연산(서브쿼리) 해주어서 격자형 데이터를 만들어주고
그 밖에 다시 SELECT * FROM 를 실행한다.
그럼 SELECT* FROM(SELECT * FROM NOTICE); 위와 같은 식이 완성된다.
그렇게되면 서브쿼리에서 실행된
위와같은 데이터를 기준으로 다시 SELECT* FROM이 실행되는 것이다.
이렇게되면 SELECT*FROM NOTICE; 쿼리문이 실행된 격자문 안에
실행된 격자형 데이터에는 모든 레코드에는 ROWNUM이 나오게 된다.
이 완성된 데이터를 가지고 ROWNUM을 나누게 되면 위와 같은 오류를 거치지 않고,
레코드를 나눌 수 있다.
SELECT* FROM(SELECT ROWNUM NUM, NOTICE.* FROM NOTICE) WHERE NUM BETWEEN 11 AND 20;을 실행하게 되면 아까와 같이 ROWNUM이 11부터 20인 레코드들이 잘 조회되는 것을 볼 수 있다.
'DataBase' 카테고리의 다른 글
쿼리 속도 향상을 위한 방법들 (1) | 2021.02.14 |
---|---|
MySQL]The MySQL server is running with the --read-only option so it cannot execute this statement (0) | 2021.02.08 |
Mybatis] MySQL] concat 문자열 검색 (1) | 2021.01.19 |
MySQL] 테이블 복사하기 (0) | 2021.01.19 |
데이터 베이스(DataBase) ACID란? (0) | 2020.06.02 |
댓글