내부 조인 (INNER JOIN)
- 보통 조인이라고 하면 내부 조인인 경우가 대부분일정도로 많이 쓰이는 형태이다.
- 내부 조인은 조인키에 해당하는 각 테이블의 열 값을 비교해 조건에 맞는 값을 검색한다.
INNER JOIN은 위의 그림과 같이 서로의 데이터의 교집합(서로 겹치는 부분)을 이용해 JOIN하는 방법이다.
INNER JOIN 선언 방법
SELECT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
WHERE [검색 조건]
예제]
고객 번호 | 고객 이름 |
0001 | 박현규 |
0002 | 김은숙 |
0003 | 한승우 |
주문 번호 | 고객 번호 | 주문 날짜 |
100 | 0001 | 2021-11-16 |
101 | 0002 | 2021-11-17 |
102 | 0004 | 2021-11-18 |
위의 표는 고객 테이블과 주문 테이블이다. 고객의 주문 내역을 모두 확인하기 위해 내부 조인을 해야한다. 또한, 고객 번호를 조인 조건으로 가져야 한다.
조인하는 SQL문
SELECT [고객.고객 번호], [고객], [고객 이름], [주문.주문 번호], [주문.고객 번호], [주문.주문 날짜]
FROM [고객]
INNER JOIN [주문] ON [고객.고객 번호] = [주문.고객 번호]
결과
고객 번호 | 고객 이름 | 주문 번호 | 고객 번호 | 주문 날짜 |
0001 | 박현규 | 100 | 0001 | 2021-11-16 |
0002 | 김은숙 | 101 | 0002 | 2021-11-17 |
0003 | 한승우 | 102 | 0004 | 2021-11-18 |
ON 문과 WHERE 문의 차이
- ON 문은 조인할 때 조인 조건을 위해 사용한다.
- WHERE 문은 조인을 완료한 상태에서 조건에 맞는 값을 가져올 때 사용한다.
서로의 기능이 비슷하여 혼동할 수 있지만 데이터 매칭 과정에서 오차가 발생할 수도 있으므로 상황에 맞게 사용해야 한다.
3개 이상 테이블의 INNER JOIN 선언 방법
SELELCT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
INNER JOIN [테이블 3] ON [테이블 2.열] = [테이블 3.열]
WHERE [검색 조건]
외부 조인(OUTER JOIN)
- 다른 테이블에 있는 행에서 일치 항목이 아닌 행을 조합해 검색해야 할 때 사용한다.
OUTER JOIN 선언 방법
SELECT [열 이름]
FROM [테이블 1]
<LEFT, RIGHT, FULL> OUTER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
WHERE [검색 조건]
<>로 감싸진 부분은 3개의 항목 중 1개만 선택하여야 한다는 뜻이다.
LEFT OUTER JOIN
예를 들어, A, B 테이블이 좌우에 있다고 생각했을 때 A 테이블을 기준으로 B 테이블을 조인하고 싶다면 LEFT를 사용하고, B 테이블을 기준으로 A 테이블을 조인하고 싶다면 RIGHT를 사용한다.
고객 번호 | 고객 이름 |
1 | 부엉이 |
2 | 독수리 |
3 | 비둘기 |
주문 번호 | 고객 번호 | 주문 날짜 |
100 | 1 | 2021-11-16 10:57:23.700 |
200 | 4 | 2021-11-16 10:57:23.700 |
300 | 3 | 2021-11-16 10:57:23.700 |
위의 표를 LEFT OUTER JOIN을 하면 고객 테이블이 우선 결과에 포함된다. 따라서 고객 번호가 2번인 독수리는 주문 테이블에 없으므로 NULL로 표시 된다. 결과는 아래의 표와 같다.
고객 번호 | 고객 이름 | 주문 번호 | 고객 번호 | 주문 날짜 |
1 | 부엉이 | 100 | 1 | 2021-11-16 10:57:23.700 |
2 | 독수리 | NULL | NULL | NULL |
3 | 비둘기 | 300 | 3 | 2021-11-16 10:57:23.700 |
위의 표 쿼리문
SELECT [고객.고객 번호], [고객.고객 이름], [주문.주문 번호], [주문.고객 번호], [주문.주문 날짜] FROM [고객]
LEFT OUTER JOIN [주문] ON [고객.고객 번호] = [주문.고객 번호]
기준 테이블에 있는 데이터만 추출하려면 LEFT OUTER JOIN 결과에서 NULL 데이터만 추출하면 된다.
RIGHT OUTER JOIN
위의 예시에서 주문 테이블을 기준 테이블로 잡고 조인을 하게되면 아래의 표와 같다.
고객 번호 | 고객 이름 |
1 | 부엉이 |
2 | 독수리 |
3 | 비둘기 |
주문 번호 | 고객 번호 | 주문 날짜 |
100 | 1 | 2021-11-16 10:57:23.700 |
200 | 4 | 2021-11-16 10:57:23.700 |
300 | 3 | 2021-11-16 10:57:23.700 |
RIGHT OUTER JOIN 후
고객 번호 | 고객 이름 | 주문 번호 | 고객 번호 | 주문 날짜 |
1 | 부엉이 | 100 | 1 | 2021-11-16 10:57:23.700 |
NULL | NULL | 200 | 4 | 2021-11-16 10:57:23.700 |
3 | 비둘기 | 300 | 3 | 2021-11-16 10:57:23.700 |
RIGHT OUTER JOIN을 했을 경우 오른쪽 테이블 (주문 테이블)을 기준으로 JOIN을 하였기 때문에 주문 테이블의 결과는 모두 표시되었고, 고객 테이블에 적혀있지 않은 정보는 NULL로 표시되는 것을 알 수 있다.
위와 마찬가지로 기준 테이블에 있는 데이터만 추출하려면 RIGHT OUTER JOIN 결과에서 NULL 데이터만 추출하게 되면 B의 데이터만 추출할 수 있다.
FULL OUTER JOIN
- LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 합친 것을 말한다.
- 양쪽 테이블의 일치하지 않는 행도 모두 검색한다.
- 예시] 잘못된 고객 번호로 주문 내역이 기록된 것이 없는지 확인하고 싶을 때 사용한다.
위의 벤다이어그램을 표로 예시를 들어보면 아래와 같다.
고객 번호 | 고객 이름 |
1 | 부엉이 |
2 | 독수리 |
3 | 비둘기 |
주문 번호 | 고객 번호 | 주문 날짜 |
100 | 1 | 2021-11-16 10:57:23.700 |
200 | 4 | 2021-11-16 10:57:23.700 |
300 | 3 | 2021-11-16 10:57:23.700 |
FULL OUTER JOIN 후
고객 번호 | 고객 이름 | 주문 번호 | 고객 번호 | 주문 날짜 |
1 | 부엉이 | 100 | 1 | 2021-11-16 10:57:23.700 |
2 | 독수리 | NULL | NULL | NULL |
3 | 비둘기 | 300 | 3 | 2021-11-16 10:57:23.700 |
NULL | NULL | 200 | 4 | 2021-11-16 10:57:23.700 |
교차 조인
- 각 테이블의 모든 경우의 수를 조합한 데이터가 필요할경우 교차 조인을 사용한다.
- 카르테시안 곱이라고도 한다.
교차 조인의 기본 형식
SELECT [열 이름]
FROM [테이블 1]
CROSS JOIN [테이블 2]
WHERE [검색 조건]
'DBMS > MySQL 정리' 카테고리의 다른 글
[MySQL] 공통 테이블 식 (0) | 2023.06.24 |
---|---|
[MySQL] 서브 쿼리 (0) | 2023.06.23 |
[MySQL] SQL Server에서 다루는 자료형 정리하기 (1) | 2023.06.22 |
[MySQL] 테이블 생성하고 데이터 조작하기 (0) | 2023.06.22 |
[MySQL] 데이터 그룹화 다루기 (0) | 2023.06.20 |