본문 바로가기
SQL/MySQL

MySQL INNER LEFT RIGHT CROSS JOIN 사용방법 및 예제

by wakestand 2021. 1. 8.
반응형

MySQL에서는

INNER JOIN, LEFT JOIN, RIGHT JOIN, CROSS JOIN을 사용해

여러 테이블을 합쳐 필요한 값만 가져올 수 있는데

각각 두 테이블에서 같은 값만(INNER JOIN)

왼쪽에만 값이 있어도(LEFT JOIN)

오른쪽에만 값이 있어도(RIGHT JOIN)

모든 경우의 수가 나오게(CROSS JOIN)

 

기능은 차례대로 알아보자

 

먼저 TB1 테이블에는 영희와 철수라는 값이 들어있고

TB2 테이블에는 영희와 희영이라는

값이 들어있다는 것을 전제로 한다

 

INNER JOIN

INNER JOIN은 두 테이블에서 조건이 같은 값만 가져오는데

 

SELECT ...
FROM 테이블A INNER JOIN 테이블B
  ON A.컬럼명 = B.컬럼명

위의 쿼리와 같이

FROM 테이블A INNER JOIN 테이블B

ON A.컬럼명 = B.컬럼명

으로 JOIN 시켜주면 조건이 같은 값만 나오게 된다

 

위 예제에서는 TB1에는 영희와 철수

TB2에는 영희와 희영이 들어있으니

조회 시에는 동일한 영희만 출력된다

 

LEFT, RIGHT JOIN

LEFT, RIGHT JOIN은 

LEFT RIGHT 기준으로 한 테이블에 값이 들어있으면

다른 테이블에는 값이 들어있지 않아도

ROW가 출력되게 되는데

 

-- LEFT, RIGHT OUTER JOIN (한쪽에만 값이 있어도 출력)
SELECT A.컬럼명, B.컬럼명
  FROM 테이블A A LEFT OUTER JOIN 테이블B B
    ON A.컬럼명 = B.컬럼명;

위와 같은 쿼리로 JOIN 시켜주면 된다

 

위 예제에서는 TBL1에는 철수, 영희가 들어있고

TBL2에는 영희, 희영이 들어있는데

LEFT JOIN을 사용하면

TBL2에는 '철수'라는 값이 없어도 TBL1에 있기 때문에

TBL2의 NAME 컬럼 동일 여부와는 상관없이

출력시키는 것을 볼 수 있다

 

여기서 LEFT OUTER JOIN이 아닌 LEFT JOIN만 써도 동작하는데

LEFT OUTER JOIN이 모든 데이터베이스에 먹히는 ANSI 방식이라

 ANSI를 사용하면 DB별 JOIN 방법을 배울 필요가 없어지니

OUTER를 넣고 JOIN하는 것을 권장한다

 

CROSS JOIN

마지막으로 모든 경우의 수가 나오게 하는 CROSS JOIN인데

두 테이블에서 모든 경우의 수를 볼 일이 딱히 없기 때문에

실제 업무에서는 거의 사용되지 않는다

 

하지만 사용방법은 짚고 넘어가자면

 

SELECT 컬럼
  FROM 테이블A A CROSS JOIN 테이블B B

위와 같이 두 테이블 사이에 CROSS JOIN을 넣어 조회를 하니

두 테이블의 모든 경우의 수가 나오는 것이 보인다

 

마지막으로 예제에 사용한 쿼리는 아래와 같다

 

WITH TBL1 AS -- 가상 테이블
            (
              SELECT '철수' AS NAME
              UNION ALL
              SELECT '영희' AS NAME
            ),
    TBL2 AS 
            (
              SELECT '영희' AS NAME
              UNION ALL
              SELECT '희영' AS NAME
            )

-- INNER JOIN (같은 항목만 조회)
SELECT A.NAME
  FROM TBL1 A INNER JOIN TBL2 B
    ON A.NAME = B.NAME;
    
-- LEFT, RIGHT OUTER JOIN (한쪽에만 값이 있어도 출력)
SELECT A.NAME, B.NAME
  FROM TBL1 A LEFT OUTER JOIN TBL2 B
    ON A.NAME = B.NAME;
    
SELECT A.NAME, B.NAME
  FROM TBL1 A RIGHT OUTER JOIN TBL2 B
    ON A.NAME = B.NAME;  

-- CROSS JOIN (모든 경우의 수가 나오게)
SELECT A.NAME, B.NAME
  FROM TBL1 A CROSS JOIN TBL2 B;
반응형

댓글