SQL

[MySQL] 5. UNION과 VIEW

찰리-누나 2022. 12. 24.

 

 

 

 


UNION


sql 작업을 하다 보면 여러개의 SELECT문을 사용하게 된다. 보통의 sql 툴은 작업 결과를 여러개의 탭에 나누어 출력해준다. 예를 들어 아래의 세 개의 SELECT문을 실행하면 다음과 같이 결과가 세 개의 탭으로 나누어 각각 출력된다.

 

이 결과들을 여러개의 탭이 아닌, 하나의 탭에서 한번에 보려면 어떻게 해야할까? 이럴 때 바로 UNION을 사용해 줄 수 있다. UNION을 사용할 때에는 반드시 컬럼의 개수가 같아야 한다. 또한 보편적으로 동일한 데이터타입, 동일한 컬럼 이름을 가진 데이터를 출력할 때 주로 사용한다. 

 


조회 쿼리 1
UNION
조회 쿼리 2

 

UNION 결과. 세로로 합쳐서 출력된다.

결과를 살펴보면 이상한 점을 발견할 수 있다. 마지막 조회 쿼리인 SELECT id, name, age FROM pet.aboutpet WHERE id IN (3,4,5) 부분이 따로 출력되지 않고, pet.aboutpet을 전부 조회하는 첫 조회 쿼리에 덮혀 생략당했다. 

 

이처럼 UNION에 아무런 옵션을 주지 않으면 UNION은 자동으로 중복을 제거한다. 중복을 제거하지 않고 모두 출력하려면 UNION ALL 을 사용한다.

 


조회 쿼리 1
UNION ALL
조회 쿼리 2

중복된 결과가 잘 출력되었다.

 

JOIN은 조건을 기준으로 양 옆으로 테이블을 붙여 출력해주며, UNION은 출력한 결과를 세로로 붙여 나열해준다는 차이점이 있다.

 

 

 


VIEW



VIEW란 가상의 테이블을 뜻한다. 사용한 쿼리의 결과물을 진짜 테이블이 아닌 '가상'의 테이블로 잠시 저장해 놓고 싶은 경우 사용한다. VIEW는 실제 테이블에 사용할 수 있는 쿼리들을 사용할 수 있지만 실제 테이블이 아니기 때문에 하드의 용량을 많이 차지하지 않는 장점이 있다. 또한 view로 만든 결과를 이용해 다시 view를 만들 수도 있다.

 


CREATE VIEW 뷰이름 AS
SELECT * FROM 테이블이름 WHERE 조건

aboutpet의 id가 3,4,5인 값들만 조회한 결괴를, view1이라는 이름의 뷰로 만들어본다.

create문
Views 폴더에 view1이 생성되었다.

 

 

VIEW 는 가상이지만 테이블과 같은 역할을 하기 때문에 DML을 사용할 수 있다. 그러나 모든 VIEW에 사용 가능한 것은 아니다. MySQL에서 DML을 사용할 수 있는 VIEW는 오직 단순 뷰 뿐인데, 뷰에는 '단순 뷰'와 '복합 뷰'가 있다.

 

단순 뷰 

- 하나의 테이블로 생성됨

- 그룹 함수의 사용이 불가능함

- Distinct의 사용이 불가능함

- DML의 사용이 가능함

 

복합 뷰

- 여러개의 테이블로 생성됨 (JOIN)

- 그룹 함수와 Distinct의 사용이 가능함

- DML의 사용이 불가능함

 

 

실습으로 만든 것은 단순 뷰이기 때문에 DML을 사용해 줄 수 있다. 그러나 이 또한 유의점이 있다. SELECT, UPDATE, DELETE, INSERT INTO 쿼리를 각각 사용해 보았다.

순서대로 SELECT, UPDATE, DELETE, INSERT 문이다.

 

세 번째와 마지막 결과를 통해 UPDATE, DELETE, INSERT INTO 쿼리의 결과가 '원본 테이블' 에 반영되었음을 확인할 수 있다. 먼저 세 번째 사진에서 UPDATE문으로 바꾸어준 '도레' 와 INSERT 문이 원본 테이블인 aboutpet에 반영되었음을 확인할 수 있다. DELETE를 실행하자 마찬가지로 원본 테이블의 레코드가 변경되는 것을 유의하여 사용해야 한다. 

 


 

https://dev.mysql.com/doc/refman/8.0/en/create-view.html

 

MySQL :: MySQL 8.0 Reference Manual :: 13.1.23 CREATE VIEW Statement

13.1.23 CREATE VIEW Statement CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] [DEFINER = user] [SQL SECURITY { DEFINER | INVOKER }] VIEW view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION] The CREATE VIEW

dev.mysql.com

 

댓글