개발블로그

[SQL] VIEW 본문

STUDY/SQL

[SQL] VIEW

devmel 2026. 8. 1. 13:42
Contents 접기
 

VIEW의 기본 개념

개념

SELECT문의 내용을 데이터베이스에 이름과 함께 저장해 두고, 테이블처럼 조회할 수 있게 만든 객체

복잡한 SELECT문
        ↓
이름을 붙여 저장
        ↓
테이블처럼 간단하게 조회

 

사용하는 이유

복잡한 조회문을 단순하게 재사용하고, 조회 규칙을 통일하며, 필요한 데이터만 제한적으로 제공하기 위해 사용

  • 복잡한 조회문을 간단하게 사용할 수 있음
  • 같은 조회 규칙을 재사용 할 수 있음
  • 필요한 컬럼만 제공할 수 있음
  • 원본 테이블의 구조를 직접 노출하지 않을 수 있음
  • 자주 사용하는 집계 결과를 공통으로 제공할 수 있음

 

저장되는 것

조회 결과 데이터가 별도로 복사되어 저장되는 것이 아니라

주로 저장되는 것은 VIEW를 구성하는 SELECT문의 정의 

 

따라서 원본 테이블의 데이터가 바뀌면 VIEW를 다시 조회했을 때 변경된 내용이 반영 

 

원본 테이블과의 관계

VIEW는 원본 데이터를 참조하므로, 원본 테이블의 구조가 변경되면 VIEW에도 영향을 줄 수 있음. 

=> VIEW를 변경하거나 삭제할 때는 해당 VIEW를 사용하는 다른 쿼리나 프로그램이 있는지도 함께 확인. 

 

 

비교 : 테이블 · CTE

구분 테이블 VIEW CTE
저장되는 내용 실제 데이터 SELECT문 정의 쿼리 안에 작성한 임시 결과
데이터베이스에 객체로 저장 O O X
사용 범위 삭제 전까지 삭제 전까지 해당 쿼리 안에서만
원본 데이터 변경 반영 테이블 자체 데이터가 변경됨 다시 조회할 때 반영 쿼리 실행 시 반영
주요 목적 데이터 저장 조회문 재사용 한 쿼리 안에서 복잡한 조회 분리

 


 

문법

생성

CREATE VIEW 뷰명 AS
[SELECT 문]

 

조회

SELECT
    컬럼1,
    컬럼2,
    ...
FROM 뷰명
[WHERE 조건]
[ORDER BY 정렬_컬럼 [ASC | DESC]];

 

변경

VIEW에 저장된 SELECT문을 다시 정의 

-- 기존 VIEW가 있으면 새로운 정의로 교체하고, 없으면 새로 생성
CREATE OR REPLACE VIEW 뷰명 AS
[SELECT 문]

-- ALTER VIEW (일부 DBMS에서는 이 방법으로 기존 VIEW의 정의를 변경)
ALTER VIEW 뷰명 AS
[SELECT 문]

 

삭제

DROP VIEW 뷰명;

-- VIEW가 있을 때만 삭제
DROP VIEW IF EXISTS 뷰명;

 

 


 

수정 가능한 VIEW

VIEW의 구조가 단순한 경우에는 INSERT | UPDATE | DELETE를 실행하여 원본 테이블의 데이터를 변경할 수도 있다. 

 

EX]

-- 하나의 테이블에서 컬럼을 그대로 조회하는 단순한 구조
CREATE VIEW active_users AS
SELECT
    id,
    name,
    email,
    status
FROM users
WHERE status = 'active';

-- DBMS가 수정 가능한 VIEW로 판단한다면 다음과 같이 변경 가능
UPDATE active_users
SET name = '김백엔드'
WHERE id = 1;

-- 개념적 의미로는 아래와 동일
UPDATE users
SET name = '김백엔드'
WHERE id = 1
  AND status = 'active';

 

수정 가능한 VIEW의 일반적인 조건

