흰둥이는 코드를 짤 때 짖어 (왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!)

(MySQL) 기초 문법(뷰) 본문

MySQL

(MySQL) 기초 문법(뷰)

흰둥아솜사탕 2023. 3. 21. 17:40
728x90
반응형

뷰(View)

  • 가상의 테이블을 생성
  • 실제 테이블처럼 행과 열을 가지고 있지만, 데이터를 직접 저장하고 있지는 않음

뷰를 만드는 이유

  • SQL 코드를 간결하게 만들기 위함
  • 삽입, 삭제, 수정 작업에 제한 사항을 가짐
  • 내부 데이터를 전체 공개하고 싶지 않을 때

 

현재 member테이블

select * from member;

member 테이블

 

뷰 생성

# create view 뷰이름 as 쿼리 ...
create view vw_member as select userid, username, hp, gender from member;
select * from vw_member;

vw_member 뷰

문제

  • member의 userid, username, hp와 profile의 mbti를 출력하는 뷰(vw_memberprofile)를 만들고 select만 할 수 있는 melon 계정을 생성

profile 테이블

select * from profile;

profile 테이블

create view vw_memberprofile
as select m.userid, m.username, m.hp, p.mbti from member as m
inner join profile as p on m.userid = p.userid;

select * from vw_memberprofile;

vw_memberprofle 뷰

create user 'melon'@'localhost' identified by '1111';
grant select on kdt.vw_memberprofile to 'melon'@'localhost';
flush privileges;
melon 계정을 만들고 kdt데이터베이스에 vw_memberprofile 뷰에만 select로 접근이 가능한 권한을 준다.

 

melon 전용 데이터베이스를 만들어 접속한다.

 

use kdt;
select * from member; # Error Code: 1142. SELECT command denied to user 'melon'@'localhost' for table 'member'
select * from vw_memberprofile;

melon계정에 member 테이블에 관한 권한은 없어서 에러가 발생하지만 vw_memberprofile는 select문이 정상 작동한다.

뷰 수정, 대체

  • 뷰 수정은 alter로 가능은 하지만 보통 replace를 통해 대체를 하여 새롭게 만든다.
# 뷰 수정
# alter view 뷰이름 as 쿼리 ...

# 뷰 대체
# create or replace view 뷰이름 as 쿼리 ...
create or replace view vw_memberprofile
as select m.userid, m.username, m.hp, p.mbti from member as m
inner join profile as p on m.userid = p.userid;
create or replace로 이미 존재하는 뷰여도 대체를 해주기에 에러가 발생 안한다.

update vw_member set hp='01000000000' where userid='berry';
select * from vw_member; # 뷰 전화번호 데이터 변경됨
select * from member;

vw_member 뷰
member 테이블

update로 뷰를 수정할 경우 참조하는 기존 테이블에도 영향이 간다.
insert into vw_member values('avocado', '안가도', '01088888888', '남자'); # Error Code: 1423. Field of view 'kdt.vw_member' underlying table doesn't have a default value
뷰에 insert를 할경우에는 not null인 컬럼의 값을 받지 못하여 대부분 에러가 발생한다.
예외로 not null의 컬럼들이 뷰 컬럼에 다 존재한다면 가능은 하다.

뷰 삭제

# drop view 뷰이름;
drop view vw_member;

 

 

728x90
반응형

'MySQL' 카테고리의 다른 글

(MySQL) 기초 문법(인덱스)  (0) 2023.03.21
(MySQL) 기초 문법(트랜젝션)  (0) 2023.03.21
(MySQL) 사용자  (1) 2023.03.21
(MySQL) 기초 문법(테이블 복사)  (0) 2023.03.20
(MySQL) 기초 문법(문자열 함수)  (0) 2023.03.20
Comments