250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- zipfile
- shutil
- locals()
- __sub__
- Database
- fnmatch
- inplace()
- remove()
- items()
- randrange()
- __annotations__
- shuffle()
- JS
- count()
- CSS
- choice()
- __getitem__
- fileinput
- glob
- __len__
- discard()
- 오버라이딩
- MySqlDB
- MySQL
- node.js
- decode()
- 파이썬
- View
- HTML
- mro()
Archives
- Today
- Total
흰둥이는 코드를 짤 때 짖어 (왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!왈!)
(MySQL) 기초 문법(뷰) 본문
728x90
반응형
뷰(View)
- 가상의 테이블을 생성
- 실제 테이블처럼 행과 열을 가지고 있지만, 데이터를 직접 저장하고 있지는 않음
뷰를 만드는 이유
- SQL 코드를 간결하게 만들기 위함
- 삽입, 삭제, 수정 작업에 제한 사항을 가짐
- 내부 데이터를 전체 공개하고 싶지 않을 때
현재 member테이블
select * from member;

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

문제
- member의 userid, username, hp와 profile의 mbti를 출력하는 뷰(vw_memberprofile)를 만들고 select만 할 수 있는 melon 계정을 생성
profile 테이블
select * from 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;

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;


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 |