패스트캠퍼스

[패스트캠퍼스] 데이터 분석 부트캠프 17기 - 9주차 (1) MySQL JOIN

geraedo 2025. 2. 4. 14:50

1. 기준으로 테이블 합치기 (INNER JOIN)

- 두 테이블 모두에 있는 값만 합치기

 

SELECT [컬럼]

FROM [테이블 A 이름] 

INNER JOIN [테이블 B 이름]

ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]

WHERE 조건식;

 

- 다른 사용법

: select [컬럼] from [테이블1] a, [테이블2] b where a.컬럼=b.컬럼; 

: select wt1.name from world_tour1 wt1, world_tour2 wt2

  where wt1.cast = wt2.cast <> '기안84'; # 기안84는 제외하고 name 출력

 

2. 한쪽을 기준으로 테이블 합치기 (LEFT, RIGHT JOIN)

- 왼쪽 테이블에 있는 값 / 오른쪽 테이블에 있는 값

 

SELECT [컬럼]

FROM [테이블 A 이름] 

LEFT/RIGHT JOIN [테이블 B 이름]

ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]

WHERE 조건식;

 

- 없는 값은 NULL로 표시됨

- 실무에서는 left join 을 많이 사용함 

 

3. 다양한 방식으로 테이블 합치기 (OUTER, CROSS, SELF JOIN)

 

- OUTER JOIN 두 테이블에 있는 모든 값 합치기

- LEFT JOIN + UNION + RIGHT JOIN

- UNION : 두 쿼리의 결과를 중복을 제외하고 합쳐서 보여주는 집합 연산자

 

SELECT [컬럼]

FROM [테이블 A 이름] 

LEFT JOIN [테이블 B 이름]

ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름]

UNION

SELECT [컬럼]

FROM [테이블 A 이름] 

RIGHT JOIN [테이블 B 이름]

ON [테이블 A 이름].[컬럼 A 이름] = [테이블 B 이름].[컬럼 B 이름];

 

 

 

CROSS JOIN 두 테이블에 있는 모든 값을 각각 합치기

SELECT [컬럼 이름]

FROM [테이블 A 이름] 

CROSS JOIN [테이블 B 이름]

WHERE 조건식;

 

- SELF JOIN 같은 테이블에 있는 값 합치기

SELECT [컬럼 이름]

FROM [테이블 A 이름] AS t1

INNER JOIN [테이블 A 이름] AS t2

ON t1.[컬럼 A 이름] = t2.[컬럼 B 이름]

WHERE 조건식;

 

4. 실습[1]

 

MISSION (1) 

SELECT A.name, B.attack, B.defense

FROM mypokemon as A

LEFT JOIN ability as B

ON A.number = B.number;

 

MISSION (2) 

SELECT B.number, A.name

FROM mypokemon as A

RIGHT JOIN ability as B

ON A.number = B.number;

 

5. 실습[2]

 

MISSION (1)

SELECT type, avg(height)

FROM mypokemon as A

LEFT JOIN ability as B

ON A.number = B.number

GROUP BY type;

 

MISSION (2)

SELECT type, avg(weight)

FROM mypokemon as A

LEFT JOIN ability as B

ON A.number = B.number

GROUP BY type;

 

MISSION (3) 

SELECT type, avg(height), avg(weight)

FROM mypokemon as A

LEFT JOIN ability as B

ON A.number = B.number

GROUP BY type;

 

MISSION (4)

SELECT A.number, name, attack, defense

FROM mypokemon as A

LEFT JOIN ability as B

ON A.number = B.number

WHERE A.number >= 100;

 

MISSION (5)

SELECT name

FROM mypokemon as A

LEFT JOIN ability as B

ON A.number = B.number

ORDER BY attack+defense desc;

 

MISSION (6)

SELECT name

FROM mypokemon as A

LEFT JOIN ability as B

ON A.number = B.number

ORDER BY speed desc

LIMIT 1;

 


여러 테이블 한번에 다루기

 

1. 데이터에 데이터 더하기 (UNION, UNION ALL, 합집합)

- [쿼리A] UNION [쿼리B] /  [쿼리A] UNION ALL [쿼리B] : 결과값을 합쳐서 보여줌

- UNION 은 동일한 값 제외, UNION ALL 은 동일한 값 포함

- 쿼리A 과 쿼리B의 결과 값의 개수가 같아야 함

- ORDER BY는 가장 마지막에 작성 가능, 쿼리A에서 가져온 컬럼으로만 가능

 

 

2. 데이터에서 데이터 빼기 (교집합, 차집합)

- INTERSECT, MINUS 가 존재하지 않아 JOIN으로 표현

- 교집합 INNER JOIN

- 차집합 LEFT JOIN

 

3. 실습[1]

 

MISSION (1)

SELECT distinct type FROM mypokemon 

UNION

SELECT distinct type FROM friendpokemon;

 

MISSION (2)

SELECT number, name, 'my' as whose FROM mypokemon WHERE type='grass'

UNION ALL

SELECT number, name, "friend's" as whose FROM friendpokemon WHERE type='grass'

 

4. 실습[2]

 

MISSION (1)

SELECT m.name

FROM mypokemon AS m INNER JOIN friendpokemon AS f

ON m.number = f.number;

 

MISSION (2)

SELECT m.name

FROM mypokemon as m LEFT JOIN friendpokemon as f

ON m.number = f.number

WHERE f. number IS NULL;

 

5. WITH ROLLUP

GROUP BY 사용 후 마지막에 붙이면 합계를 출력하는 행을 추가해줌

 

6. 윈도우 함수

PARTITION BY