내일배움캠프/SQL

[SQL]SELF JOIN,UNION_SQL에서 FULL OUTER JOIN 구현하기

dydatablog 2024. 12. 2. 16:59

JOIN의 종류

  • INNER JOIN, LEFT JOIN : 복습↓

https://dydatablog.tistory.com/20

 

[SQL] 다른 테이블 합치기 JOIN

JOIN이 필요한 경우필요한 데이터가 서로 다른 테이블에 있을 때예) 주문 가격은 주문테이블에 있지만, 어떤 수단으로 결제를 했는지는 결제테이블에 있어요 JOIN의 기본 원리와 종류기본적으로

dydatablog.tistory.com

  • SELF JOIN : 동일한 테이블을 합쳐서 테이블 내의 데이터를 비교하거나 그룹화할 때 유용 → 특정 조건(예: 같은 연령대의 고객)을 만족하는 매칭 찾기
--예시 :같은 연령대, 다른 성별에 속한 고객 간 매칭결과를 조회하기
SELECT c1.연령대, 		--4.그 중 다음 데이터를 조회
       c1.고객ID AS 고객1_ID, 
       c1.이름 AS 고객1_이름, 
       c1.성별 AS 고객1_성별, 
       c2.고객ID AS 고객2_ID, 
       c2.이름 AS 고객2_이름, 
       c2.성별 AS 고객2_성별
FROM customers c1 		--1.customer테이블을 c1으로 지정
INNER JOIN customers c2		--3.customer테이블에서 2.에 해당하는 값을 가져와서 INNER JOIN 하고 c2로 지정
ON c1.연령대 = c2.연령대 		--2.INNER JOIN하는 기준 값은 연령대
AND c1.성별 != c2.성별;		--2.그리고, 성별은 같지 않을 것.
AND c1.고객ID < c2.고객ID; 	#중복제거!!

 

> 쿼리 결과:

연령대 고객1_ID 고객1_이름 고객1_성별 고객2_ID 고객2_이름 고객2_성별
10대 1 김채영 F 8 신예준 M
10대 5 강예린 F 8 신예준 M
30대 6 선현수 M 9 김민주 F

 

 

  • FULL OUTER JOIN : MySQL에서는 이 기능을 사용할 수 없다(Postgre, ORACLE는 가능). 대신 UNION으로 구현할 수 있습니다.
  • UNION : 여러 SELECT 문의 결과를 수직으로 결합하면서 중복된 행은 제거 → 중복된 데이터가 제거되므로 성능이 다소 떨어질 수 있음! ※ 단, SELECT문의 열 수데이터 형식동일해야 합니다 ⚠️
  • UNION ALL : UNION과 동일하지만 중복된 행도 포함
-- UNION 예시: 중복 제거
SELECT 고객ID		--6.데이터의 고객ID를 추출
FROM customers		--1.customers테이블에서
WHERE 성별 = 'M'		--2. 성별이 M인 데이터와
UNION		--5. 두 데이터를 결합하면서 중복된 행은 제거
SELECT 고객ID		--4. 고객ID를 조회해서
FROM orders;		--3. orders에서


-- UNION ALL 예시: 중복 포함
SELECT 고객ID
FROM customers
WHERE 성별 = 'M'
UNION ALL
SELECT 고객ID
FROM orders

 

>쿼리 결과 :

고객ID
(UNION 결과)
고객ID
(UNION ALL 결과)
3 3
6 6
8 8
1 1
2 2
4 4
5 5
  8

 


LEFT JOIN + RIGHT JOIN + UNION 으로 FULL OUTER JOIN 구현하기

 

customers 테이블

고객ID 이름 연령대 성별 회원등급
1 김채영 10대 F 일반
2 김지우 20대 F VIP
3 안장훈 30대 M 일반

 

payments 테이블

고객ID 결제ID 결제금액
1 201 20000
3 202 50000
4 203 80000
 
SELECT c.고객ID, c.이름, p.결제ID, p.결제금액
FROM customers c
LEFT JOIN payments p
ON c.고객ID = p.고객ID

UNION

SELECT c.고객ID, c.이름, p.결제ID, p.결제금액
FROM customers c
RIGHT JOIN payments p
ON c.고객ID = p.고객ID;