데이터 더하기(합집합) UNION, ALL UNION
1. UNION / UNION ALL (합집합)
[쿼리A] UNION [쿼리B] 또는 [쿼리A] UNION ALL [쿼리B] 형식으로 사용
[쿼리A와 [쿼리B]의 결과의 값의 합을 보여 준다
UNION은 동일한 값을 제외하고 보여주고, UNION ALL은 동일값도 포함하여 보여준다
[쿼리A]와 [쿼리B] 결과 값의 개수가 같아야 한다. 만약, 다를 경우 에러 발생
ODER BY는 쿼리 가장 마지막에 작성하고 [쿼리A]에서 가져온 컬럼으로만 가능
*UNION 쿼리문법
SELECT [컬럼이름]
FROM [테이블A이름]
UNION
SELECT [컬럼이름]
FROM [테이블B이름];
*UNION ALL 쿼리문법
SELECT [컬럼이름]
FROM [테이블A이름]
UNION
SELECT [컬럼이름]
FROM [테이블B이름];
*UNION ALL 사용예제(동일값도 포함)
SLECT name
FROM mypokemon
UNION ALL
SLECT name
FROM friendpokemon;
*UNION 사용예제(동일값 제외)
SLECT name
FROM mypokemon
UNION
SLECT name
FROM friendpokemon;
*UNION 과 ODER BY 예제
SLECT number, name, attack
FROM mypokemon
UNION
SLECT number, name, attack
FROM friendpokemon
ODER BY number;
*ODER BY 는 쿼리 가장 마지막에 작성가능하며, 쿼리 A에서 가져온 컬럼으로만 가능
*raichu의 number는 동일값이지만 attack은 값이 다르므로 결과에 함께 나타남, 하나라도 다른 값이 있으면 다른 데이터로 여김
데이터에서 데이터빼기(교집합) INTERSECT
*MySQL 에서는 INTERSECT 표현 존재하지 않으므로 JOIN 사용해서 표현/ 교집합을 사용하고 싶은 컬럼은 모두 다 기준으로 두고 합쳐 줘야 함(단순 INNER JOIN과 차이점)
*교집합 쿼리문법
SELECT [컬럼이름]
FROM [테이블 A이름] AS A
INNER JOIN [테이블 B이름] AS B
ON A.[컬럼1 이름] = B. [컬럼1 이름] AND ... AND A.[컬럼n 이름] = B.[컬럼n 이름];
*교집합 예제
SELECT A name
FROM mypokemon AS A
INNER JOIN friendpokemon AS B
ON A.name = B.name;
*교집합 예제2
SELECT A name
FROM mypokemon AS A
INNER JOIN friendpokemon AS B
ON A. number = B. number AND A.name = B.name AND
A. type = B. type AND A.attack = B.attack AND
A.defense = B.defense;
데이터에서 데이터빼기(차집합) MINUS
*MySQL 에서는 INTERSECT 표현 존재하지 않으므로 JOIN 사용해서 표현
*왼쪽 차집합 쿼리문법
SELECT [컬럼이름]FROM [테이블 A이름] AS ALEFT JOIN [테이블 B이름] AS BON A.[컬럼1 이름] = B. [컬럼1 이름] AND ...AND A.[컬럼n 이름] = B.[컬럼n 이름]WHERE B.[컬럼이름] IS NULL;
*차집합 쿼리 예제SELECT A nameFROM mypokemon AS ALEFT JOIN friendpokemon AS BON A.name = B.nameWHERE B. name IS NULL;
*차집합 쿼리 예제2 (모든 컬럼이 똑같은 값이 존재하지 않으므로 raichu 포함)
SELECT A name
FROM mypokemon AS A
LEFT UNION friendpokemon AS B
ON A. number = B. number AND A.name = B.name AND
A. type = B. type AND A.attack = B.attack AND
A.defense = B.defense
WHERE B.name IS NULL;
<예제쿼리>
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)
내 포켓몬과 친구의 포켓몬에 어떤 타입들이 있는지 중복 제외하고 같은 타입은 한 번 씩만 가져와 주세요.
MISSION (2)
내 포켓몬과 친구의 포켓몬 중에 풀(grass) 타입 포켓몬들의 포켓몬 번호와 이름을 중복 포함하여 전부 다
가져와 주세요*/
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';
'SQL' 카테고리의 다른 글
[패스트캠퍼스] SQL 강의 : 데이터 삭제, 수정(DELETE, UPDATE)/ 제약 조건(CONSTRAINTS)/ 권한과 DCL(GRANT, REBOKE)/ 트랜잭션과 TCL(COMMIT, ROLLBACK, SAVEPOINT) (0) | 2022.12.28 |
---|---|
[패스트캠퍼스] SQL 강의 : 조건에 조건 더하기, 서브쿼리 사용하기 (0) | 2022.12.27 |
[패스트캠퍼스] SQL 강의 : 테이블 합치기, JOIN 함수 (2) | 2022.12.27 |
[패스트캠퍼스] SQL 강의 : 그룹함수 조건만들기/ 함수만들기 (0) | 2022.12.27 |
[패스트캠퍼스] SQL 강의 : 원하는 데이터 그룹하고 통계하기, 그룹함수 (0) | 2022.12.23 |