SQL에서 조인이란?
조인이란 데이터베이스에서 필요에 의해서 테이블 간에 결합을 하는 것을 말합니다.
테이블과 테이블을 결합을 하지만 2개 이상의 테이블을 결합하는 것 또한 가능합니다.
기초적인 조인의 종류는 이너 조인(Inner JOIN), 아우터 조인(Outer JOIN), 셀프 조인(Self JOIN), 크로스 조인(Cross JOIN)이 있습니다.
예시 데이터로
회원정보 테이블과 공지사항 테이블을 결합을 시켜보겠습니다.
MEMBER.TABLE
ID | PASSWORD | NAME | PHONE |
ASNIC | 1234 | 홍길동 | 010-1234-1352 |
DUST | 12345 | 유재석 | 010-2522-2542 |
CAP | 2521 | 션 | 010-5353-2344 |
NOTICE.TABLE
NUMBER | TITLE | WRITE_ID | CONTENT | HIT |
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;
작성자 | 게시글수 |
ASNIC | 2 |
DUST | 1 |
이제 연결고리가 필요합니다.
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;
결과
작성자 | 회원 | 게시글수 |
ASNIC | ASNIC | 2 |
DUST | DUST | 1 |
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에 글을 올리지않는 회원을 출력하게 됩니다.
작성자 | 회원 | 게시글수 |
ASNIC | ASNIC | 2 |
DUST | DUST | 1 |
NULL | CAP | 0 |
만약 반대인 RIGHT인 경우에는 작성자와 회원이 일치되지 않는 MEMBER의 데이터를 버리고
NOTICE의 있는 익명이라는 WRITE_ID까지 출력되게 됩니다.
작성자 | 회원 | 게시글수 |
ASNIC | ASNIC | 2 |
DUST | DUST | 1 |
익명 | NULL | 1 |
만약 FROM MEMBER M FULL JOIN NOTICE N ON M.ID = N.WRITE_ID
작성자 | 회원 | 게시글수 |
ASNIC | ASNIC | 2 |
DUST | DUST | 1 |
익명 | NULL | 0 |
NULL | CAP | 1 |
여기서 사용된 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 |
댓글