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;
'내일배움캠프 > SQL' 카테고리의 다른 글
[SQL]WINDOW함수 (0) | 2024.12.05 |
---|---|
[SQL]서브쿼리(Subquery)의 특징과 분류 (1) | 2024.12.02 |
[SQL]RAND함수 (0) | 2024.11.28 |
[DBeaver]My SQL 연결, No database selected 에러, 단축키 (1) | 2024.11.27 |
[SQL]코딩순서와 실행 순서, WHERE, HAVING 차이 (0) | 2024.11.27 |