728x90

목차

  1. JOIN의 필요성
  2. LEFT JOIN/RIGHT JOIN
  3. INNER JOIN
  4. FULL JOIN
  5. EXCLUSIVE JOIN
LEFT/RIGHT JOIN SELECT * FROM tableA LEFT JOIN tableB ON A.key=B.key;
INNER JOIN SELECT * FROM tableA INNER JOIN tableB ON A.key=B.key;
FULL JOIN (SELECT * FROM tableA LEFT JOIN tableB ON A.key=B.key)
UNION (DISTINCT)
(SELECT * FROM tableA RIGHT JOIN tableB ON A.key=B.key)
EXCULUSIVE JOIN SELECT * FROM tableA LEFT JOIN tableB ON A.key=B.key WHERE B.key IS NULL

* 사용빈도로만 보자면 LEFT JOIN과 INNER JOIN이 압도적으로 높다.


1. JOIN의 필요성

[목차로 이동]

* 하나의 표의 여러 테마의 정보를 담고 있다면 한 눈에 볼 수 있다는 장점이 있지만 유지보수가 어렵다는 단점이 있다.
따라서 하나의 표에는 하나의 테마만 담기도록 표를 쪼개고, 쪼개진 정보를 통합 할 때 JOIN이 필요하다.

 

* 위의 표는 예시로 만들어 본 하나의 표다. 테마는 카페 멤버쉽에 가입된 사람들의 정보를 보여준다.(이게 저의 창의성의 한계입니다...)
이 표는 3가지 테마로 나눌 수 있다.
1) 이름과 휴대폰 뒷자리,
2) 회원들의 등급과 조건 그리고 혜택,
3) 회원들이 자주시키는 음료와 그 음료와 잘 어울리는 추천디저트

 

* 표를 쪼갠 뒤 meber테이블에는 mb_id, mm_id 컬럼이 추가 되었는 데, 각각의 기능은 member테이블과 benefit테이블을 엮어주는 식별자, member테이블과 menu테이블을 엮어주는 식별자다. (이런식으로 쪼개진 표를 엮어줄때는 엮는 단서가 되는 식별자가 필요함)
* mm_id컬럼이 member테이블과 menu테이블에서 중복되는 데 이럴 경우 memeber.mm_id/menu.mm_id 와 같이 ' . '으로 컬럼이 어느 테이블에 속하는 지 확실하게 명시해줘야 sql서버가 처리할 수 있다.


2. LEFT JOIN/RIGHT JOIN

[목차로 이동]

LEFT JOIN 벤다이어그램으로 시각화

* SELECT * FROM tableA LEFT JOIN tableB ON A.key=B.key;
* 왼쪽에 테이블A를, 오른쪽에는 테이블B을 둔다. 테이블A의 모든 행렬을 출력하는데, 테이블B의 식별자와 연결되지 않는다면 NULL값을 처리해서라도 테이블A의 모든 행렬을 가져와 하나의 표로 합친다. 

 

* SELECT * FROM member LEFT JOIN benefit ON member.mb_id=benefit.bid;
* SELECT id, name, grade, benefit.condition, gift, discount FROM member LEFT JOIN benefit ON member.mb_id=benefit.bid; // 원하는 컬럼만 출력할 수도 있음

* Right Join도 LEFT와 똑같음 단지 기준이 오른쪽에 있는 테이블B라는 것이 다름


3. INNER JOIN

[목차로 이동]

INNER JOIN 벤다이어그램으로 시각화

* SELECT * FROM tableA INNNER JOIN tableB ON A.key=Bkey;
* 양쪽 모두에 존재하는 행만을 갖고 새로운 표를 만든다. 따라서 NULL이 없다. 

 


* SELECT * FROM member INNER JOIN benefit ON mb_id=bid;
* INNER JOIN의 결과 NULL 값이 있던 5행은 출력되지 않았다.

 

* SELECT * FROM member INNER JOIN benefit ON mb_id=bid
INNER JOIN menu ON member.mm_id=menu.mm_id;
* 위와 같은 커멘드로 2개 이상의 표도 한번에 출력할 수 있다.


4. FULL JOIN

[목차로 이동]

FULL JOIN 벤다이어그램으로 시각화

* SELECT * FROM tableA FULL OUTER JOIN tableB ON A.key=B.key;
* (SELECT * FROM tableA LEFT JOIN tableB ON  A.key=B.key) UNION (DISTINCT) (SELECT * FROM tableA RIGHT JOIN tableB ON A.key=B.key)

* 출력된 표에 상단에는 LEFT JOIN의 결과가 하단에는 RIGHT JOIN의 결과가 출력되는데 여기서 중복을 지운 것이 FULL JOIN의 결과.
* 대부분의 sql 서버에서 위와 같은 커멘트를 인지 하지 못하기 때문에 LEFT JOIN 과 RIGHT JOIN 커멘드를 각각 입력하고 UNION (DISTINCT)로 중복을 제거해준다. 

 

* (SELECT * FROM member LEFT JOIN benefit ON mb_id=bid) UNION (SELECT * FROM member RIGHT JOIN benefit ON mb_id=bid);
* 중복된 행들이 모두 제거되고 하단에 benefit에만 있는 행이 출력된 것을 확인 할 수 있다.


5. EXCLUSIVE JOIN

[목차로 이동]

EXCLUSIVE JOIN 벤다이어그램으로 시각화

* SELECT * FROM tableA LEFT JOIN tableB ON A.key=B.key WHERE B.key IS NULL
* 두 테이블 중에서 A에만 존재하는 행들만 출력하고 싶을 때 사용한다. 

 

* SELECT * FROM member LEFT JOIN benefit ON mb_id=bid WHERE bid IS NULL;
* member테이블에만 있는 행만 출력된 것을 확인할 수 있다.


728x90

'# Database > SQL' 카테고리의 다른 글

[SQL] SQL 기본 문법_MySQL  (0) 2020.12.21

+ Recent posts