Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
Tags
- 디자인패턴
- linux 권한
- Tool Calling
- MCP
- PHP
- dhgrp
- SQL기초
- LLM
- MySQL
- 라라벨
- PHP객체지향
- SQL문법
- ai 에이전트
- 어댑터패턴
- SQL
- 데코레이터패턴
- 소프트웨어설계
- 인덱스
- 데이터베이스
- Laravel
- mcp client
- Agent Loop
- 매직메서드
- mcp server
- docker
- ai agent
- 객체지향
- docker network
- OOP
- 객체복제
Archives
- Today
- Total
개발블로그
[SQL] VIEW 본문
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 |