[MySQL] VIEW

Main·2024년 9월 12일
0

MySQL

목록 보기
10/13
post-thumbnail

MySQL에서 View(뷰)는 하나 이상의 테이블에서 데이터를 조회하는 데 사용되는 가상 테이블입니다. 실제로 데이터를 저장하지 않으며, 테이블에 정의된 SQL 쿼리의 결과를 기반으로 생성됩니다. View는 복잡한 쿼리를 단순화하거나 특정 사용자에게 필요한 데이터만 제공하는 데 주로 사용됩니다.


View의 특징

  • View는 실제 데이터가 저장되지 않는 가상 테이블입니다. 데이터를 보여줄 뿐, 저장된 테이블에서 쿼리할 때마다 결과가 갱신됩니다.
  • 복잡한 쿼리를 View로 정의해 두면, 매번 복잡한 쿼리를 작성할 필요 없이 View를 통해 쉽게 데이터에 접근할 수 있습니다.
  • 일부 View는 데이터를 조회만 할 수 있으며, 특정 조건을 만족하는 경우 데이터를 수정할 수도 있습니다.
  • 테이블의 전체 데이터를 노출하지 않고, 특정 데이터만 접근하도록 제한할 수 있습니다.
  • 집계 함수가 들어가는 뷰는 수정이 불가능합니다.
  • View를 업데이트 가능합니다.
  • View를 삽입하는 것은 조건이 존재합니다. 테이블의 모든 필드의 값을 넣어주어야하며 일부만 넣어주면 생성이 불가능합니다. 전체를 다 넣거나 디폴트를 지정해주어야합니다.

View의 장점

  • 여러 테이블을 조인하거나 특정 조건을 적용해야 하는 복잡한 쿼리를 View로 만들어두면, 간단히 데이터를 조회할 수 있습니다.
  • View를 사용해 특정 사용자가 접근할 수 있는 데이터를 제한할 수 있습니다. 예를 들어, 민감한 정보를 제외한 데이터만 노출할 수 있습니다.
  • 테이블 구조가 변경되더라도 View만 수정하면 기존 쿼리 로직을 쉽게 유지할 수 있습니다.
  • 테이블의 구조나 내부 동작을 사용자에게 노출하지 않고, 비즈니스 로직에 맞는 데이터만 보여줄 수 있습니다.

View의 단점

  • 한 번 정의된 View는 변경할 수 없습니다.
  • View는 매번 실제 테이블에서 데이터를 조회하기 때문에, 복잡한 View나 많은 데이터를 조회하는 경우 성능에 영향을 미칠 수 있습니다.
  • 일반적으로 View는 읽기 전용이며, 특정 조건을 만족해야 데이터를 삽입하거나 수정할 수 있습니다.
  • View 자체는 인덱스를 가질 수 없기 때문에, 복잡한 View에서는 인덱스가 잘 작동하지 않을 수 있습니다.

예시 코드 테이블 생성 및 데이터 삽입

예시 코드에 사용될 테이블 생성 및 데이터를 삽입합니다.

아래 sql문을 복사하여 테이블 생성 및 데이터를 삽입해주세요.

CREATE TABLE Employee (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    department_id INT,
    salary DECIMAL(10, 2)
);

CREATE TABLE Department (
    department_id INT PRIMARY KEY,
    department_name VARCHAR(50)
);

INSERT INTO Department (department_id, department_name) VALUES
(1, 'Sales'),
(2, 'HR'),
(3, 'IT');

INSERT INTO Employee (employee_id, first_name, last_name, department_id, salary) VALUES
(101, 'John', 'Doe', 1, 55000),
(102, 'Jane', 'Smith', 2, 60000),
(103, 'Emily', 'Johnson', 3, 75000),
(104, 'Michael', 'Brown', 1, 52000),
(105, 'Chris', 'Davis', 3, 80000);

View 생성

CREATE VIEW 명령어를 통해 View를 생성할 수 있습니다.

