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;
'[패스트캠퍼스] 데이터분석부트캠프 > SQL' 카테고리의 다른 글
[4주차] SQL: 제약 조건, DCL, TCL (0) | 2023.03.10 |
---|---|
[4주차] SQL: SUBQUERY 서브쿼리 (0) | 2023.03.10 |
[3주차] SQL: 조건식, 함수 만들기 (0) | 2023.03.10 |
[3주차] SQL: JOIN(INNER, OUTER) (0) | 2023.03.09 |
[3주차] SQL: FROM절 서브쿼리 SUBQUERY, LIST IN (0) | 2023.03.08 |