Day 09. 여러 테이블 한번에 다루기
1. 여러 테이블 한번에 다루기
요청 : 나와 친구의 모든 포켓몬 데이터를 한번에 가져와 주세요.
집합 연산
2. 데이터에 데이터 더하기
합집합 연산자
UNION
UNION ALL
[쿼리A] UNION [쿼리B] 또는 [쿼리A] UNION ALL [쿼리B] 형식으로 사용.
[쿼리A]와 [쿼리B]의 결과값을 합쳐서 보여준다.
UNION은 동일한 값은 제외하고 보여주며, UNION ALL은 동일한 값도 포함하여 보여준다.
[쿼리A]와 [쿼리B]의 결과 값의 개수가 같아야 한다.
만약, 다를 경우 에러가 발생.
ORDER BY는 쿼리 가장 마지막에 작성 가능하고, [쿼리A]에서 가져온 컬럼으로만 가능하다.
UNION
UNION ALL 쿼리 문법
SELECT [컬럼이름]
FROM[테이블A 이름]
UNION
SELECT [컬럼이름]
FROM[테이블B 이름];
SELECT [컬럼이름]
FROM[테이블A 이름]
UNION ALL
SELECT [컬럼이름]
FROM[테이블B 이름];
UNION
UNION ALL 사용 예제
SELECT number, name, attack
FROM mypokemon
UNION
SELECT number, name, attack
FROM friendpokemon
ORDER BY number;
※ ORDER BY는 쿼리 가장마지막에 작성가능하고, [쿼리A]에서 가져온 컬럼으로만 가능하다.
이름은 같지만, attack이 다르므로 라이츄가 2개가 출력되었다.
3. 데이터에서 데이터 빼기
INTERSECT 교집합
MINUS 차집합
하지만, MY SQL에서는 두 표현이 존재하지 않음!
따라서 JOIN을 사용해 이를 표현한다.
교집합 쿼리 문법
SELECT [컬럼이름]
FROM[테이블A 이름] AS A
INNER JOIN [테이블B 이름] AS B
ON A.[컬럼1 이름] = B.[컬럼1 이름] AND ... AND A.[컬럼n 이름] = B.[컬럼n 이름];
※ 교집합을 확인하고 싶은 컬럼은 모두 다 기준으로 두고 합쳐줘야함 (단순 INNER JOIN과의 차이점)
교집합 예제
차집합 쿼리 문법
SELECT [컬럼이름]
FROM[테이블A 이름] AS A
LEFT JOIN [테이블B 이름] AS B
ON A.[컬럼1 이름] = B.[컬럼1 이름] AND ... AND A.[컬럼n 이름] = B.[컬럼n 이름]
WHERE B.[컬럼이름] IS NULL;
※ 차집합을 확인하고 싶은 컬럼은 모두 다 기준으로 두고 합쳐줘야함
차집합 예제
4. [실습] 여러 테이블의 데이터를 한번에 조회해보자 (UNION)
[ 포켓몬 입력 쿼리]
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 type
FROM mypokemon
UNION
SELECT type
FROM friendpokemon;
MISSION (2)
내 포켓몬과 친구의 포켓몬 중에 풀(grass) 타입 포켓몬들의 포켓몬 번호와 이름을 중복 포함하여 전부 다 가져와 주세요.
SELECT number, name
FROM mypokemon
WHERE type = 'grass'
UNION ALL
SELECT number, name
FROM friendpokemon
WHERE type = 'grass';
5. [실습] 여러테이블을 다뤄서 원하는 값을 가져와보자
MISSION (1) 나도 가지고 있고, 친구도 가지고 있는 포켓몬의 이름을 가져와주세요.
SELECT A.name
FROM mypokemon AS A
INNER JOIN friendpokemon AS B
ON A.name = B.name;
MISSION (2) 나만 가지고있고, 친구는 안가지고 있는 포켓몬의 이름을 가져와주세요
SELECT A.name
FROM mypokemon AS A
LEFT JOIN friendpokemon AS B
ON A.name = B.name
WHERE B.name IS NULL;
'Structured Query Language > MY_SQL_basic' 카테고리의 다른 글
SQL_Basic_09_Day 10. 조건에 조건 더하기 (0) | 2022.08.09 |
---|---|
SQL_Basic_07_Day 08. 테이블 합치기 (0) | 2022.08.09 |
SQL_Basic_06_Day 07. 규칙 만들기 (0) | 2022.08.07 |
SQL_Basic_05_Day 06. 데이터 그룹화 하기 (0) | 2022.08.07 |
SQL_Basic_04_Day 05. 원하는 데이터 만들기 (0) | 2022.08.07 |