충분히 쌓여가는
02 내부 조인 본문
조인은 상황에 따라 여러 종류로 구분해 사용한다.
가장 많이 사용하는 조인인 내부 조인(Inner Join)으로 보통 조인이라고 하면 내부 조인을 가리킬 만큼 널리 쓰이는 형태.
내부 조인은 조인키에 해당하는 각 테이블의 열값을 비교해 조건에 맞는 값을 검색한다.
내부 조인의 기본 형식
SELECT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블 2] ON [테이블 1.열] = [테이블2.열]
WHERE [검색 조건]
INNER JOIN 문의 기본 개념
테이블 구조
고객 테이블과 주문 테이블
만약 고객의 주문 내역을 모두 확인하고 싶다면?
고객 테이블과 주문 테이블을 조인하되
고객 번호를 조인 조건으로 해야한다.
고객 테이블과 주문 테이블의 Inner Join
INNER JOIN으로 두 테이블을 종합해 총 2건의 데이터를 검색했다.
즉, 두 테이블의 고객 번호가 같은 0001과 0002에 해당하는 데이터만 조합해 검색했다.
INNER JOIN 문 사용(2개 테이블 조인)
조인은 2개 이상의 테이블을 전제로 하며, 실제 쿼리를 작성할 때는 SELECT 문에 다른 문을 추가하는 것이 아니라
FROM 문에 조인할 테이블을 나열한다.
nasdaq_company 테이블과 stock 테이블을 INNER JOIN 문으로 조인해 symbol이 'MSFT'인 기업 정보와 해당 기업의 2021년 10월 일별 주가 데이터를 검색한 쿼리
SELECT
a.symbol,
a.company_name,
a.ipo_year,
a.sector,
a.industry,
b.date,
b.[open],
b.[high],
b.[low],
b.[close],
b.adj_close,
b.volume
FROM nasdaq_company AS a INNER JOIN stock AS b
ON a.symbol = b.symbol
WHERE a.symbol = 'MSFT'
AND b.date >= '2021-10-01'
AND b.date < '2021-11-01';
SELECT 문에는 각 테이블에 검색할 열을 나열.
FROM 문에는 조인할 테이블 이름을 입력.
ON 문은 테이블을 조인할 때 조인 조건으로 사용할 열을 지정한다.
nasdaq_company 테이블 뒤에 AS a라고 별칭을 붙였다
-> nasdaq_company 테이블을 a라고 부른다라는 뜻.
테이블의 열 이름이 유일하다면 별칭(AS)를 사용하지 않아도 되지만, 두 테이블에 같은 이름의 열이 있으므로 별칭을 사용함.
별칭을 사용하지 않는다면 데이터베이스 엔진은 어떤 테이블의 열을 검색할지 판단할 수 없어 오류가 발생한다.
별칭은 테이블 이름이 길거나 중복될 경우 대체해 사용하기 좋다.
ON문과 WHERE 문의 차이
ON 조인할 때 조인 조건을 위해 사용하며, WHERE 문은 조인을 완료한 상태에서 조건에 맞는 값을 가져오고자 사용한다.
물론 ON 문에 조건을 다양하게 부여해 WHERE 문과 같은 효과를 내게 할 수도 있지만 조인 조건을 만족하는 데이터 매칭 과정에서 오차가 발생하므로 그렇게 해선 안된다.
INNER JOIN 문 사용하기(2개 이상의 조건 적용)
조인 조건으로 2개 이상의 열을 사용할 수도 있다.
조건은 AND, OR 등을 사용해 여러 조건을 조합할 수도 있다.
각 테이블의 symbol 열과 date, last_crawel_date 열이라는 두 쌍의 열을 조건으로 사용한 쿼리
(조건: 사용한 열값이 같은 데이터를 INNER JOIN해서 사용)
SELECT
a.symbol,
a.last_crawel_date,
b.date
FROM nasdaq_company AS a INNER JOIN stock AS b
ON a.symbol = b.symbol AND a.last_crawel_date = b.date
WHERE a.symbol = 'MSFT';
조인 조건의 열이 달라도 상관없음을 알 수 있다(a.last_crawel_date = b.date).
다만 비교를 위해 데이터 형이 같아야 한다.
하지만 조인 조건은 비교할 열을 지정하는 것이므로, 다른 열을 사용한다면 다른 데이터가 검색될 수 있는 만큼 비교 열을 정확히 구분할 수 있도록 한다.
INNER JOIN 문 사용(3개 이상의 테이블 조인)
3개 이상의 테이블을 조인할 때는 두 테이블의 관계가 다대다 관계인 경우가 많다
다대다 관계인 테이블
nasdaq_company 테이블의 다양한 symbol 정보를 본인의 관심 분야에 따라 편하게 검색하려고
industry_group 테이블과 industry_symbol 테이블의 정보를 별도 테이블에 저장하는 것.
industry_group 테이블:관심 분야에 따른 industry 정보를 저장
industry_group_symbol 테이블: 관심 종목의 symbol 정보를 저장
3개 이상의 테이블 INNER JOIN 기본 형식
SELECT [열 이름]
FROM [테이블 1]
INNER JOIN [테이블 2] ON [테이블1.열] = [테이블2.열]
INNER JOIN [테이블 3] ON [테이블2.열] = [테이블3.열]
WHERE [검색 조건]
industry_group 테이블에서 industry가 '자동차'인 그룹에 어떠한 symbol이 포함되며 해당 symbol의 company_name, ipo_year, sector는 무엇인지 검색하는 쿼리
SELECT
a.industry,
c.symbol,
c.company_name,
c.ipo_year,
c.sector
FROM industry_group AS a
INNER JOIN industry_group_symbol AS b ON a.num = b.num
INNER JOIN nasdaq_company AS c ON b.symbol = c.symbol
WHERE a.industry = N'자동차'
ORDER BY symbol;
SELECT 문의 industry 열은 industry_group 테이블과 nasdaq_company 테이블이 공통으로 가지며,
symbol 열은 industry_group_symbol 테이블과 nasdaq_company 테이블이 공통으로 가진다.
즉, 현재는 3개 이상의 테이블이 짝지어 조인할 때 서로 열이 중복된다.
이런 경우
INNER JOIN은 조건에 맞는 데이터만 검색하므로 NULL 데이터가 발생하지 않는다.
따라서 열이 중복된 상태에서 고려할 부분은 '성능'이다.
성능을 높이려면 인덱스가 형성된 열을 우선 사용하는 것이 좋다.
예를 들어 industry 열이 인덱스가 형성되어 있다면 이 열로 우선 INNER JOIN을 하고 symbol 열로 INNER JOIN을 한다.
인덱스란 데이터베이스에서 데이터 검색 성능을 높일 때 사용하는 것으로 책의 차례와 같다고 보면 된다.
또는 데이터양이 적은 열을 조인 조건으로 우선 사용하는 것이 좋다.
실제로 쿼리를 실행했을 때 데이터가 처리되는 순서는 쿼리에 작성된 순서가 아닌, 데이터베이스 엔진에서 판단한 순서이다.
'MSSQL > 테이블을 서로 통합하는 조인' 카테고리의 다른 글
06 서브 쿼리 (1) | 2024.10.09 |
---|---|
05 셀프 조인 (7) | 2024.10.09 |
04 교차 조인 (9) | 2024.10.09 |
03 외부 조인 (1) | 2024.10.09 |
01 조인 JOIN (1) | 2024.10.07 |