본문 바로가기
Infra & Security Eng/Database Engineering

SQL 뷰 인라인뷰 개념,특징, 실제 문제

by 엔지니어 E 2026. 2. 12.
반응형

뷰의 개념과 종류 

뷰의 개념 
뷰는 데이터베이스에 들어있는 진짜 테이블을 바탕으로 맏느 가상 테이블 이다. 진짜 데이터가 저장되어 있는것은 아니지만, 사용자 눈에는 일반 테이블과 똑같이 보인다

뷰의 종류
1. 단순 뷰: 가징 기본이 되는 뷰
구조: 오직 하나의 테이블에서만 데이터를 가져와서 만듦
특징: 뷰를 통해서 데이터를 넣거나(insert), 수정하거나(update), 지우는(delete) 작업이 가능함
* 뷰에서 데이터를 바꾸면 원본 테이블의 데이터도 함께 바뀜
용도: 원본 테이블의 특정 컬럼(열) 만 골라서 보여주고 싶을때 사용 

2. 복합 뷰: 여러 가지 기능이 섞인 복잡한 뷰 
구조: 두 개 이상의 테이블을 합치거나(Join), 함수를 사용해 계산된 값(수식)을 포함함
특징: 여러 데이터를 섞어 놓았기 때문에, 뷰를 통해 원본 데이터를 수정(DML) 하는데 제한이 많음
* 보통 읽기 전용으로 많이 씀
용도: 여러 테이블에 흩어진 데이터를 하나로 묶어서 한 번에 확인하고 싶을 때 사용

 

✅ 한눈에 비교하기

구분 단순 뷰 (Simple View) 복합 뷰 (Complex View)
사용한 테이블 수 1개 2개 이상
함수/수식 사용 안 함 포함될 수 있음
데이터 수정(DML) 가능 대부분 불가능

 

뷰 명령어와 설명 

CREATE [OR REPLACE] [FORCE] VIEW 뷰_이름 (컬럼_이름, ...) -- 뷰를 새로 만들겠다는 기본 명령어
* OR REPLACE: 기존 것을 지우고 다시 만듦
* FORCE: 기반인 되는 테이블이 아직 없어도 일단 뷰를 강제로 만듦
컬럼 이름: 뷰에서 사용할 이름들을 직정 정할 수 있음. 안 적으면 원본 테이블의 이름을 그대로 가져옴

AS (불러올 데이터를 뽑는 SELECT 문장)
[WITH CHECK OPTION] -- 뷰의 조건에 맞는 데이터만 입력하거나 수정할 수 있게 함
* 예시: 나이가 20 세인 뷰라면, 이 뷰를 통해서는 19세 이하의 데이터를 넣지 못하게 막는 것
[WITH READ ONLY]; -- 읽기 전용. 데이터를 넣거나, 지우거나, 바꾸는 행동(DML)을 아예 못하고, 오직 조회(SELECT)만 가능함

 

뷰 삭제와 확인하기

뷰 삭제하는 명령어 
DROP VIEW 뷰 이름;

뷰 확인하는 명령어 
SELECT view_name, text FROM user_views;
* view_name은 뷰의 이름, text는 뷰를 만들 때 사용한 SELECT문(쿼리)를 보여준다 

* 뷰 권한은 함부로 주지 않는다. 뷰 생성시 GRANT create VIEW TO 사용자_이름; 로 권한 할당 한다 

 

실습 하기

CREATE VIEW ma_result (과목번호, 과목명, 학과, 기말고사평균) -- ma_result 라는 이름의 뷰를 만듦
AS 
SELECT c.cno, cname, major, ROUND(AVG(result)) -- 학번, 과목명, 학과, 점수평균(반올림) 선택

   FROM student s, course c, score r -- 학생(s), 과목(c), 성적(r) 3개 테이블 사용
   WHERE s.sno=r.sno AND r.cno=c.cno -- 학생 테이블과 성적 테이블을 학번으로 연결(Join)
   AND cname='유기화학' -- 과목명이 '유기화학'이 데이터만 필터링 
   GROUP BY c.cno, cname, major; -- 과목번호, 이름, 학과별로 그룹화하여 평균 계산

 

인라인 뷰(Inline  View)

SELECT 컬럼명
FROM (
    -- 여기에 있는 SELECT 문장이 먼저 실행되어
    -- 임시로 '가짜 테이블'을 만든다 (이것이 인라인 뷰)
    SELECT 컬럼1, 컬럼2 
    FROM 실제테이블
    WHERE 조건
) 별명 -- 이 가짜 테이블의 이름을 지어줘야 한다 (필수)
WHERE 조건;

보통 FROM 뒤에는 데이터를 꺼내올 테이블 이름이 온다. 하지만 인라인 뷰는 테이블 이름 대신 괄호() 안에 SELECT 문장을 직접 넣어서 테이블처럼 사용하는것을 말함 **쿼리 안에 들어있는 쿼리** 라고 이해하면 됨 

 

인라인 뷰 실습 하기

각 부서별 최소 급여자를 검색 한다 

SELECT eno, ename, d.dno, sal, msal
FROM emp e, 
     (SELECT dno, MIN(sal) msal FROM emp GROUP BY dno) d -- [인라인 뷰]
WHERE e.dno = d.dno  -- 조인 조건
AND sal = msal;      -- 필터 조건



1. 가장 먼저 괄호 안(인라인 뷰)를 실행 한다
- emp 테이블에서 부서번호(dno)별로 그룹을 묶어 가장 낮은 급여((MIN(sal)))을 찾는다
- 이 결과물에 d 라는 임시 이름을 붙여 가상 테이블로 만든다
* 해당 명령어까지 실행한 게 위의 사진이다

2. 메인 테이블(e)과 가상 테이블(d)을 합친다(Join)
- e.dno=d.dno 조건을 통해 같은 부서끼리 옆으로 붙인다

3. 사원의 실제 급여(sal)가 최소 급여(msal)와 일치하는 사람만 남긴다



단계별 설명 (더 자세한 프로세스) 



1단계: 인라인 뷰(가짜 테이블) 만들기
컴퓨터는 괄호 () 안의 내용을 가장 먼저 처리 한다
(SELECT dno, MIN(sal) msal FROM emp GROUP BY dno) d * (SELECT DNO ~): d(가상 테이블)
1.emp 테이블을 부서별(GROUP BY dno)로 묶고, 그중에서 제일 작은 월급(MIN(sal))을 찾는다
2. 이 때 계산된 결과(MIN(sal))에 msal 이라는 별명을 부여한다
3. 위 사진처럼 부서별 최소 월급 리스트가 메모리에 잠시 만들어진다



2단계: 원본 테이블과 합치기(join)
진짜 사원 정보가 있는 원본 테이블(e)과 방금 만든 리스트(d)를 나란히 세운다
(FROM emp e, ... d)
(WHERE e.dno = d.dno)
사원 테이블의 부서 번호(e.dno)와 리스트(d)의 부서 번호(d.dno)가 같은 것끼리 옆으로 붙인다



3단계: 진짜 최소 급여자인지 비교하기
AND sal = msal
사원의 실제 월급(sal)과 아까 옆에 붙여둔 쪽지의 숫자(msal)가 똑같은지 비교한다
A사원: 내 월급 3,000원, 우리 부서 꼴찌 월급 800원 -> 탈락(다름)
B사원: 내 월급 800원, 우리 부서 꼴찌 월급 800원 -> 합격(똑같음)



4단계: 최종 결과 출력
합격한 사람들의 정보만 화면에 뿌려준다