본문 바로가기

SQL/교육,실습

SQL데이터 분석 첫걸음 실습 (UNION, UNION ALL)

day8 은

여러 테이블 한번에 다루기

데이터에 데이터 더하기

데이터에서 데이터 빼기

의 항목들을 여러 테이블 한번에 다루기 라는 주제로 교육을 마저 진행하였다.

오늘 배운 교육을 바탕으로 실습을 진행해 보겠다.

 

오늘은 여러 테이블의 데이터를 한 번에 조회해 볼 것이다.

주어지는 테이블은 이 테이블을 참고 할 것이다.

실습1

내 포켓몬과 친구의 포켓몬에 어떤 타입들이 있는지 중복 제외하고 같은 타입은 한 번 씩만 가져와 주세요. 

먼저 여기서 UNION, UNION ALL 의 특징을 정리하자면

§ [쿼리 A] UNION [쿼리B] 또는 [쿼리 A] UNION ALL [쿼리B] 형식으로 사용합니다.

§ [쿼리 A]와 [쿼리 B]의 결과 값을 합쳐서 보여줍니다.

§ UNION은 동일한 값은 제외하고 보여주며, UNION ALL은 동일한 값도 포함하여 보여줍니다.

 

§ [쿼리 A]와 [쿼리 B]의 결과 값의 개수가 같아야 합니다.

    만약, 다를 경우 에러가 발생합니다.

§ ORDER BY는 쿼리 가장 마지막에 작성 가능하고, [쿼리 A]에서 가져온 컬럼으로만 가능합니다.

 

쿼리 문법은 각각

 

SELECT [컬럼 이름]

FROM [테이블 A 이름]

UNION

SELECT [컬럼 이름]

FROM [테이블 B 이름];

 

SELECT [컬럼 이름]

FROM [테이블 A 이름]

UNION ALL

SELECT [컬럼 이름]

FROM [테이블 B 이름];

이다.

 

이번 실습에서는 보기와 같이

두 테이블을 더하는데 타입들만 가져오는 것이다.

이때 union을 사용하여 중복값은 제외하고 

같은타입은 나오지 않도록 distinct를 사용하였다.

실습2

내 포켓몬과 친구의 포켓몬 중에 풀(grass) 타입 포켓몬들의 포켓몬 번호와 이름을 중복 포함하여 전부 다 가져와 주세요

실습1과 union 을 union all 로 바꾸고

where 을 이용하여 조건을 추가하였다.

테이블 이름을 쓸때 수고를 덜기위해 AS를 활용하여 간단한 별명을 사용했다.

실습3

나도 가지고 있고, 친구도 가지고 있는 포켓몬의 이름을 가져와 주세요

day7에서 공부했던 join을 활용하여

둘의 교집합을 inner join을 통해 얻는다.

join에는 꼭 on절이 필요하고 같은 이름의 컬럼을 묶는다.

실습4

나만 가지고 있고, 친구는 안 가지고 있는 포켓몬의 이름을 가져와 주세요

나만 가지고 있어야 하기 때문에 mypokemon 테이블을 기준으로 join 하여야 하고

교집합에 포함하는 친구와 둘다 가지고 있는 포켓몬은 제외하기 위해 where절을 활용해 null로 변경한다.