Database/MySQL

[MySQL] 조인

IT수정 2024. 9. 10. 17:15

조인(JOIN)이란 2개 이상의 테이블에서 쿼리를 작성하는 방법이다. 보통 잘 설계한 관계형 데이터베이스의 테이블은 1가지 이상의 엔티티(Entity)를 포함한다. 조인은 테이블 A의 열과 B의 열을 포함해 검색할 수 있게 만들어 준다. 처음부터 한 테이블에 필요한 열을 만들면 되지않을까라고 생각할 수도 있다. 하지만 그렇게되면 데이터 중복 저장 문제가 생길 수 있다. 그렇기 때문에 조인을 이용하는 것이 효율적인 방법이다.

* 데이터베이스의 테이블 : 중복과 공간 낭비를 피하고 데이터 무결성을 위해서 여러 개의 테이블로 분리하여 저장

* 엔티티 : 저장되고 관리되어야 하는 데이터

 

내부 조인

조인은 상황에 따라 여러 종류로 구분해 사용한다. 내부 조인(INNER JOIN)은 가장 많이 사용하는 조인이다.

-- 내부 조인의 기본 형식
SELECT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
WHERE [검색 조건]
-- INNER JOIN을 JOIN이라고만 써도 INNER JOIN으로 인식
SELECT
a.symbol,
a.sector,
b.date,
b.volume
FROM Acompany AS a
INNER JOIN Bcompany AS b ON a.symbol = b.symbol
WHERE a.symbol = '값'
  AND b.date >= '2021-10-01'
  AND b.date < '2021-11-01';

 

상단의 쿼리를 보면 SELECT 문에는 각 테이블의 검색할 열을 나열했다. 이 때 테이블의 열 이름이 유일하다면 별칭을 사용하지 않아도 되지만 현재는 두 테이블에 같은 이름의 열이 있으므로 별칭을 사용했다. FROM 문에는 조인할 테이블의 이름을 입력한다. ON 문은 테이블을 조인할 때 조인 조건으로 사용할 열을 지정한다. 위 쿼리에서는 symbol 열을 조인 조건으로 사용했다. 자세히 말하자면 symbol 열이 '값' 인 값만 검색하도록 조건을 추가했으며, 10월 데이터만 검색하고자 date 조건에 날짜 연산도 추가했다.

 

ON 문과 WHERE 문의 차이
많은 사람들이 조인을 학습할 때 ON문과 WHERE 문의 역할을 혼동한다. 두 구문은 데이터를 필터링한다는 점에서 비슷해 보이지만 실제는 완전히 다르다. ON 문은 조인할 때 조인 조건을 위해 사용하며, WHERE 문은 조인을 완료한 상태에서 조건에 맞는 값을 가져오고자 사용한다. 반드시 둘의 성격을 분리해서 사용하자.

 

3개 이상의 테이블 조인

SELECT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
INNER JOIN [테이블 3] ON [테이블 2.열] = [테이블 3.열]
WHERE [검색 조건]
SELECT
a.industry,
c.symbol,
c.company_name,
c.ipo_year,
c.sector
FROM Acompany AS a
INNER JOIN Bcompany AS b ON a.num = b.num
INNER JOIN Ccompany AS c ON b.symbol = c.symbol
WHERE a.industry = '자동차'
ORDER BY c.symbol;

 

외부 조인

내부 조인은 두 테이블을 조인해 조인 조건으로 사용한 열에 있는 같은 값을 조합해 검색했다. 하지만 다른 테이블에 있는 행에서 일치 항목이 아닌 행을 조합해 검색해야 할 때도 있다. 그런 경우에 외부 조인(Outer Join)을 사용한다. 예를 들어 상품을 주문한 고객과 주문하지 않은 고객을 포함해 주문 내역을 함께 검색하고 싶다면 외부 조인을 사용할 수 있다.

-- 외부 조인의 기본 형식. <>로 감싼 항목은 1개만 선택해야 한다는 뜻이다.
SELECT [열 이름]
FROM [테이블 1]
<LEFT, RIGHT, FULL> OUTER JOIN [테이블 2] ON [테이블 1.열] = [테이블 2.열]
WHERE 검색 조건

 

LEFT OUTER JOIN

SELECT
a.symbol AS a_symbol,
b.symbol AS b_symbol
FROM Acompany AS a
LEFT OUTER JOIN Bcompany AS b ON a.symbol = b.symbol;

 

RIGHT OUTER JOIN

SELECT
a.symbol AS a_symbol,
b.symbol AS b_symbol
FROM Bcompany AS a
RIGHT OUTER JOIN Acompany AS b ON a.symbol = b.symbol;

 

FULL OUTER JOIN

SELECT
a.symbol AS a_symbol,
b.symbol AS b_symbol
FROM Bcompany AS a
FULL OUTER JOIN Acompany AS b ON a.symbol = b.symbol;

 

교차 조인

자주 사용하진 않지만, 각 테이블의 모든 경우의 수를 조합한 데이터가 필요할 경우 교차 조인을 사용할 수 있다. 카르테시안 곱(Cartesian Product)이라고도 한다.

-- 교차 조인의 기본 형식
SELECT [열 이름]
FROM [테이블 1]
CROSS JOIN [테이블 2]
WHERE [검색 조건]

 

기본 형식을 자세히 보면 조인 조건(ON)이 없다. 한 테이블에 저장된 모든 행이 다른 테이블의 행을 조인하므로 조인 조건이 필요 없기 때문이다.

-- 샘플 데이터 생성
CREATE TABLE testTBL1(num INT);
CREATE TABLE testTBL2(name CHAR(10));
INSERT INTO testTBL1 VALUES (1), (2), (3);
INSERT INTO testTBL2 VALUES ('Do'), ('It'), ('SQL');

SELECT
a.num, b.name
FROM testTBL1 AS a
CROSS JOIN testTBL2 AS b

 

셀프 조인

셀프 조인(Self Join)은 같은 테이블을 사용하는 특수한 조인이다. 셀프 조인을 사용하는 방법은 지금까지 배운 조인과 같다. 용어 그대로 자기 자신을 조인에 사용한다는 것만 기억하자. 한 가지 주의 사항은 반드시 별칭을 사용해야 한다는 것이다. 그렇지 않으면 오류가 발생한다.

SELECT
a.symbol,
b.company_name
FROM Acompany AS a
INNER JOIN Acompany AS b
ON a.symbol = b.symbol;

 

'Database > MySQL' 카테고리의 다른 글

[MySQL] 공통 테이블 식  (0) 2024.09.10
[MySQL] 서브 쿼리  (0) 2024.09.10
[MySQL] 내장 함수 - 제어 흐름 함수, 문자열 함수  (0) 2024.09.10
[MySQL] 변수와 형 변환  (0) 2024.09.10
[MySQL] 데이터 형식  (0) 2024.09.10