이번에는 테이블들을 집합관계로 표현해 쿼리로 표현하는 방법을 보겠다
1. 합집합
SQL 에서 합집합은 UNION 으로 나타낼 수 있다. 이 때 UNION 은 중복값은 빼고, UNION ALL 은 중복값도 함께 보여준다. 이때 주의할 점이 있는데 쿼리 A 와 쿼리 B 결과값의 개수가 같아야 한다는 것이다 ! 데이터 수가 다른 쿼리 두개에서는 UNION 메서드를 쓸 수 없다
쓰는 방법은 다음과 같이 간단한데,
WHERE 문을 쓸거면 UNION 앞에 쓰도록 하자!
이때 ORDER BY 역시 쿼리 A 에서 가져온 컬럼으로만 쓸 수 있다.
*만약 UNION 으로 가져왔는데 중복값이 있는 경우!
이 경우는 하나라도 값이 다른 경우 다른 값으로 생각해서 처리했기 때문에 생기는 문제다.
2. 교집합
MySQL 에서는 교집합이나 차집합을 구현할 수 있는 모듈은 따로 제공하지 않기 때문에 JOIN 을 이용해 구현해야 한다. 하나씩 살펴보자. 먼저 교집합의 경우에는 두 쿼리를 INNER JOIN 한 뒤에 , 교집합을 하고 싶은 컬럼을 모두 기준으로 두고 처리해야 한다는 것이다! 그래야 단순 INNER JOIN 과 다른 결과가 나올 수 있다.
3. 차집합
역시 JOIN 을 이용해 구현해 보자
LEFT 나 RIGHT JOIN 을 한 뒤에 WHERE 절에서 B 컬럼에서 Null 인 것만 가져오면 된다. (A 에는 있지만 B 에는 없는 데이터)
실습!
DROP DATABASE IF EXISTS pokemon;
CREATE DATABASE pokemon;
USE pokemon;
CREATE TABLE mypokemon (
number int,
name varchar(20),
type varchar(10),
attack int,
defense int
);
CREATE TABLE friendpokemon (
number int,
name varchar(20),
type varchar(10),
attack int,
defense int
);
INSERT INTO mypokemon (number, name, type, attack, defense)
VALUES (10, 'caterpie', 'bug', 30, 35),
(25, 'pikachu', 'electric', 55, 40),
(26, 'raichu', 'electric', 90, 55),
(133, 'eevee', 'normal', 55, 50),
(152, 'chikoirita', 'grass', 49, 65);
INSERT INTO friendpokemon (number, name, type, attack, defense)
VALUES (26, 'raichu', 'electric', 80, 60),
(125, 'electabuzz', 'electric', 83, 57),
(137, 'porygon', 'normal', 60, 70),
(153, 'bayleef', 'grass', 62, 80),
(172, 'pichu', 'electric', 40, 15),
(470, 'leafeon', 'grass', 110, 130);
/*
MISSION (1)
나도 가지고 있고, 친구도 가지고 있는 포켓몬의 이름을 가져와 주세요.
*/
SELECT m.name
FROM mypokemon AS m
INNER JOIN friendpokemon AS f
ON m.name = f.name;
/*
MISSION (2)
나만 가지고 있고, 친구는 안 가지고 있는 포켓몬의 이름을 가져와 주세요.
A (내가 가지고 있는 포켓몬) - B (친구가 가지고 있는 포켓몬)
*/
SELECT m.name
FROM mypokemon AS m
LEFT JOIN friendpokemon AS f
ON m.name = f.name
WHERE f.name IS NULL;
728x90
'데이터 엔지니어링 > SQL' 카테고리의 다른 글
[SQL] 숫자형 데이터에서 자주 쓰는 모듈 (0) | 2022.11.24 |
---|---|
[SQL] 문자형 데이터에서 자주 쓰는 모듈들 LOCATE, SUBSTRING, REPLACE 등 (0) | 2022.11.24 |
[SQL] 데이터 줄세우기 RANK, DENSE_RANK, ROW_NUMBER (0) | 2022.11.24 |
[SQL] 서브쿼리 (0) | 2022.11.23 |
[SQL] SQL의 여섯가지 조인 방법 + 예제 (0) | 2022.11.15 |