반응형
1-1. LEFT(RIGHT) JOIN


- 왼(오른)쪽은 무조건 표기, 매치되는 레코드가 오른(왼)쪽에 없으면 NULL
- 왼(오른)쪽 테이블을 중심으로 오른(왼)쪽의 테이블을 매치
- 왼(오른)쪽 테이블의 1개 레코드에 여러 개의 오른(왼)쪽 테이블 레코드가 일치할 경우, 해당 왼(오른)쪽 레코드 여러번 표시


SELECT A.id
, A.name
, A.age
, B.school
, B.explnation
FROM A
LEFT JOIN B
ON A.id = B.id
ORDER BY A.id ASC;

- A 테이블 기준으로 A의 모든 id가 출력
- id = 3인 레코드가 B에 2개 있으므로 모두 출력
- id = 4인 레코드가 B에 없지만 A의 레코드는 모두 출력하므로 없는 값을 NULL로 채우고 출력한다
1-2. LEFT(RIGHT) JOIN WHERE 칼럼 IS NULL
- 순수 왼(오른)쪽 테이블의 값만 뽑는다
- WHERE B.id IS NULL 추가
SELECT A.id
, A.name
, A.age
, B.school
, B.explnation
FROM A
LEFT JOIN B
ON A.id = B.id
WHERE B.id IS NULL
ORDER BY A.id ASC;

- LEFT JOIN 결과 B테이블과 연결이 없는 A의 레코드가 출력
- A 차집합 B와 같다
*RIGHT JOIN은 대상 테이블만 다르므로 생략
2. INNER JOIN

- A와 B의 교집합 출력
SELECT A.id
, A.name
, A.age
, B.school
, B.explnation
FROM A
(INNER) JOIN B
ON A.id = B.id
ORDER BY A.id ASC;

- A, B 테이블 모두 존재하는 id = 1, 2, 3, 5에 해당하는 레코드 모두 출력
- id = 3의 경우 B테이블에 2개의 레코드가 존재하므로 2개 모두 출력
3. FULL (OUTER) JOIN with no intersection

- MySQL에는 FULL OUTER JOIN이 없다 → LEFT JOIN과 RIGHT JOIN 이용해 FULL OUTER JOIN 사용


SELECT a.seq, a.name, a.age, b.school, b.explanation
FROM tbl_person a
LEFT JOIN tbl_info b
ON a.seq = b.person_seq
UNION
SELECT a.seq, a.name, a.age, b.school, b.explanation
FROM tbl_person a
RIGHT JOIN tbl_info b
ON a.seq = b.person_seq

- A의 seq = 1, 2, 3인 레코드 모두 출력하는데 B에 seq = 3에 관한 정보가 없으면 NULL로 채우고 출력
- 똑같이 B의 person_seq = 1, 2, 4인 레코드 모두 출력하는데 A에 person_seq = 4에 관한 정보가 없으면 NULL로 채우고 출력
참고 1 : https://yoo-hyeok.tistory.com/98
참고 2 : https://easy-coding.tistory.com/63
반응형