1. Inner join : A ∩ B, 교집합연산
쿼리
SELECT 컬럼명 [, 컬럼명]
FROM 테이블A
[INNER] JOIN 테이블B ON A.조인키 컬럼 = B.조인키 컬럼
Inner join은 교집합 연산으로, 조인 키 컬럼 값이 양쪽 테이블에 모두 존재하는 경우만 추출합니다.
INNER 키워드는 생략가능하지만, 가독성을 위해 왠만하면 써주는것이 좋습니다.
예시 테이블
실행 쿼리
SELECT *
FROM 상품 P
INNER JOIN 옵션 O ON P.상품ID = O.상품ID
결과
주의할점은, 보시다시피 id 3인 탕수육 컬럼이 존재하지 않습니다.
왜냐하면 옵션 테이블에 상품ID가 3인 튜플이 존재하지 않기 때문입니다.
위처럼 inner join은 코인 키 컬럼값이 모두 존재하는 데이터만 출력하기 떄문에 주의가 필요합니다.
2. outer join : 기준 테이블에 따른 복합 연산
OUTER JOIN앞의 LEFT, RIGHT는 '기준'테이블의 위치를 나타냅니다.
LEFT라면 JOIN절 앞의 테이블이, RIGHT라면 JOIN절 뒤의 테이블이 기준이 됩니다.
만약,
...
FROM A
LEFT OUTER JOIN B ON A.id = C.id
LEFT OUTER JOIN C ON A.id = C.id
RIGHT OUTER JOIN D ON A.id = D.id
...
와 같이 복잡한 조인이 사용되어도 위에서 한줄씩 기준 테이블을 보면서 작성하거나 풀면 됩니다.
2.1 left outer join : (A ∩ B) ∪ (A - B)
예시 테이블
실행 쿼리
SELECT *
FROM 상품 P
LEFT OUTER JOIN 옵션 O ON P.상품ID = O.상품ID
결과
키 컬럼값이 모두 존재하는 데이터와 join 키워드의 왼쪽(앞) 테이블에만 키 컬럼값이 존재하는 데이터를 결과집합으로 출력합니다.
2.2 right outer join : (A ∩ B) ∪ (B - A)
예시 테이블
실행 쿼리
SELECT *
FROM 상품 P
RIGHT OUTER JOIN 옵션 O ON P.상품ID = O.상품ID
결과
키 컬럼값이 모두 존재하는 데이터와 join 키워드의 '오른쪽(뒤)' 테이블에만 키 컬럼값이 존재하는 데이터를 결과집합으로 출력합니다.
(예시를 위해 만들다보니, 옵션 테이블이 FK 위반입니다... 머쓱)
3. full outer join : (A ∪ B)
예시 테이블
실행 쿼리
SELECT *
FROM 상품 P
FULL OUTER JOIN 옵션 O ON P.상품ID = O.상품ID
결과
상품 테이블에만 존재하는 경우는 옵션 테이블의 컬럼값은 null로,
옵션 테이블에만 존재하는 경우는 상품 테이블의 컬럼값이 null로,
양쪽 테이블에서 모두 조인 키 컬럼값이 존재하는경우는 컬럼을 합성해서 출력해준것을 볼 수 있습니다.
4. Natural Join
두 테이블간 동일한 이름을 갖는 모든 컬럼들에 대해 equi join을 수행합니다.
JOIN 이후 ON절을 사용할 수 없지만, using 조건절을 이용하면 원하는 컬럼에 대해서만 선택적으로 equi join을 실행합니다.
SELECT 컬럼, 컬럼, …
FROM 테이블A
NATURAL [INNER] JOIN 테이블B [USING 조인컬럼명]
WHERE 검색 조건;
자연 조인은 테이블간에 동일한 형식을 갖는 공통 컬럼이 반드시 하나만 존재해야 합니다.
만약, 하나 이상이 존재할경우 USING절을 사용해 컬럼명을 지정해 주어야 합니다.
컬럼명이 같아야 하는 제약조건이 있어, INNER JOIN의 하위 개념이라고 생각하면 됩니다.
5. Cross join
SELECT 컬럼명 [, 컬럼명]
FROM 테이블명A
CROSS JOIN 테이블B
두 테이블간 join조건이 없는경우 생길 수 있는 모든 데이터 조합을 추출합니다.
M*N건의 데이터 조합이 발생하게 됩니다.
물론 join조건을 추가할 수 있는데, 추가한다면 inner join과 같은 결과를 얻게 되므로 cross join을 사용하는 의미가 없습니다.
양측 테이블이 크면 클수록 어마어마한양의 테이블이 나오기 때문에, 주의해야 합니다.
보통은 join쿼리 사용시 조건이 잘못되었거나 없을 경우 나오게 됩니다.
ex)
SELECT *
FROM 상품 P
LEFT OUTER JOIN 옵션 O ON 1=1
참고1. CROSS JOIN대신 ','를 사용하면 콤마조인이 됩니다.
참고2. 카디션 곱(Cartesian product) 이라고도 불립니다.
'Database' 카테고리의 다른 글
[MySQL-MyBatis] insert후 pk를 반환하는 selectKey와 useGeneratedKey의 동시성 이슈 (0) | 2023.05.19 |
---|---|
Mybatis) 조건문 if-else -> choose-when-otherwise (0) | 2022.08.21 |
[MySQL] ON DUPLICATE KEY UPDATE [짧] (0) | 2022.05.23 |
[MySQL] 복합키 설정하기 [짧] (0) | 2022.05.23 |
Procedure 기본 (0) | 2022.05.03 |