Devops 엔지니어 솔렐레 IT

SQL 기초 - JOIN(내부/외부 조인), UNION, Sub Query(하위 쿼리) 본문

Devops 엔지니어가 알려주는 IT 기본 지식/데이터베이스 (Database)

SQL 기초 - JOIN(내부/외부 조인), UNION, Sub Query(하위 쿼리)

솔렐레_ 2019. 10. 8. 09:00

안녕하세요. 솔렐레입니다.
이번 포스팅에서는 두 개 이상의 테이블에서 데이터를 분석할 수 있는 JOIN, UNION에 대해서 정리하도록 하겠습니다. 관계형 데이터베이스에서는 데이터가 여러 테이블에 나뉘어 저장되어 있고 공통된 키 값을 이용하여 조인하여 원하는 데이터를 출력할 수 있습니다. 데이터는 조인을 통해 열로 합칠 수도 있고 UNION을 통해 행으로 합칠 수도 있습니다. 또한 다양한 조건이 필요한 데이터가 쉽게 처리될 수 있도록 SQL 문을 만들 수 있는 하위 쿼리에 대해서도 알아보도록 하겠습니다. 그럼 시작하겠습니다.


[SQL 기초 - JOIN: 내부 조인, 외부 조인]
1. 내부 조인

-- FROM/WHERE 사용
SELECT 테이블명1.열이름1, 테이블명2, 열이름2
FROM 테이블명1, 테이블명2
WHERE 테이블명1.KEY = 테이블명2.KEY;

-- INNER JOIN 사용
SELECT 테이블명1.열이름1, 테이블명2, 열이름2
FROM 테이블명1 INNER JOIN 테이블명2
ON 테이블명1.KEY = 테이블명2.KEY;

내부 조인은 교집합으로 두 키 값이 매칭 될 경우 선택된 모든 열을 출력하는 방법입니다. 두 테이블에 공통으로 존재하는 키 값이 되는 모든 행을 나타냅니다.  FROM/WHERE문을 사용하여 나타낼 수도 있고 INNER JOIN을 사용하여 SQL문을 작성할 수도 있습니다. INNER JOIN을 사용할 경우 ON 뒤에 두 테이블의 키 값을 적어야 합니다. 조인을 사용할 경우 AS 키워드를 사용하여 별칭을 준다면 더 파악하기 쉽게 쿼리문을 정리할 수 있습니다. 예를 들어 테이블명 1을 별칭으로 '회원' 그리고 테이블명 2를 '주문'으로 지정한다면 조건절에 WHERE 회원.KEY = 주문.KEY 로 정의하여 한눈에 보기 쉽도록 정의할 수 있습니다. 또한 타이핑으로 오류가 날 가능성도 줄여 오류도 줄일 수 있어 유용하게 사용이 가능합니다. 조인을 사용할 때 조건을 지정하지 않는다면 곱집합의 형태가 되어 모든 행과 데이터가 출력되어 나타나게 됩니다.

2. 외부 조인

-- LEFT OUTER JOIN
SELECT 테이블명1.열이름1, 테이블명2, 열이름2
FROM 테이블명1 LEFT (OUTER) JOIN 테이블명2
WHERE 테이블명1.KEY = 테이블명2.KEY;

--RIGHT OUTER JOIN
SELECT 테이블명1.열이름1, 테이블명2, 열이름2
FROM 테이블명1 RIGHT (OUTER) JOIN 테이블명2
WHERE 테이블명1.KEY = 테이블명2.KEY;

-- FULL OUTER JOIN
SELECT 테이블명1.열이름1, 테이블명2, 열이름2
FROM 테이블명1 FULL (OUTER) JOIN 테이블명2
WHERE 테이블명1.KEY = 테이블명2.KEY;

외부 조인은 크게 LEFT, RIGHT, FULL 이렇게 세 가지를 가지고 있습니다. LEFT OUTER JOIN은 왼쪽 테이블의 데이터를 기준으로 키 값에 맞는 오른쪽 테이블에 있는 데이터를 붙여 데이터를 출력합니다. 한 개의 키값에 두 개 이상의 값을 가지고 있으면 모든 값이 붙습니다. 예를 들어 WHERE절의 오른쪽 테이블 키 값이 2개가 존재한다면 왼쪽 테이블 데이터는 두 번 출력되게 됩니다. 왼쪽 테이블 데이터 기준으로 오른쪽 테이블의 키 값이 존재하지 않는다면 NULL 값으로 처리됩니다. LEFT JOIN은 *= 연산자로 나타낼 수 있습니다. 이와 반대로 RIGHT OUTER JOIN은 오른쪽 테이블을 기준으로 왼쪽 테이블의 데이터가 붙도록 출력됩니다. 또한 RIGHT조인은 =* 연산자로 나타낼 수 있습니다. FULL OUTER JOIN은 두 테이블의 합집합과 같으며 왼쪽 테이블과 오른쪽 테이블의 모든 열들을 나열하여 나타냅니다. 테이블을 통합할 때 기준이 되는 테이블을 가장 먼저 나타내면 데이터 분석에 용이하게 사용할 수 있습니다. 단 MySQL 같은 몇몇 DBMS에서는 FULL OUTER JOIN이 지원되지 않으므로 사용에 참고해주시면 될 것 같습니다. 외부 조인을 사용할 때도 별칭을 사용하여 쿼리를 작성한다면 더 가독성 좋은 쿼리문이 만들어질 것입니다.


