😎
Onemorebottlee's TIL
  • 🤓Introduce
  • 📖DevLog
    • 💣Error
      • npm ERR! Cannot read properties of null (reading 'edgesOut')
      • git
        • src refspec main does not match any
      • NextJS
        • No img element
        • ReferenceError : document is not defined
        • `next/image` Un-configured Host
  • 📺Lecture
    • Nomad Coders
      • 초보자를 위한 리덕스 101
        • #0 Introduction
        • #1 PURE REDUX: COUNTER
        • #2 PURE REDUX: TO DO LIST
        • #3 REACT REDUX
        • #4 Redux Toolkit
      • 바닐라 JS로 그림 앱 만들기
      • React JS 마스터 클래스
        • #2 Styled Componnents
        • #3 TypeScript
        • #4 Crypto Tracker
        • #5 State Management
        • #6 Trello
        • #7 ANIMATIONS
      • Next.js 시작하기
        • #0 INTRODUCTION
        • #1 FRAMEWORK OVERVIEW
        • #2 PRACTICE PROJECT
      • Typescript로 블록체인 만들기
        • #1 Introduction
        • #2 Overview of TypeScript
        • #3 Functions
        • #4 Classes and Interfaces
        • #5 TypeScript Blockchain
      • SQL Master Class
        • #1 Introduction
        • #2 SQLite
        • #3 Data Definition Language
        • #4 Data Manipulation Language
        • #5 Subqueries and CTEs
        • #6 Indexes
        • #7 MySQL
        • #8 Foreign Keys
        • #9 JOINS
        • #10 Nomalization
        • #11 Events & Triggers
        • #12 Full-Text Indexes
        • #13 PostgreSQL
        • #14 Functions And Procedures
        • #15 Transactions
        • #16 Data Control Language
        • #17 PostgreSQL JSON Columns
        • #18 PostgreSQL Extensions
        • #19 MongoDB
        • #20 REDIS
        • #21 Javascript and Python Drivers
    • Udemy
      • TypeScript 마스터 with Webpack & React
        • [S1] 소개
        • [S2] 설치 및 설정
        • [S3] 타입 애너테이션 기초
        • [S4] 함수
        • [S5] 객체 타입
        • [S6] 배열 타입
        • [S7] 유니온타입
        • [S8] Tuple & Enum
        • [S9] 인터페이스
        • [S10] TypeScript 컴파일러
        • [S11] 미니 프로젝트 DOM, 타입 단언, 그리고 더 많은 내용
        • [S12] Class
        • [S13] TS Class
        • [S14] Generics ⭐⭐⭐⭐⭐
        • [S15] Narrowing
        • [S16] Type Declarations
        • [S17] Module
        • [S18] Webpack 과 TypeScript
        • [S19] React
    • 모두를 위한 컴퓨터 과학 CS50
      • 1. 컴퓨팅 사고
      • 2. C언어
      • 3. 배열
      • 4. 알고리즘
      • 5. 메모리
      • 6. 자료구조
    • 생활코딩
      • DATABASE
        • DATABASE1
  • 📚Book
    • 모던 자바스크립트 Deep Dive
      • 1장 프로그래밍
      • 2장 자바스크립트란?
      • 3장 자바스크립트 개발 환경과 실행 방법
      • 4장 변수
      • 5장 표현식과 문
      • 6장 데이터 타입
      • 7장 연산자
      • 8장 제어문
      • 9장 타입 변환과 단축 평가 ⭐⭐⭐
      • 10장 객체 리터럴
      • 11장 원시 값과 객체의 비교
      • 12장 함수 ⭐⭐⭐⭐
      • 13장 스코프
      • 14장 전역 변수의 문제점
      • 15장 let, const 키워드와 블록 레벨 스코프 ⭐⭐⭐
      • 16장 프로퍼티 어트리뷰트
      • 17장 생성자 함수에 의한 객체 생성
      • 18장 함수와 일급 객체 ⭐⭐
      • 19장 프로토타입 ⭐⭐⭐⭐⭐
      • 20장 strict mode
      • 21장 빌트인 객체 ⭐
      • 22장 this ⭐⭐⭐
      • 23장 실행 컨텍스트 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 24장 클로저 ⭐⭐⭐⭐⭐⭐⭐
      • 25장 클래스
      • 26장 ES6 함수의 추가 기능
      • 27장 배열 ⭐⭐⭐
      • 28장 Number
      • 29장 Math
      • 30장 Date
      • 31장 RegExp
      • 32장 String
      • 33장 7번째 데이터 타입 Symbol
      • 34장 이터러블
      • 35장 스프레드 문법
      • 36장 디스트럭처링 할당
      • 37장 Set과 Map
      • 38장 브라우저의 렌더링 과정⭐⭐⭐⭐⭐⭐⭐⭐
      • 39장 DOM ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 40장 이벤트⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 41장 타이머
      • 42장 비동기 프로그래밍 ⭐⭐⭐⭐⭐⭐⭐⭐
      • 43장 Ajax
      • 44장 REST API
      • 45장 프로미스
      • 46장 제너레이터와 async/await
      • 47장 에러 처리
      • 48장 모듈
      • 49장 Babel과 Webpack을 이용한 ES6+/ES.NEXT 개발 환경 구축
    • 러닝 타입스크립트
      • Ch.1 자바스크립트에서 타입스크립트로
      • Ch.2 타입 시스템
      • Ch.3 유니언과 리터럴
      • Ch.4 객체
      • Ch.5 함수
      • Ch.6 배열
      • Ch.7 인터페이스
      • Ch.8 클래스
      • Ch.9 타입 제한자
      • Ch.10 제네릭
      • Ch.11 선언 파일
      • Ch.12 IDE 기능 사용
      • Ch.13 구성 옵션
      • Ch.14 구문 확장
      • Ch.15 타입 운영
      • 용어 사전
    • 자바스크립트 완벽 가이드
    • SQL in 10 Minutes
      • 1장 SQL 이해하기
      • 2장 데이터 가져오기
      • 3장 가져온 데이터 정렬하기
      • 4장 데이터 필터링
      • 5장 고급 데이터 필터링
      • 6장 와일드카드 문자를 이용한 필터링
      • 7장 계산 필드 생성하기
      • 8장 데이터 조작 함수 사용하기
      • 9장 데이터 요약
      • 10장 데이터 그룹핑
      • 11장 서브쿼리 사용하기
      • 12장 테이블 조인
      • 13장 고급 테이블 조인 생성하기
      • 14장 쿼리 결합하기
      • 15장 데이터 삽입하기
      • 16장 데이터 업데이트와 삭제
      • 17장 테이블 생성과 조작
      • 18장 뷰 사용하기
      • 19장 저장 프로시저 사용하기
      • 20장 트랜잭션 처리 관리하기
      • 21장 커서 사용하기
      • 22장 고급 데이터 조작 옵션
    • 면접을 위한 CS 전공지식 노트
      • 4 데이터베이스
        • 4.1 데이터베이스의 기본
    • 2023 이기적 SQL 개발자 이론서 + 기출문제
      • 데이터 모델링 이해
        • S1. 데이터 모델링
  • 💻Study
    • CS 지식 발표
      • 1회차
      • 2회차
      • 3회차
      • 4회차
      • 5회차
      • 6회차
      • 7회차
      • 8회차
      • 9회차
    • TypeScript Exercises
      • Ex 1
      • Ex 2
      • Ex 3
      • Ex 4
      • Ex 5
      • Ex 6
      • Ex 7
      • Ex 8
      • Ex 9
      • Ex 10
  • 🔄ETC
    • Article
      • Atomic Design Pattern
      • 프론트엔드 개발자
    • DATABASE
      • Oracle
        • CEIL() & FLOOR() - 소수점 올림 & 내림
        • DUAL 테이블 - 임시 테이블로 결과 확인하기
    • Ubuntu
      • 어플리케이션 업데이트
