[SQL] 여러 테이블 한번에 다루기(UNION, INTERSECT, MINUS)

WOOK JONG KIM·2022년 12월 15일
0

mysql기초

목록 보기
8/13
post-thumbnail

집합 연산

합집합(UNION)

[쿼리 A] UNION [쿼리B] 또는 [쿼리 A] UNION ALL [쿼리B] 형식으로 사용
-> UNION은 동일한 값은 제외하고 보여주고, UNION ALL은 동일한 값도 표현 해서 보여줌
-> 두 쿼리의 결과값의 개수가 같아야함 (다르면 에러 발생)

ORDER BY는 쿼리 가장 마지막에 작성 가능하고, 앞에 쿼리에서 가져온 칼럼으로만 가능

교집합(INTERSECT), 차집합(MINUS)

MYSQL 에는 이 두 표현이 존재하지 않아 JOIN을 사용해 표현 함

교집합을 확인하고 싶은 컬럼은 모두 다 기준으로 두고 합춰줘야 한다
-> 단순 INNER JOIN과의 차이

차집합을 확인하고 싶은 칼럼은 모두 다 기준으로 두고 합쳐야 함


코드 예시

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);

SELECT type
from mypokemon
UNION
SELECT type
from friendpokemon; 

SELECT number, name
FROM mypokemon
WHERE type = 'grass'
UNION ALL
SELECT number, name
FROM friendpokemon
WHERE type = 'grass';

SELECT t1.name
FROM mypokemon as t1
INNER JOIN friendpokemon as t2
ON t1.name = t2.name;

SELECT t1.name
FROM mypokemon as t1
LEFT JOIN friendpokemon as t2
ON t1.name = t2.name
WHERE t2.name IS NULL;
profile
Journey for Backend Developer

0개의 댓글