보통 구조가 단순한 VIEW 

  • 하나의 원본 테이블만 조회
  • 원본 컬럼을 그대로 사용
  • 각 VIEW행이 원본 테이블의 한 행과 직접 연결
  • 집계나 그룹화가 없음 

수정이 제한되는 대표적인 형태 

  • GROUP BY
  • SUM(), COUNT() 등
  • DISTINCT - 여러 원본 행이 하나의 결과로 표현될 수 있음
  • UNION - 여러 조회 결과가 결합됨
  • 계산식 - 원본 컬럼과 직접 대응하지 않을 수 있음
  • 복잡한 JOIN - 어떤 원본 테이블을 변경할지 불명확할 수 있음 

 

WITH CHECK OPTION

VIEW를 통해 추가하거나 수정한 행이 계속해서 VIEW의 조건을 만족하도록 제한 

 

문법

CREATE VIEW 뷰명 AS
SELECT
    컬럼1,
    컬럼2,
    ...
FROM 테이블명
WHERE 조건
WITH CHECK OPTION;

 

EX]

CREATE VIEW active_users AS
SELECT
    id,
    name,
    email,
    status
FROM users
WHERE status = 'active'
WITH CHECK OPTION;

-- 다음 변경은 VIEW의 조건을 벗어나므로 실패 함
UPDATE active_users
SET status = 'inactive'
WHERE id = 1;

 

 


 

사용 시 주의사항

  • VIEW를 사용한다고 성능이 자동으로 좋아지지는 않음. 
  • 원본 테이블의 구조 변경에 영향을 받음
    => 원본 테이블의 구조를 변경하기 전에는 해당 테이블을 참조하는 VIEW가 있는지 확인
  • VIEW 정의에 SELECT * 사용 주의 
    원본 테이블에 컬럼이 추가되거나 구조가 변경되면 VIEW의 결과 구조가 예상과 달라질 수 있음. 
    또한 필요하지 않은 컬럼이나 민감한 컬럼까지 포함될 수 있다. 
    => 필요한 컬럼을 명확히 작성하는 것이 좋음
  • VIEW 내부의 ORDER BY가 최종 순서를 보장하지 않음
    VIEW 내부에 ORDER BY를 작성할 수 있는지는 DBMS와 쿼리 형태에 따라 다르며, 작성했던라도 외부 조회 결과의 순서를 항상 보장하는 것은 아님
    => 최종 결과를 정렬하려면 VIEW를 조회하는 쿼리에 ORDER BY를 작성
  • VIEW를 여러 단계로 중첩하면 구조를 파악하기 어려움 (VIEW가 다른 VIEW를 참조)
    최종 조회가 어떤 원본 테이블과 조건을 사용하는지 파악하기 어려워질 수 있음
    • 발생하는 문제
      • 쿼리 구조 파악이 어려움
      • 원본 컬럼 변경의 영향 범위가 커짐
      • 성능 문제의 원인을 찾기 어려움
      • VIEW간 의존 관계 관리가 복잡해짐
  • VIEW로 컬럼을 숨겼다고 보안이 자동으로 완성되지는 않음
    => 실제로 접근을 제한하려면 VIEW 구성뿐 아니라 데이터베이스 권한도 함께 설정해야 함.
  • VIEW 변경이 사용 중인 쿼리에 영향을 줄 수 있음
    => VIEW의 컬럼이나 조건을 변경하면 해당 VIEW를 사용하는 다른 쿼리나 프로그램에도 영향을 줄 수 있음.
    • 변경 전 확인
      • VIEW를 사용하는 쿼리 / 프로그램
      • 다른 VIEW에서의 참조 여부
      • 컬럼명과 자료형의 변경 여부

'STUDY > SQL' 카테고리의 다른 글

[SQL] 트랜잭션  (1) 2026.08.02
[SQL] 윈도우 함수  (0) 2026.08.01
[SQL] CTE (Common Table Expression)  (0) 2026.07.31
[SQL] SQL 표현식  (0) 2026.07.30
[SQL] 집합연산  (0) 2026.07.30