본문 바로가기
Database/Oracle

ORACLE SQL JOIN

by oncerun 2020. 4. 14.
반응형

SQL에서 조인이란?



조인이란 데이터베이스에서 필요에 의해서 테이블 간에 결합을 하는 것을 말합니다.

테이블과 테이블을 결합을 하지만 2개 이상의 테이블을 결합하는 것 또한 가능합니다.

기초적인 조인의 종류는 이너 조인(Inner JOIN), 아우터 조인(Outer JOIN), 셀프 조인(Self JOIN), 크로스 조인(Cross JOIN)이 있습니다.

예시 데이터로 
회원정보 테이블과 공지사항 테이블을 결합을 시켜보겠습니다.

 

MEMBER.TABLE

IDPASSWORDNAMEPHONE
ASNIC1234홍길동010-1234-1352
DUST12345유재석010-2522-2542
CAP2521010-5353-2344

NOTICE.TABLE

NUMBERTITLEWRITE_IDCONTENTHIT
1다이어트ASNIC살빼는운동은.....30
2치킨DUST치느님은....20
3컴퓨터ASNIC컴퓨터란...50
4노트북익명익명이란...22

 

만약 우리가 회원이면서 공지사항에 글을 작성한 회원을 알고 싶을 땐 어떻게 해야 할까요?

회원정보는 MEMBER.TABLE에 있고 작성자 정보는 NOTICE.TABLE이 있습니다.

이럴 때 사용하는 것이 JOIN입니다.

 

단계적으로  NOTICE.TABLE에서 회원이 몇 개에 글을 작성했는지 알아야 할 것 같습니다.

SELECT WRITE_ID 작성자, COUNT(WRITE_ID) 게시글수

FROM NOTICE

GROUP BY WRITE_ID;

작성자게시글수
ASNIC2
DUST1

이제 연결고리가 필요합니다.

MEMBER.TBALE의 있는 ID칼럼과 NOTICE.TABLE에 있는 WRITE_ID가 같을 때라고 기준을 잡고

두 개의 테이블을 INNER JOIN을 해줄 것입니다.

 

여기서 INNER JOIN이란

결합되는 테이블 간에 공통된 부분을 통해 결합하는 조인 방식이며,

SQL에서는 일반적으로 INNER을 생략하고 JOIN만 사용하게 되면 암묵적으로 INNER JOIN이 사용됩니다.

우리가 만드는 공통된 부분은 MEMBER.ID와 NOTICE.WRITE_ID입니다.

두 개의 칼럼을 이용해 회원과 작성자의 게시글 수를 조회하려고 합니다.

 

SELECT WRITE_ID AS 작성자, MEMBER.ID AS 회원 COUNT(WRITE_ID) AS 게시글수

FROM NOTICE AS N JOIN MEMBER M 

ON N.WRITE_ID = M.ID

GROUP BY 작성자, 회원

ORDER BY 게시글수 DESC;

 

결과

작성자회원게시글수
ASNICASNIC2
DUSTDUST1

 

NOTICE테이블과 MEMBER테이블의 공통된 부분을 결합된 결과 집합을 조회했습니다.

 

이번에는 결과에 게시글을 작성하지 않았던 회원까지도 출력을 해야 한다면 어떻게 해야 할까요?

 

아우터 조인(Outer JOIN)

아우터 조인은 두 테이블의 공통영역을 포함해 한쪽 테이블의 나머지 데이터까지 포함하는 조인 방식입니다.

 

FROM MEMBER (LEFT / RIGHT / FULL) JOIN NOTICE

3가지의 LEFT RIGHT FULL의 아우터 조인이 있습니다.

 

두 테이블을 JOIN 해줄 때 우리는 작성자와 회원이 동일한 경우에만 검색되게 작성했기 때문에

NOTICE.TABLE에 글을 작성하지 않은 회원의 정보는 가져올 수가 없었습니다.

만약 모든 회원 데이터까지 함께 보고 싶은 경우가 존재하는 경우에 우리는 아우터 조인을 사용합니다.

 

LEFT RIGHT을 정하는 기준이 있습니다.

 

FROM절에 적어준 TABLE이 LEFT가 되고 JOIN절에 적어준 테이블이 RIGHT가 됩니다.

 

JOIN이 되는 과정을 알아보면

 

FROM MEMBER  M LEFT JOIN NOTICE N ON  M.ID=N.WRITER_ID;

 

LEFT인 경우 NOTICE의 TABLE에서 일치하지 않는 익명이라는 레코드를 제외하고

NOTICE에 글을 올리지않는 회원을 출력하게 됩니다.

 

작성자회원게시글수
ASNICASNIC2
DUSTDUST1
NULLCAP0

 

만약 반대인 RIGHT인 경우에는 작성자와 회원이 일치되지 않는 MEMBER의 데이터를 버리고

NOTICE의 있는 익명이라는 WRITE_ID까지 출력되게 됩니다.

 

 

작성자회원게시글수
ASNICASNIC2
DUSTDUST1
익명NULL1

 

만약 FROM MEMBER M FULL JOIN NOTICE N ON M.ID = N.WRITE_ID

 

작성자회원게시글수
ASNICASNIC2
DUSTDUST1
익명NULL0
NULLCAP1

 여기서 사용된 Join방식은 ANSI표준을 이용했습니다

반응형

'Database > Oracle' 카테고리의 다른 글

ORACLE SQL SELF JOIN  (0) 2020.04.15
ORACLE SQL 문자열 내장 함수 (1)  (0) 2020.04.15
Oracle SQL 정규표현  (0) 2020.04.13
SQL TABLE , 자료형  (0) 2020.04.07
Oracle SQL 설치  (0) 2020.04.06

댓글