Powered by GitBook
On this page
  • 뷰 이해하기
  • 왜 뷰를 사용하는가?
  • 뷰 규칙과 제한
  • 뷰 생성하기
  • 복잡한 조인을 단순화하기 위한 뷰 생성하기
  • 가져온 데이터의 형식을 변환하기 위해 뷰 사용하기
  • 원하지 않는 데이터를 필터링하기 위해 뷰 사용하기
  • 계산 필드와 함께 뷰 사용하기
  • 정리하기
  • 도전 과제

Was this helpful?

  1. Book
  2. SQL in 10 Minutes

18장 뷰 사용하기

뷰 이해하기

뷰는 가상 테이블이다. 데이터를 가진 테이블과 달리, 동적으로 데이터를 가져오는 쿼리들을 담고 있을 뿐이다. 오직 사용될때만 !

예시로 이해하자

SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
    AND OrderItems.order_num = Orders.order_num
    AND prod_id = 'RGAN01';

위 쿼리를 ProductCustomers라는 가상 테이블로 묶는다고 생각하면

SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';

과 같다. 전보다 단순해졌다. 그럼 왜 뷰를 사용할까?

왜 뷰를 사용하는가?

뷰를 사용하는 이유는 다음과 같다.

  • SQL 문을 재사용하기 위해

  • 복잡한 SQL 작업을 단순화하기 위해 - 쿼리 자체에 대한 상세 내용을 몰라도 작성된 쿼리 사용이 가능하다.

  • 완전한 테이블이 아닌, 테이블의 일부만을 노출하기 위해

  • 데이터를 보호하기 위해 - 사용자는 전체 테이블이 아닌 특정 부분에만 접근 가능하다.

  • 데이터 형식을 변경하기 위해 - 뷰는 원래 테이블과 다른 형식으로 데이터를 가져올 수 있다.

일반적으로 뷰는 생성 후 테이블과 같은 방식으로 사용 가능하다. SELECT 작업, 데이터 필터링, 정렬, 다른 뷰나 테이블과 조인 등...

그럼에도 뷰는 뷰일 뿐이다. 데이터를 저장하지 않고 사용될 때만 다른 테이블에서 가져와 반환한다.

