[SQL] Join 개념 정리 - mysql 기준

2025. 1. 12. 01:26Lang/SQL

1. INNER JOIN (교집합)

: SELECT 보고싶은 컬럼명 FROM 조회하고 싶은 메인 테이블 INNER JOIN 비교하고 싶은 테이블 ON 비교 조건

# 핸드폰과 PC이 같은 같은 제조사인 기기를 찾을 때
SELECT *
FROM PHONE AS A
INNER JOIN PC AS B
ON A.CONPANY_NAME = B.CONPANY_NAME;

=> 만약, 두개 테이블의 row가 각각 100개 씩 있고 COMPANY_NAME이 곂치는 row가 10개있을때 

조회 결과 row는 10개이다.

 

 


 

 

2. LEFT JOIN ( 부분집합 + 남은 부분 )

: SELECT 보고싶은 컬럼명 FROM 조회하고 싶은 메인 테이블 LEFT JOIN 비교하고 싶은 테이블 ON 비교 조건

# 핸드폰의 정보를 모두 보고 싶은데 그중에서 TV 제조사에도 있는 제조사가 어느 제조사인지 찾고 싶을때
SELECT *
FROM PHONE AS A
LEFT JOIN PC AS B
ON A.COMPANY_NAME = B.COMPANY_NAME;

=> 만약, 두개의 테이블의 row가 각각 100개 씩 있고 COMPANY_NAME이 곂치는 row가 10개씩 있을때

조회결과 row는 100개가 나온다. 

 

++ 결과는 항상 메인 테이블(A) 기준으로 모든 row가 출력되지만 조건이 일치하지 않는 비교대상 테이블(B) 관련 컬럼의 값은 null로 출력된다.

 


 

 

3. RIGHT JOIN ( 반대방향 부분집합)

: SELECT 보고싶은 컬럼명 FROM 비교하고 싶은 테이블  RIGHT JOIN 조회하고 싶은 메인 테이블   ON 비교 조건

# PC의 정보를 모두 보고 싶은데 그중에서 핸드폰 제조사에도 있는 제조사가 어느 제조사인지 찾고 싶을때
SELECT *
FROM PHONE AS A
RIGHT JOIN PC AS B
ON A.COMPANY_NAME = B.COMPANY_NAME;

=> 만약, 두개의 테이블의 row가 각각 100개 씩 있고 COMPANY_NAME이 곂치는 row가 10개씩 있을때

조회결과 row는 100개가 나온다. 

 

++ 결과는 LEFT JOIN을 RIGHT JOIN을 했을 때의 테이블 순서만 바꾸면 똑같은 결과가 나온다
(즉, RIGHT JOIN을 쓸 필요가 크게 없다)

 


 

 

4. FULL OUTER JOIN (합집합)

mySQL 기준:

    SELECT <보고 싶은 컬럼명> FROM <메인 테이블(A)> LEFT JOIN <비교 테이블(B)> ON <조건>

    UNION
    SELECT
<보고 싶은 컬럼명> FROM <비교 테이블(B)> LEFT JOIN <메인 테이블(A)> ON <조건>;

 

그외의 RDB: SELECT <보고 싶은 컬럼명> FROM <테이블A> FULL OUTER JOIN <테이블B> ON <조건>

# 핸드폰과 PC의 모든 기기를 보고 싶은 경우

## 일반적 RDB 기준 FULL OUTER JOIN
SELECT *
FROM PHONE AS A
FULL OUTER JOIN PC AS B
ON A.COMPANY_NAME = B.COMPANY_NAME;

## mySQL의 UNION 문법- FULL OUTER JOIN 대체
SELECT *
FROM PHONE AS A
LEFT JOIN PC AS B
ON A.COMPANY_NAME = B.COMPANY_NAME
UNION
SELECT *
FROM PC AS B
LEFT JOIN PHONE AS A
ON B.COMPANY_NAME = A.COMPANY_NAME;

=> 만약, 두개의 테이블의 row가 A가 100개 B가 200개이고 서로 곂치는 조건인 row가 20개 일때

 

    조건이 일치하는 ROW: 20 개

    A 테이블에만 있는 ROW: 100 - 20 = 80개

    B 테이블에만 있는 ROW: 200 - 20 = 180개

+)_____________________________________

                            전체 결과 row 개수 = 280개

   

으로 두개의 테이블 row를 합할 때보다 많은 결과가 나오게 될수 있다.

 

++ mySQL은 FULL OUTER JOIN 을 지원하지 않아 위 예시 처럼 UNION을 활용해서 구현해야한다.

'Lang > SQL' 카테고리의 다른 글

[OracleDB] SCOTT 계정 활성화 (19c 버전)  (0) 2024.07.03
[SQL] 기초부터 다시 다지기~! (1) DML  (0) 2024.02.14