SQL기본(6): JOIN(INNER, OUTER, CROSS)
1. JOIN
데이터 중복을 최소화하며 다른 테이블과 조합으로 데이터 셋을 만들기 위해 사용
2. 종류:
- INNER JOIN(내부 조인)
- (LEFT, RIGHT, FULL) OUTER JOIN(모두 출력, 조건에 만족하지 않아도 해당 테이블 관련 출력)
- CROSS JOIN(조인에 포함된 테이블의 카티션 곱, 조인 조건이 없음)
- SELF JOIN(같은 테이블을 사용, 계층적 구조를 테이블화에 사용, AS명 반드시 사용, JOIN구문 없음)
1. SELECT <col> FROM INNER JOIN [table2] as T2 on T1.col1 = T2.col1 WHERE <col> = [value] ORDER BY [col]
-JOIN ON과 WHERE의 차이: ON은 조인 조건을 위한, WHERE은 조인 완료 후 조건에 맞는 값 필터를 위한
2. SELECT <col> FROM <LEFT, RIGHT, FULL> OUTER JOIN [table2] as T2 on T1.col1 = T2.col1
WHERE <col> = [value] ORDER BY [col]
-왼, 오 기준 테이블 지정, FULL OUTER는 모두 표시(합집합)
3. SELECT <col> FROM CROSS JOIN [table2] as T2
4. SELECT <col> T1.<col>, T2.<col> FROM [table1] as T1 INNER JOIN [table1] as T2 on T1.col1 = T2.col1
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 = N'MSFT' AND b.date >= '20211001' AND b.date < '20211101'
조인(같은 컬럼명이 아니어도 가능)
SELECT a.symbol, a.last_crawel_date, b.date
FROM nasdaq_company AS a
INNER JOIN stock AS b ON a.last_crawel_date = b.date
WHERE a.symbol = N'MSFT'
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 c.symbol
-- LEFT OUTER JOIN
SELECT a.symbol as a_symbol, b.symbol as b_symbol
FROM nasdaq_company AS a
LEFT OUTER JOIN industry_group_symbol AS b on a.symbol = b.symbol
-- RIGHT OUTER JOIN
SELECT a.symbol as a_symbol, b.symbol as b_symbol
FROM nasdaq_company AS a
RIGHT OUTER JOIN industry_group_symbol AS b on a.symbol = b.symbol
WHERE a.symbol is null
-- FULL OUTER JOIN
SELECT a.symbol as a_symbol, b.symbol as b_symbol
FROM nasdaq_company AS a
FULL OUTER JOIN industry_group_symbol AS b on a.symbol = b.symbol
WHERE a.symbol is null
--CROSS JOIN
CREATE TABLE doit_cross1 (num int)
INSERT INTO doit_cross1 VALUES (1), (2), (3)
SELECT*FROM doit_cross1
CREATE TABLE doit_cross2 (name nvarchar (10))
INSERT INTO doit_cross2 VALUES (N'Do'), (N'It'), (N'SQL')
SELECT*FROM doit_cross2
SELECT a.num, b.name
FROM doit_cross1 as a CROSS JOIN doit_cross2 as b WHERE a.num = 1
--SELF JOIN
SELECT a.date as a_date, a.[close] as a_close,
b.date as b_date, b.[close] as b_close, b.[close] - a.[close]
FROM DOITSQL.dbo.stock as a
LEFT OUTER JOIN DoItSQL.dbo.stock as b on a.date = dateadd(day, -1, b.date) AND a.symbol = b.symbol
WHERE a.symbol = N'MSFT' AND a.date >= '2021-10-01' AND a.date < '2021-11-01'
AND b.date >= '2021-10-01' AND b.date < '2021-11-01'
ORDER BY a.date
CREATE TABLE doit_left_a(
col_a NVARCHAR(10),
col_b INT)
INSERT INTO doit_left_a VALUES ('A', 10)
INSERT INTO doit_left_a VALUES ('B', 20)
INSERT INTO doit_left_a VALUES ('C', 30)
INSERT INTO doit_left_a VALUES ('D', 40)
INSERT INTO doit_left_a VALUES ('D', 50)
CREATE TABLE doit_left_b(
col_a NVARCHAR(10),
col_b NVARCHAR(10))
INSERT INTO doit_left_b VALUES ('A', 'FAST')
INSERT INTO doit_left_b VALUES ('C', 'SLOW')
INSERT INTO doit_left_b VALUES ('D', 'DOIT')
INSERT INTO doit_left_b VALUES ('D', 'SQL')
SELECT * FROM doit_left_a
SELECT * FROM doit_left_b
SELECT a. *, b. *
FROM doit_left_a AS a LEFT OUTER JOIN doit_left_b AS B ON a.col_a = b.col_a