🛠️Skill/SQL
[SQL문법] JOIN문 / NATURAL, INNER, CROSS, OUTER, SELF JOIN
Istj_eff
2022. 11. 8. 20:03
1. NATURAL JOIN
- 같은 이름을 가진 칼럼 전체에 대한 등가(=EQUI) 조인
- 앨리어스나 테이블명 사용 불가
- USING 조건절이나 ON 조건절 사용 불가
- 같은 데이터 유형 칼럼만 조인 가능
💡
SELECT 컬럼이름1, 컬럼이름2
FROM 테이블이름1 NATURAL JOIN 테이블이름2;
2. INNER JOIN
- 행에 동일한 값이 있는 칼럼 조인, JOIN의 디폴트 옵션
- USING 조건절이나 ON 조건절 필수 ★
- CROSS JOIN, OUTER JOIN과 동시 사용 불가
- 두 테이블에 동일 이름 칼럼이 있을 경우 SELECT절에 앨리어스 필수 ★
- USING 조건절에는 앨리어스나 테이블명 사용 불가
💡
SELECT 컬럼이름1, 컬럼이름2
FROM 테이블이름1 A, 테이블이름2 B
WHERE A.컬럼 = B.컬럼;
SELECT 컬럼이름1, 컬럼이름2
FROM 테이블이름1 A INNER JOIN 테이블이름2 B
ON A.컬럼 = B.컬럼;
3. CROSS JOIN
- 가능한 모든 조합으로 조인
- 서로 연관된 칼럼이 없을 경우 조인 조건없이 수행하는 조인</aside>
💡
SELECT 컬럼이름1, 컬럼이름2
FROM 테이블이름1, 테이블이름2;
SELECT 컬럼이름1, 컬럼이름2
FROM 테이블이름1 CROSS JOIN 테이블이름2;
✅CROSS JOIN 예제
# CROSS JOIN
SELECT *
FROM stock_industry CROSS JOIN stock_info;
# 이중JOIN
SELECT A.NAME_, A.FiscalPrd_, A.Value_, C.NAME
FROM financial_info AS A
JOIN stock_mapping AS B -- A테이블과 B테이블을 CODE기준으로 JOIN
ON A.CODE = B.CODE
JOIN stock_info C -- 위에 JOIN한것과 C테이블을 ID기준으로 JOIN
ON C.ID = B.ID;
# 아래로 JOIN 더 추가할 수 있다.
SELECT A.NAME_, A.FiscalPrd_, A.Value_, C.NAME, D.IndName
FROM financial_info AS A JOIN stock_mapping AS B
ON A.CODE = B.CODE
JOIN stock_info C
ON C.ID = B.ID
JOIN stock_industry D
ON C.IndCode = D.IndCode;
4. OUTER JOIN
- 조인 조건에서 행에 동일한 값이 없는 칼럼 조인
- USING 조건절이나 ON 조건절 필수★
- LEFT OUTER JOIN / RIGHT OUTER JOIN / FULL OUTER JOIN</aside>
💡
SELECT 컬럼이름1, 컬럼이름2
FROM 테이블이름1 A LEFT OUTER JOIN 테이블이름2 B ON A.컬럼=B.컬럼;
✅INNER JOIN 예제
# LEFT JOIN
SELECT *
FROM stock_industry as a LEFT JOIN stock_info as b
ON a.IndCode = b.IndCode;
# OUT
IndCode IndName Region ID IndCode Ticker Name Mkt_Capitalization_USD
1167 Industrial & Commercial Services null null null null null null
1363 Investment Holding Companies KR 251240 1363 138040 MERITZ FINANCIAL GROUP INC 3686
1715 Industrial Services US 286465 1715 SQ SQUARE INC 120179
5. SELF JOIN
- 자기 자신의 테이블을 참조하는 조인으로 OUTER든 INTTER든 자신의 테이블과 조인하면 SELF JOIN 임
- 같은 테이블 이름이 2번 나와서 반드시 앨리어스(AS) 필수★
- 계층형 쿼리를 작성할 때 사용한다
6. 문제
✅1) Financial_Info 테이블과 JOIN을 활용하여 산업 별 평균 세전 이익을 구해보세요.
SELECT d.IndName, avg(a.Value_) as 평균세전이익
FROM financial_info as a
join stock_mapping as b -- a테이블과 b테이블을 code컬럼 기준으로 join
on a.code = b.code
join stock_info as c -- c테이블과 id컬럼을 기준으로 join
on b.id = c.id
join stock_industry d
on d.IndCode = c.IndCode
WHERE a.NAME_ = 'pretax income' -- a테이블의 name컬럼에서 pretax income만 필터
group by d.IndCode -- c테이블의 indcode기준으로 묶어서 보여줘
order by 2; -- 2번째 컬럼기준 정렬
# OUT
IndName 평균세전이익
Utilities -154063.1429
Transportation 29763.9608
Retailers 44098.2857
Industrial Goods 48194.9417
✅2) ETF_Info 테이블과 JOIN을 활용하여 Asset_Type 별로 종가의 평균, 최대값, 최소값을 구해보세요.
select a.Asset_Type, avg(b.Close_) '종가평균', max(b.Close_) '최대값', min(b.Close_) '최소값'
from etf_info a
join stocketf_price b
on a.id = b.id
group by a.Asset_Type;
# OUT
Asset_Type 종가평균 최대값 최소값
Commodity 39.78582045854705 193.89 7.93
Equity 101.65248140026685 375.39 14.63
Fixed Income 98.12512651349769 178.36 51.88
Specialty 87.60855629017811 92.73 83.6