본문 바로가기

[패스트캠퍼스] 데이터분석부트캠프/SQL

[3주차] SQL: 합집합(UNION, UNION ALL), 교집합(JOIN), 차집합(JOIN)

 

1. UNION, UNION ALL

 

     #쿼리 1

     SELECT 컬럼

     FROM 테이블 1

 UNION

     #쿼리 2

     SELECT 컬럼

     FROM 테이블 2;

 

     #쿼리 1

     SELECT 컬럼

     FROM 테이블 1

 UNION ALL

     #쿼리 2

     SELECT 컬럼

     FROM 테이블 2;

 

 

→ 쿼리 1, 2의 결과값을 합쳐서 보여줌

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

** 쿼리 1, 2는 결과값의 개수가 같아야 함. 다르면 에러

     ORDER BY는 마지막에 쿼리1의 컬럼으로 만 작성 가능

 

 

 

# UNION, ORDER BY
	SELECT number, name, attack
	FROM mypokemon
UNION
	SELECT number, name, attack
    FROM friendpokemon
ORDER BY number;

 

 

 

Q1. 내 포켓몬과 친구의 포켓몬에 어떤 타입들이 있는지 중복 제외하고 같은 타입은 한 번씩

 

# 1 내 포켓몬과 친구의 포켓몬에 어떤 타입들이 있는지 중복 제외하고 같은 타입은 한 번씩
	SELECT DISTINCT type
    FROM mypokemon
UNION
	SELECT DISTINCT type
    FROM friendpokemon
;

 

Q2. 내 포켓몬과 친구의 포켓몬 중 grass타입 포켓몬들의 번호와 이름을 중복 포함해 전부

 

# 2 내 포켓몬과 친구의 포켓몬 중 grass타입 포켓몬들의 번호와 이름을 중복 포함해 전부
	SELECT number, name, 'my' AS whose -- 테이블 구분 위해 SELECT절에 문자 써주기
	FROM mypokemon
    WHERE type = 'grass'
UNION ALL
	SELECT number, name, "friend's" AS whose -- 컬럼명에 '를 쓰고 싶을 땐 바깥을 ""로 해주면 됨.
	FROM friendpokemon
    WHERE type = 'grass'
;

 

 

 

 

2. MySQL에서는 교집합, 차집합 키워드 없음 → JOIN 이용

 

교집합

: INNER JOIN은 단순히 테이블을 합쳐주는 개념이라면, 교집합은 완전히 같은 값을 가지고 있는지 보는 것

→ ON절에 AND를 사용하여 교집합을 확인 하고 싶은 컬럼 모두를 기준으로 두는 것

 

# name의 교집합
SELECT m.name
FROM mypokemon m
	JOIN friendpokemon f ON m.name = f.name;

 

# 모든 데이터 동일
SELECT m.name
FROM mypokemon m
	JOIN friendpokemon f ON m.number = f.number AND m.name = f.name
						AND m.type = f.type AND m.attack = f.attack
                    	AND m.defense = f.defense
;

 

 

 

차집합

: LEFT JON 이용

: 확인하고 싶은 컬럼 모두 기준으로

 

# 테이블 1 - 테이블2 

: 테이블1에서 테이블2와의 중복 데이터 삭제

SELECT 테이블 1.컬럼

FROM 테이블 1

   LEFT JOIN 테이블 2 ON 테이블1.컬럼1 = 테이블2.컬럼1 AND ... AND 테이블1.컬럼n = 테이블2.컬럼n

WHERE 테이블 2.컬럼 IS NULL;

 

# name 기준 차집합: 나는 있고 친구는 없는
SELECT m.name
FROM mypokemon m
	LEFT JOIN friendpokemon f ON m.name = f.name
WHERE f.name IS NULL;

 

라이츄빠짐