Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 뷰(View) 생성 방법 – CREATE VIEW 문법과 예제 총정리

MySQL에서 뷰(View)는 CREATE VIEW 문을 사용하여 생성합니다. 뷰는 하나의 테이블, 여러 개의 테이블, 또는 다른 뷰를 기반으로 만들 수 있습니다. 단, 뷰를 생성하려면 해당 환경에서 요구하는 적절한 시스템 권한을 사용자가 반드시 가지고 있어야 합니다.

CREATE VIEW의 기본 문법은 다음과 같습니다.

기본 문법

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

각 구성 요소의 의미를 하나씩 살펴보겠습니다.

  • CREATE VIEW – 새로운 뷰를 생성하는 핵심 구문입니다.

  • view_name – 생성할 뷰의 이름입니다. 뷰는 항상 특정 데이터베이스에 속하며, 별도로 지정하지 않으면 현재 사용 중인 데이터베이스에 생성됩니다.

  • select_statement – 뷰의 정의를 담당하는 SELECT 문입니다. 기본 테이블(base table)뿐만 아니라 다른 뷰에서도 데이터를 조회할 수 있습니다.

  • column_list – 선택 사항입니다. 뷰 이름 바로 뒤에 뷰의 열(column) 이름 목록을 지정할 수 있으며, 각 이름은 고유해야 합니다. 목록의 이름 수는 SELECT 문이 반환하는 열의 수와 일치해야 합니다. 뷰의 열에 원래 이름과 다른 이름을 부여하고 싶다면 SELECT 목록에 [AS name] 절을 추가하면 됩니다.

  • OR REPLACE – 이 옵션을 함께 사용하면 동일한 이름의 기존 뷰를 대체하여 새로 생성합니다. 해당 이름의 뷰가 존재하지 않는다면 CREATE VIEW와 결과가 같습니다.

  • ALGORITHM – 선택 사항으로, MySQL이 뷰를 처리하는 방식에 영향을 줍니다. MERGE, TEMPTABLE, UNDEFINED 세 가지 값을 가질 수 있으며, 기본값은 UNDEFINED입니다.

  • [DEFINER = { user | CURRENT_USER }] [SQL SECURITY { DEFINER | INVOKER }] – 뷰가 호출되는 시점에 접근 권한을 검사할 때 사용할 보안 컨텍스트(security context)를 지정합니다. DEFINER 절을 명시할 경우, 유효한 사용자 값은 다음 규칙에 따라 결정됩니다.

    • SUPER 권한이 없는 사용자는 자신의 계정만 DEFINER로 지정할 수 있으며, 다른 계정을 설정할 수 없습니다.
    • SUPER 권한이 있는 사용자라면 문법상 유효한 모든 계정 이름을 지정할 수 있습니다.

참고로, SQL SECURITY DEFINER 특성으로 정의된 저장 루틴(stored routine) 내부에서는 CURRENT_USER가 해당 루틴의 DEFINER 값을 반환합니다. 따라서 그러한 루틴 안에서 정의된 뷰가 DEFINER 값으로 CURRENT_USER를 사용한다면 이 동작의 영향을 받게 됩니다.

  • [WITH [CASCADED | LOCAL] CHECK OPTION] – 업데이트 가능한 뷰(updatable view)에 적용할 수 있는 옵션으로, select_statement의 WHERE 조건이 참이 아닌 행에 대한 삽입(INSERT)이나 수정(UPDATE)을 차단합니다. 뷰가 다른 뷰를 기반으로 정의된 경우, LOCAL과 CASCADED 키워드가 검사 범위를 결정합니다. LOCAL은 현재 정의 중인 뷰에만 CHECK OPTION을 적용하고, CASCADED는 기반이 되는 하위 뷰들의 검사까지 함께 수행합니다. 두 키워드를 모두 생략하면 기본값은 CASCADED입니다.

실습 예제

이번 예제에서는 다음과 같은 데이터를 가진 'Customers' 테이블 위에 first_view라는 이름의 뷰를 생성해 보겠습니다.

mysql> Select * from Customers;
+-------------+----------+
| Customer_Id | Name     |
+-------------+----------+
| 1           | Rahul    |
| 2           | Yashpal  |
| 3           | Gaurav   |
| 4           | Virender |
+-------------+----------+
4 rows in set (1.30 sec)

mysql> Create view first_view AS SELECT * FROM Customers;
Query OK, 0 rows affected (0.36 sec)

뷰 생성이 완료되었습니다. 이제 뷰 이름을 사용하여 쿼리를 실행하면, 해당 뷰가 생성된 원본 테이블의 데이터를 그대로 조회할 수 있습니다.

mysql> Select * from first_view;
+-------------+----------+
| Customer_Id | Name     |
+-------------+----------+
| 1           | Rahul    |
| 2           | Yashpal  |
| 3           | Gaurav   |
| 4           | Virender |
+-------------+----------+
4 rows in set (0.13 sec)

이처럼 뷰를 활용하면 복잡한 쿼리를 미리 정의해 두고 필요할 때마다 간단하게 재사용할 수 있어, 데이터 관리와 보안 측면에서 매우 유용합니다.