구문

CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

예시 코드

다음은 Sales_Employees라는 View를 생성해 영업 부서에 속한 직원들의 정보를 조회하는 방법입니다.

CREATE VIEW Sales_Employees AS
SELECT e.first_name, e.last_name, d.department_name, e.salary
FROM Employee e
JOIN Department d ON e.department_id = d.department_id
WHERE d.department_name = 'Sales';

SELECT * FROM Sales_Employees;
first_namelast_namedepartment_namesalary
JohnDoeSales55000.00
MichaelBrownSales52000.00

복합 뷰 (Complex Views)

복합 뷰는 여러 테이블을 조인하고 서브쿼리 등을 사용하는 복잡한 View입니다.

구문

CREATE VIEW view_name AS
SELECT column1, column2, aggregate_function(column3), ...
FROM table1
JOIN table2 ON table1.column = table2.column
WHERE condition
GROUP BY column1, column2
ORDER BY column1;

예시 코드

각 부서의 직원 수와 평균 급여를 계산하는 복합 View 생성

CREATE VIEW Department_Stats AS
SELECT d.department_name, COUNT(e.employee_id) AS employee_count, ROUND(AVG(e.salary),2) AS avg_salary
FROM Employee e
JOIN Department d ON e.department_id = d.department_id
GROUP BY d.department_name;

SELECT * FROM Department_Stats;
department_nameemployee_countavg_salary
Sales253500.00
HR160000.00
IT277500.00

View 수정

ALTER VIEW 명령어를 통해 뷰의 정의를 수정할 수 있습니다.

구문

ALTER VIEW view_nameAS
  SELECT column1, column2, ...
  FROM table_name;

예시 코드

Sales 부서에서 급여가 55,000 이상인 직원만 포함하도록 View를 수정합니다.

ALTER VIEW Sales_Employees AS
SELECT e.employee_id, e.first_name, e.last_name, d.department_name, e.salary
FROM Employee e
JOIN Department d ON e.department_id = d.department_id
WHERE d.department_name = 'Sales' AND e.salary >= 55000;

SELECT * FROM Sales_Employees;
first_namelast_namedepartment_namesalaryemployee_id
JohnDoeSales55000.00101

View 대체 (CREATE OR REPLACE VIEW)

기존에 존재하는 뷰를 새로운 뷰로 대체할 때는 CREATE OR REPLACE VIEW 명령어를 사용합니다.

이 명령어는 기존 View를 삭제하고 새로운 정의로 대체합니다.

해당 뷰가 존재하지 않으면 CREATE VIEW 문과 같은 결과를 반환합니다.

구문

CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

예시 코드

Sales 부서에서 급여가 55,000 이상인 직원만 포함하도록 기존 View를 삭제하고 새로운 View로 대체합니다.

CREATE OR REPLACE VIEW Sales_Employees AS
SELECT e.first_name, e.last_name, d.department_name, e.salary
FROM Employee e
JOIN Department d ON e.department_id = d.department_id
WHERE d.department_name = 'Sales' AND e.salary >= 55000;

SELECT * FROM Sales_Employees;
first_namelast_namedepartment_namesalary
JohnDoeSales55000.00

View 삭제

View가 더 이상 필요하지 않으면 DROP VIEW 명령어를 사용하여 삭제할 수 있습니다.

구문

DROP VIEW view_name

예시 코드

Sales_Employees View를 삭제합니다.

DROP VIEW Sales_Employees;

정리

MySQL의 View는 복잡한 쿼리의 단순화, 데이터 보안 강화, 유지보수 편의성 등을 제공합니다. 하지만 성능 저하, 인덱스 제약, 제한적인 쓰기 작업 등의 단점도 고려해야 합니다. 복합 View를 사용하면 다양한 테이블을 조인하고 집계하여 더 복잡한 데이터를 조회할 수 있습니다.

profile
함께 개선하는 프론트엔드 개발자

0개의 댓글