[SQL 기초 - UNION, UNION ALL]

-- 행 합치기 (중복 없음)
SELECT 열이름1, 열이름2 FROM 테이블명1 WHERE 조건절
UNION
SELECT 열이름1, 열이름2 FROM 테이블명2 WHERE 조건절
ORDER BY 1;

-- -- 행 합치기 (중복 포함)
SELECT 열이름1, 열이름2 FROM 테이블명1 WHERE 조건절
UNION ALL
SELECT 열이름1, 열이름2 FROM 테이블명2 WHERE 조건절
ORDER BY 1;

UNION은 두 개 이상의 테이블 행을 합칠 때 사용하는 연산자입니다. 이는 두 개 이상의 SELECT문의 결과 값을 합치는 것을 의미합니다. 테이블 1과 테이블 2의 데이터를 모두 합칠 수도 있고 조건절에 따라 일부만 합칠 수도 있습니다. UNION 연산자를 사용할 때는 합쳐지는 SELECT 문의 열 숫자가 동일해야 하며 각 데이터 타입이 일치해야 합니다. 데이터가 합쳐지면서 중복되는 값은 사라지며 중복된 값을 보여주고 싶다면 UNION ALL을 사용합니다. 합친 열을 정렬하기 위해서는 ORDER BY 절과 같이 사용한다면 필요한 데이터를 합쳐서 정렬할 수 있습니다.

[SQL 기초 - 하위 쿼리(Sub Query)]

-- 조건에 맞는 대상자 선정 후 요약
SELECT 열이름1, 열이름2
FROM( 
SELECT * FROM 테이블명
WHERE 조건절 
) (AS) 별칭
WHERE 조건절;

-- 테이블 조인
SELECT 열이름1, 열이름2
FROM 테이블명1 (AS) 별칭1 LEFT OUTER JOIN
( 
SELECT * FROM 테이블명
WHERE 조건절 
) (AS) 별칭2
ON 별칭1.KEY = 별칭2.KEY;

-- IN절 사용 하위 쿼리
SELECT 열이름1, 열이름2
FROM 테이블명1
WHERE 열이름 IN(SELECT 열이름 FROM 테이블명2 WHERE 조건절);

하위 쿼리(Sub Query)란 SQL 문장 속에 또 다른 SQL 문이 속하여 두 번 이상의 질의를 통해 결과를 한 번에 얻어낼 수 있는 것을 의미합니다. 하위 쿼리를 사용하게 되면 복잡한 SQL문도 간단히 만들 수 있도 DBMS의 데이터 처리 속도도 향상할 수 있습니다.
FROM 절에서 하위 쿼리를 사용할 경우는 (1) 조건에 맞는 대상자를 선정 후, 요약할 경우 (2) 테이블을 조인할 때 용도로 사용합니다. 하위 쿼리를 사용할 때는 테이블 별칭을 꼭 주어야 합니다. WHERE 조건절에서 하위 쿼리를 사용할 경우엔 IN절과 함께 사용합니다. 전체 모집단에서 특정 세그먼트만 추출할 때 유용하게 사용할 수 있는 방법입니다.


이것으로 JOIN, UNION, 하위 쿼리에 대한 포스팅을 마치겠습니다. 실무에서 데이터를 사용하다 보면 여러 테이블을 사용하여 쿼리를 작성하게 됩니다. 필요한 데이터를 가공하고 원하는 데이터를 한 눈에 확인하기 위해서는 해당 구문에 대한 사용은 필수라고 생각합니다. SQL을 이제 시작하신 분들이라면 사용이 조금 어색하실 수 있지만 몇 번 사용하다보면 금세 익숙해지니 쿼리를 자주 작성하시면서 익히시는 게 중요할 것 같습니다. 감사합니다. :)

Comments