본문 바로가기

Oracle DB

LEFT JOIN, RIGHT JOIN, ROWNUM

LEFT JOIN, RIGHT JOIN, ROWNUM

지난 글에 OUTTER JOIN이 무엇인지만 말하고 마무리했다.

그래서 이번엔 예시를 보여주고 ROWNUM에 대해 알아보자.

TEST
TEST테이블(회원들이라고 하자)
TESTBOARD
TESTBOARD테이블(회원들이 쓴 게시글이라고 하자)

1.LEFT JOIN

LEFT JOIN

두 테이블을 결합해서 누가 몇 개의 글을 작성했는지를 보여주는 쿼리문이다.

bidx의 갯수로 글의 개수를 파악하여 작성했다. 현재 결과를 보면 두 개의 열로 나와있는데, 이걸 합쳐서 나타낼 수 있다.

막대기표시는 이어주는 역할을 한다.(SHIFT + \)

'||'를 이용하면 연달아 하나의 열에 연달아서 나타낼 수 있다.

2.RIGHT JOIN

앞의 예시는 너무 단순해서 약간 복잡하게 해봤다.

글을 쓴 사람들의 연령대를 회원번호(midx)순으로 조회

두 번째 줄의 DISTINCT의 의미는 컬럼(열)에 대한 중복되는 값을 없애주는 기능이다.

즉, 같은 내용은 한 번만 나타내게 한다. 한 사람이 글을 여러 번 썼을 경우가 있어 DISTINCT를 사용했다. DECODE( )랑 SUBSTR( )는 다룬 적이 있어서 패스하겠다.

 

 

 

 

 

 

글을 쓴 사람들의 닉네임을 회원번호(midx)순으로 조회

방금 문제와 비슷한 경우다. 연령대를 닉네임으로 바꾼 것뿐이다.

또 다른 문제도 보자.

 

 

 

 

 

 

마지막으로 글을 쓴 사람의 이름과 닉네임을 조회

두 번째 줄의 RIGHT JOIN부분은 LEFT JOIN 혹은 INNER JOIN으로 해도 결과는 같다.

 

3.ROWNUM

ROWNUM은 테이블을 조회하고 난 뒤에 각 행별로 1부터 숫자는 매기는 기능을 갖고 있다.

ROWNUM을 이용해서 게시판의 페이지 개수별로 조회를 할 수 있다.

BIDX(글 번호)로 페이지를 나타낼 수도 있지 않을까 싶지만...

게시글의 특성상 "삭제"라는 기능이 있다. 게시글을 삭제한다면 BIDX으로만 나타내기에 어려움이 있다.

그 점을 생각해서 ROWNUM이 있다는 걸 알아두자.

 

*옆의 사진은 ROWNUM을 사용하는 기본 방법이고, 필요한 부분만 편집해서 올렸다.

 

 

 

 

 

 

이제 페이징 처리(게시판의 페이지 개수별)를 하는 법을 보여주고 끝내겠다.

testboard테이블엔 12개의 글이 있다. 6개씩 조회하고 싶을 땐 (1~6, 7~12) 밑의 쿼리문으로 작성하자. 복잡할지라도 이유가 있다.

(← 1~6번까지의 게시물)

전체적인 맥락을 보자면 testboard테이블을 a라 짓고,

ROWNUM과 a 테이블을 합친 테이블을 b라 지은 것이다.

두 번째 줄에서 'ROWNUM AS RUM'(*별칭 기능을 사용. RUM 말고 원하는 이름으로 해도 좋다.)으로 하는 이유는 4번째 줄의 ROWNUM을 이용하기 위해서다. 만일 별칭으로 하지 않고 ROWNUM으로 하게 된다면 조회가 되지 않기 때문이다.

궁금한 사람은 실제로 해봐라.

(← 7~12번까지의 게시물)

 

 

누가 봐도 복잡하게 보이는 쿼리문인데, 이 방법으로 해야 나중에 100,000 건 or 1,000,000건이 넘는 방대한 게시글에서 속도면으로 빠르기 때문이다. 물론 조그마한 게시판 같은 경우에는 의미가 없다. ↓처럼 해도 된다는 뜻이다.

데이터가 적을 경우엔 상관없다.

'Oracle DB' 카테고리의 다른 글

ROW_NUMBER() OVER()  (1) 2022.01.20
FOREIGN KEY, INNER JOIN, OUTER JOIN  (0) 2022.01.11
UNION  (4) 2022.01.08
DECODE, NVL, CASE  (2) 2022.01.07
서브쿼리, 시퀀스  (4) 2022.01.06