뷰 규칙과 제한

다음은가장 자주 사용되는 규칙 몇 가지와 뷰 생성과 사용을 통제하기 위한 제약 사항이다.

  • 뷰는 고유한 이름을 가져야 한다. 다른 테이블이나 뷰 이름을 사용할 수 없다.

  • 생성 가능한 뷰의 수는 제한 없다.

  • 뷰를 생성하기 위해 보안 권한을 가져야 한다.

  • 뷰는 뷰를 포함할 수 있다.

  • 많은 DBMS는 뷰 쿼리에서 ORDER BY 절의 사용을 금한다.

  • 일부 DBMS에서는 가져오는 모든 열에 이름을 부여해야 한다. 열이 계산 필드라면 별칭..

  • 뷰는 인덱스를 사용할 수 없다.

  • SQLite 같은 일부 DBMS는 뷰를 읽기 전용 쿼리로 처리한다. 뷰에서 데이터를 가져올 수 있지만 테이블에 데이터를 쓸 수는 없다.

  • 일부 DBMS에서는 삽입 또는 업데이트한 데이터가 뷰의 범위를 벗어나는 경우 삽입과 업데이트를 불허하는 뷰를 만들 수 있다.

DBMS 마다 다른 제약 사항이 있다. 매뉴얼을 참고하자.

뷰 생성하기

뷰는 CREATE VIEW 문으로 생성한다. CREATE TABLE처럼 존재하지 않는 뷰를 생성할 때만 사용할 수 있다.

뷰 이름 바꾸기

뷰를 덮어쓰거나 업데이트하려면, 뷰를 삭제한 후 다시 생성해야 한다.

뷰 삭제는 DROP 문을 사용한다. - DROP VIEW 뷰이름;

복잡한 조인을 단순화하기 위한 뷰 생성하기

뷰를 자주 사용하는 이유 중 하나는 복잡한 SQL을 숨기기 위해서다. 복잡한 SQL은 보통 조인을 포함하고 있다. 위 예시에서 생성한 가상 테이블 ProductCustomers이다.

SELECT VIEW ProductCustomers AS
SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
    AND OrderItems.order_num = Orders.order_num;

이렇게 생성한 테이블을 사용하면

SELECT cust_name, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';

와 같이 사용할 수 있다. 앞서 살펴본 것처럼 뷰는 복잡한 SQL 문을 매우 단순화할 수 있다. 또 필요시 재사용이 가능하다.

가져온 데이터의 형식을 변환하기 위해 뷰 사용하기

뷰는 가져온 데이터의 형식을 변환하기 위해서도 사용한다.

다음과 같은 쿼리를 주기적으로 사용한다고 가정해보자.

SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
FROM Vendors
ORDER BY vend_name;

이를뷰를 이용해 바꾸면

-- 뷰 생성
CREATE VIEW VendorLocation AS
SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')' AS vend_title
FROM Vendors;

-- 뷰 사용
SELECT * FROM VendorLocations;

와 같다. 데이터 형식을 바꾸는 로직을 한번에 묶어 언제든 재사용 가능하면서 단순화할 수 있다.

원하지 않는 데이터를 필터링하기 위해 뷰 사용하기

뷰는 WHERE 절과 함께 사용할 때도 유용하다.

예시를 보자.

CREATE VIEW CustomerEmailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL; -- 조건부 필터링이 가능하다. 이메일 있는 리스트를 출력한다.

계산 필드와 함께 뷰 사용하기

뷰는 계산 필드를 단수화할 때 특히 더 유용하다.

7장에서 사용한 계산 필드를 예시로 보자.

SELECT prod_id, quantity, item_price, quantity * item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;

제품별 총가격 (expanded_price)을 계산한 예시는 다음과 같이 뷰로 변경할 수 있다.

-- 뷰 생성
CREATE VIEW OrderItemsExpandes AS
SELECT prod_id, quantity, item_price, quantity * item_price AS expanded_price
FROM OrderItems;

-- 뷰 사용
SELECT *
FROM OrderItemsExpanded
WHERE order_num = 20008;

뷰로 계산 부분을 묶고 조건을 사용해 기능을 분리해 사용할 수 있다.

정리하기

  • 가상 테이블, 뷰

  • 뷰의 특징과 사용 방법

도전 과제

  1. 주문 내역이 있는 고객의 모든 열을 포함하도록 CustomersWithOrders라는 뷰를 작성하라. 원하는 고객을 거르기 위해 Orders 테이블과 조인할 수 있다. 그 후 데이터가 맞는지 확인하기 위한 SELECT 문을 작성한다.

  1. 다음 SQL 문은 무엇이 잘못되었는가?

CREATE VIEW OrderItemsExpanded AS
SELECT order_num, prod_id, quantity, item_price, quantity * item_price AS expanded_price
FROM OrderItems
ORDER BY order_num; -- 뷰 생성시 ORDER BY는 사용하지 않는다.

Previous17장 테이블 생성과 조작Next19장 저장 프로시저 사용하기

Last updated 1 year ago

Was this helpful?

📚