14강. 가상의 테이블: 뷰(생성, 수정, 삭제)
05-3. 가상의 테이블: 뷰
- 뷰: 데이터베이스 개체 중 하나
- 바로 가기 아이콘, 더블클릭하면 연결된 실행 파일이 실행되는 것
- 비슷한 개념으로, 테이블은 실체가 있는 진짜 테이블이고 그것에 접근하게 해주는 게 뷰
- 뷰에 접근하면 테이블의 내용이 보이기 때문에 뷰를 일반적으로 테이블이라 생각해도 큰 무리가 없어, 가상의 테이블이라 부름
👉🏻 뷰의 기본 생성
- SELECT 문을 날리면 테이블 형태로 결과가 뜸
- SELECT 자체를 뷰로 만들어놓으면, 그 다음에 거기로 접근했을 때 진짜 테이블로 접근이 되는 효과
🧩 기본 문법
✅ 뷰 생성하기
✅ 뷰에 접근하기
- 뷰가 테이블인 것 처럼 접근됨
- 뷰로 접근하면 뷰가 (뷰 생성에서 호출한)SELECT문을 실행하는 것
🧩 뷰의 작동
- 사용자가 만들어 놓은 뷰에 접근
- 뷰의 실체는 SELECT, SELECT가 실행됨
- (여기는 자동)쿼리가 실행되어 결과값을 가져다가 사용자에게 보여줌
- 뷰에는 진짜 데이터가 없음, SELECT문만 있음
🎮 손코딩
market_db 먼저 초기화하기
- market_db 파일 찾아서
- 전체 실행하면 초기화됨
- market_db 사용하기
- SLELCT 문으로 데이터 출력해보기
뷰 만들기
- 필수는 아니지만 v를 붙여 뷰임을 나타내주기 (실제로도 많이 사용됨)
- 생성됨
- v_member의 실체는 SELECT문
뷰에 접근해보기
- 뷰에 접근했는데 테이블에 있는 내용이 보여짐
- 뷰의 실체인 SELECT문이 실행된 것
🎮 조건식 넣어보기
- 서울, 경기에 사는 사람만 보고 싶다
👉🏻 뷰를 사용하는 이유
🧩 보안(security)에 도움이 된다
- 회원 테이블일 경우 회원들의 중요한 정보가 있다.
그런 중요한 정보가 있는 테이블에 일반 사용자는 접근하지 못하게 하고
일반 사용자들도 봐도 되는 정보만 제공할 때 뷰를 활용할 수 있다
- 필요한 내용만 볼 수 있게 함
🧩 복잡한 SQL을 단순하게 만들 수 있다
- 중복되는(동일한 내용이 여러번 쓰일 경우) 쿼리를 단순하게 만들 수 있다는 의미인 듯
🎮 손코딩
- 블랙핑크만 보고 싶다
👉🏻 뷰의 실제 작동
🧩 뷰의 실제 생성, 수정, 삭제
✅ 별칭(alias)
- 뷰에서 사용될 열 이름을 테이블과 다르게 지정할 수 있다
- 열 이름 뒤에 ' '또는 " "를 활용해 지정할 수 있고 형식상 AS를 붙여준다
- 뷰를 조회할 때는 열 이름에 공백이 있으면 백틱(`)으로 묶어줘야 한다
🎮 열 별칭 만들기
뷰 만들기
조회하기
- 열 이름에 띄어쓰기가 있으면 백틱으로 감싸주기
🎮 뷰 수정하기
- 권장하진 않지만 필요한 경우 컬럼명을 한글로 할 수도 있음
🎮 뷰 삭제
- DROP TABLE 과 비슷한 개념
🧩 뷰 정보 확인
- DESCRIBE를 통해 확인 가능
🎮 손코딩
- 뷰가 없으면 새로 만들고, 있으면 덮어 써라 (CREATE VIEW와 동일한 효과)
- 뷰의 정보 확인하기
- 뷰에서는 멤버 아이디가 PK인게 확인이 안된다
- 테이블에 DESCRIBE를 해보면
- 확인 가능
- 즉, 뷰에서 PK 정보가 안 나온다고 해서 테이블에서도 PK가 아니라고 단정 지을 수 없다
🎮 뷰 생성한 구문 확인
- 뷰를 만든 구문을 확인하고 싶다면 SHOW CREATE VIEW
- 쿼리문 확인 가능
- 추가된 내용이 조금 있지만 일단 우리가 작성한 내용과 비슷함
- 뷰가 원래 어떤 구문이었는지 확인 가능
🎮 뷰를 통해 데이터 수정
- 블랙핑크의 주소를 부산에서 경남으로
- v_member 뷰는 아이디, 이름, 주소만 보이게함
- 확인해보기
🎮 새로운 데이터 넣기
- 입력시도
- 입력은 '테이블'에 입력되는 것
- 테이블은 아이디, 이름, 인원, 주소, 국번, 전화번호, 평균 키, 데뷔 일자 등으로 이루어져 있음
- 이 중에서 NOT NULL인 컬럼들이 있음
- 뷰는 아이디, 이름, 주소로만 이루어져 있음
- 테이블에서 요구하는 것을 모두 충족하지 않음
- 뷰를 통한 입력은 될수도 안 될 수도 있음 (NOT NULL을 모두 채웠냐에 따라)
- 권장 사항도 아님!
- 만약 꼭 해야만 한다면 테이블의 NOT NULL 조건에 default 제약 조건을 걸어주면 됨
🎮 손코딩
- 뷰 만들기
- 확인해보기
뷰를 통해서 키가 167보다 작은 회원을 삭제해보기
- 0개의 행이 삭제됐다고 함
- 이 뷰에는 167 넘는 회원만 있기 때문에 삭제 될 것이 없음
🎮 손코딩
- 새로운 회원 입력
- 뷰를 통해서 입력하는 것 (성공)
- 조회해보기
- 티아라는 조회되지 않음
- 들어가야 하는 내용들은 모두 들어갔기 때문에 입력은 됐지만, 뷰의 조건에 맞지 않아 조회는 안된다
- 바람직하지 않다 (입력된 게 확인도 안된다)
- 뷰의 조건에 만족하지 않는 것은 입력도 안되게 하는 것이 좋다
✅ WHITH CHECK OPTION
- 뷰의 조건에 맞는 것만 입력되도록 하는 것이 이상적
- 뷰의 조건인 167 이상을 만족해야만 입력이 된다
- 뷰의 조건을 만족하지 않는 데이터 넣어보기
- 입력되지 않음
🎮 테이블을 지운다면?
- 테이블 삭제
- 뷰를 SELECT 해보면
- 뷰가 참조할 테이블이 없어 에러가 난다
- 참조하고 있는 뷰가 있다고 해서 테이블이 지워지지 않는건 아니다!
- 뷰가 왜 조회가 안 되는지 확인하기 위해 CHECK TABLE
- 뷰가 참조하는 실제 테이블이 없다고 나옴
이건 영상에서 안 다뤄주셨지만 코드가 있길래
이 SQL 코드는 MySQL에서 뷰(v_complex)를 생성하는 쿼리를 나타냅니다. 이 뷰는 buy 테이블과 member 테이블을 조인하여 새로운 결과 집합을 만듭니다. 뷰는 mem_id, mem_name, prod_name, addr 네 개의 열을 포함하고 있습니다.
여기에서 각 부분을 설명하겠습니다:
- CREATE VIEW v_complex AS: 이 부분은 뷰를 생성하는 시작 부분입니다. v_complex라는 이름의 뷰를 생성합니다.
- SELECT B.mem_id, M.mem_name, B.prod_name, M.addr: 뷰에서 선택할 열을 지정하는 부분입니다. 이 뷰는 buy 테이블(B 별칭 사용)의 mem_id와 prod_name 열, 그리고 member 테이블(M 별칭 사용)의 mem_name과 addr 열을 선택합니다.
- FROM buy B INNER JOIN member M ON B.mem_id = M.mem_id;: 이 부분은 buy 테이블과 member 테이블을 조인하는 부분입니다. INNER JOIN은 두 테이블 간의 교차 조인을 수행하며, ON 절에서는 조인 조건을 지정합니다. 여기서는 buy 테이블의 mem_id와 member 테이블의 mem_id가 일치하는 행을 조인합니다.
따라서, 이 뷰는 buy 테이블과 member 테이블 간에 공통된 mem_id를 기준으로 조인된 결과를 제공합니다. 이런 식으로 뷰를 사용하면 복잡한 쿼리를 단순화하고, 애플리케이션이나 사용자에게 더 편리한 형태로 데이터를 제공할 수 있습니다.
MySQL에서 뷰(View)를 생성할 때 조인을 사용하는 것은 두 개 이상의 테이블에서 데이터를 결합하여 하나의 가상 테이블을 만드는 데 사용됩니다. 뷰를 통해 사용자는 복잡한 쿼리를 단순화하고 응용 프로그램이나 사용자에게 편리한 형태로 데이터를 제공할 수 있습니다.
-- 예제: employees 테이블과 departments 테이블을 조인하여 뷰 생성
CREATE VIEW employee_department_view AS
SELECT
employees.employee_id,
employees.employee_name,
employees.department_id,
departments.department_name
FROM
employees
JOIN
departments ON employees.department_id = departments.department_id;
이 예제에서는 employees 테이블과 departments 테이블을 조인하여 employee_department_view라는 뷰를 생성합니다. JOIN 절은 두 테이블을 결합하는 데 사용되며, ON 절은 두 테이블을 어떻게 연결할지를 지정합니다. 위의 예제에서는 employees 테이블과 departments 테이블을 department_id 열을 기준으로 조인하고 있습니다.
뷰를 만든 후에는 다음과 같이 뷰를 쿼리할 수 있습니다.
-- 뷰 조회
SELECT * FROM employee_department_view;
이렇게 함으로써 사용자는 실제로 데이터를 조인한 쿼리를 직접 작성하지 않고도 employee_department_view를 통해 조인된 결과를 조회할 수 있습니다. 뷰는 데이터에 대한 가상의 레이어를 제공하므로, 뷰를 사용하면 데이터베이스의 구조를 추상화하고 쿼리를 단순화할 수 있습니다.
출처: https://youtu.be/JrXWxku7ZIM?si=s4DDQbtFpx32BpyN