1. 뷰
◎ 뷰의 개념
▷ 일반 사용자 입장에서 테이블과 동일하게 사용하는 개체
▷ 뷰를 생성한 후에는 테이블처럼 접근 가능하여 동일한 결과 얻을 수 있음
▷ 뷰의 작동 방식
▷ 뷰 생성 구문
1. 테이블 생성
drop database if exists sqldb; -- sqldb가 있으면 drop해서 db를 삭제, 없으면 그냥 빠져나가기 create database sqldb; use sqldb; -- 테이블 생성 -- 회원 테이블 create table usertbl( userID char(8) not null primary key, -- 사용자 아이디(PK) name varchar(10) not null, -- 이름 birthYear int not null, -- 출생년도 addr char(2) not null, -- 지역 : 경기, 서울, 경남 식으로 2글자 입력 mobile1 char(3), -- 휴대폰의 국번 : 011, 016, 017, 018, 019, 010 mobile2 char(8), -- 휴대폰의 나머지 전화번호 height smallint, -- 키 mDate date -- 회원 가입일 ); -- 회원 구매 테이블 (buytbl) create table buytbl( num int auto_increment not null primary key, -- 순번(PK) userID char(8) not null, -- 아이디(FK) prodName char(6), -- 물품명 groupName char(4), -- 분류 price int not null, -- 단가 amount smallint not null, -- 수량 foreign key (userID) references usertbl(userID) ); INSERT INTO usertbl VALUES('LSG', '이승기', 1987, '서울', '011', '1111111', 182, '2008-8-8'); INSERT INTO usertbl VALUES('KBS', '김범수', 1979, '경남', '011', '2222222', 173, '2012-4-4'); INSERT INTO usertbl VALUES('KKH', '김경호', 1971, '전남', '019', '3333333', 177, '2007-7-7'); INSERT INTO usertbl VALUES('JYP', '조용필', 1950, '경기', '011', '4444444', 166, '2009-4-4'); INSERT INTO usertbl VALUES('SSK', '성시경', 1979, '서울', null, NULL , 186, '2013-12-12'); INSERT INTO usertbl VALUES('LJB', '임재범', 1963, '서울', '016', '6666666', 182, '2009-9-9'); INSERT INTO usertbl VALUES('YJS', '윤종신', 1969, '경남', NULL, NULL , 170, '2005-5-5'); INSERT INTO usertbl VALUES('EJW', '은지원', 1972, '경북', '011', '8888888', 174, '2014-3-3'); INSERT INTO usertbl VALUES('JKW', '조관우', 1965, '경기', '018', '9999999', 172, '2010-10-10'); INSERT INTO usertbl VALUES('BBK', '바비킴', 1973, '서울', '010', '0000000', 176, '2013-5-5'); INSERT INTO buytbl VALUES(NULL, 'KBS', '운동화', NULL, 30, 2); INSERT INTO buytbl VALUES(NULL, 'KBS', '노트북', '전자', 1000, 1); INSERT INTO buytbl VALUES(NULL, 'JYP', '모니터', '전자', 200, 1); INSERT INTO buytbl VALUES(NULL, 'BBK', '모니터', '전자', 200, 5); INSERT INTO buytbl VALUES(NULL, 'KBS', '청바지', '의류', 50, 3); INSERT INTO buytbl VALUES(NULL, 'BBK', '메모리', '전자', 80, 10); INSERT INTO buytbl VALUES(NULL, 'SSK', '책' , '서적', 15, 5); INSERT INTO buytbl VALUES(NULL, 'EJW', '책' , '서적', 15, 2); INSERT INTO buytbl VALUES(NULL, 'EJW', '청바지', '의류', 50, 1); INSERT INTO buytbl VALUES(NULL, 'BBK', '운동화', NULL, 30, 2); INSERT INTO buytbl VALUES(NULL, 'EJW', '책' , '서적', 15, 1); INSERT INTO buytbl VALUES(NULL, 'BBK', '운동화', NULL, 30, 2); select * from usertbl;
2. v_usertbl 뷰 생성create view v_usertbl as select userid, name, addr from usertbl; select * from v_usertbl;
테이블과 동일한 형태로 출력됩니다.
userid, name, addr 순서로 출력
3. 기본적인 뷰 생성, 열 이름 변경-- 기본적인 뷰 생성, 뷰 생성시 뷰에 사용될 열의 이름을 변경 가능 create view v_userbuytbl as select U.userid as 'USER ID', U.name as 'USER NAME', B.prodName as 'PRODUCT NAME', U.addr, concat(U.mobile1, U.mobile2) as 'MOBILE PHONE' from usertbl U inner join buytbl B on U.userid = B.userid; select * from v_userbuytbl;
USER ID, USER NAME, PRODUCT NAME, U.addr, MOBILE PHONE 순서대로 출력합니다.
4. 뷰 수정-- 에러 발생 : 컬럼에 스페이스바 때문에 인식 문제로 에러 발생 select user id, user name from v_userbuytbl; -- 백팁을 이용하면 에러 발생하지 않고 뷰로 출력됩니다. select `user id`, `user name` from v_userbuytbl; -- 뷰 수정 alter view alter view v_userbuytbl as select U.userid as '사용자 아이디', U.name as '이름', B.prodName as '제품 이름', U.addr, concat(U.mobile1, U.mobile2) as '전화 번호' from usertbl U inner join buytbl B on U.userid = B.userid; select * from v_userbuytbl; select `이름`, `전화 번호` from v_userbuytbl;
USER ID, USER NAME, PRODUCT NAME, U.addr, MOBILE PHONE를
사용자 아이디, 제품 이름, 주소, 전화 번호로 변경할 수 있습니다.
5. 뷰 삭제-- 뷰 삭제 DROP VIEW drop view v_userbuytbl;
◎ 뷰의 장점
▷ 보안에 도움
▶ 사용자가 중요한 정보에 바로 접근하지 못함
▷ 복잡한 쿼리 단순화
▶ 긴 쿼리를 뷰로 작성, 뷰를 테이블처럼 사용 가능
1. 테이블을 통한 뷰 생성 및 실제 데이터 변경
-- 뷰 정보 확인 use sqldb; -- v_usertbl view를 생성 create or replace view v_usertbl as select userid, name, addr from usertbl; -- usertbl의 userid, name, addr의 정보만 가져와 뷰로 저장 desc v_usertbl; -- 현재 view의 상태를 나타냄 show create view v_usertbl; select * from v_usertbl; -- 뷰를 통해서 실제 데이터 변경 update v_usertbl set addr = '부산' where userid = 'JKW'; select * from v_usertbl; select * from usertbl;
JKW의 addr을 부산으로 변경합니다.
2. 뷰를 통한 데이터 입력-- 뷰를 통한 데이터 입력 : not null에 처리가 되어야지만 뷰를 통해서 데이터 입력 가능 -- birthYear은 null 값이 허용되지 않기 때문에 에러 발생 insert into v_usertbl(userid, name, addr) values('KBM', '김병만', '충북'); select * from v_usertbl; desc usertbl;
birthYear이 없기때문에 에러가 발생합니다.
3. 그룹 함수를 포함하는 뷰 생성-- 그룹 함수를 포함하는 뷰 : 집계함수로 정의된 뷰(수정되지 않음) create view v_sum as select userid as 'userid', sum(price*amount) as 'total' from buytbl group by userid; select * from v_sum; -- sum() 함수를 사용한 뷰는 수정할 수 없습니다. select * from information_schema.views where table_schema = 'sqldb' and table_name = 'v_sum'; -- IS_UPDATABLE이 NO로 되어 있어서 데이터 수정 불가능(insert, update, delete) -- view를 통해서 데이터의 수정이나 삭제할 수 없는 경우 -- 집계함수를 사용한 뷰 -- UNION ALL, JOIN 등을 사용한 뷰 -- DISTINCT, GROUP BY 등을 사용한 뷰
그룹 함수를 포함하는 뷰는 수정할 수 없습니다.
4. 뷰를 통한 데이터 입력-- 뷰를 통한 데이터 입력 : 조건을 이용해서 View 생성시 create view v_height177 as select * from usertbl where height >= 177; select * from v_height177; -- 177 미만인 사용자를 삭제 : v_height177 뷰 안에는 177 미만인 사용자가 없어서 데이터가 삭제되지 않는다. delete from v_heigth177 where height < 177; drop view v_heigth177; -- 177 미만인 사용자를 추가 -- 입력 가능 INSERT INTO v_height177 values ('KBM', '김병만', '1977', '경기', '010', '55555555', 158, '2023-01-01'); select * from v_height177; select * from usertbl; -- v_height177뷰에서는 해당 값이 입력은 되지만 보이지 않음 -- 직접 usertbl에서 확인할 수 있음 -- 뷰 : 177이상인 사용자만 다룰 수 있는 권한(조건 옵션에 맞는 데이터만 입력 가능하게 설정) alter view v_height177 as select * from usertbl where height >= 177 with check option; -- where 조건을 체크 -- 입력되지 않음 INSERT INTO v_height177 values ('SJH', '서장훈', '2006', '서울', '010', '33333333', 155, '2023-03-03');
조건에 맞지않는 값을 입력하면 데이터는 입력되지만 view에는 나타나지 않고 테이블에만 넣을 수 있습니다.
check 조건을 넣으면 데이터 자체도 입력되지 않습니다.
5. join을 통한 뷰 생성-- 2개 이상의 테이블이 관련된 복합 뷰 create view v_userbuytbl as select U.userid, U.name, B.prodName, U.addr, concat(U.mobile1, U.mobile2) from usertbl U inner join buytbl B on U.userid = B.userid; select * from v_userbuytbl; -- join을 통해서 만든 뷰에는 수정, 삭제 등의 작업 불가능 -- 에러발생 insert into v_userbuytbl values ('PKL', '박경리', '운동화', '경기', '00000000'); -- 실제 사용되는 테이블 삭제시 drop table if exists buytbl, usertbl;
join을 통해 뷰를 생성하면 수정할 수 없습니다.
뷰에 대해서 익혀보았습니다! 뷰는 나타나는 형식이 테이블이랑 비슷하지만 실제 연산 등의 작업은 테이블에서만 할 수 있다고 합니다!
좀 더 간단한 데이터들을 나타내서 저장하기 위해 View를 사용하는 것 같아요!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

'BackEnd > DB(SQL)' 카테고리의 다른 글
[DB_MySQL] 이것이 MySQL이다 ch09 인덱스 1(클러스터형 인덱스, 보조 인덱스) (0) | 2023.02.09 |
---|---|
[DB_MySQL] 이것이 MySQL이다 ch08 테이블과 뷰 3(테이블스페이스) (0) | 2023.02.09 |
[DB_MySQL] 이것이 MySQL이다 ch08 테이블과 뷰 1-1(테이블 제약 조건 및 수정 방법 실습) (0) | 2023.02.09 |
[DB_MySQL] 이것이 MySQL이다 ch08 테이블과 뷰 1(테이블 생성, 기본키, 외부키) (0) | 2023.02.08 |
[DB_MySQL] 이것이 MySQL이다 ch07 SQL 고급5 (SQL 프로그래밍, if else, case, while) (0) | 2023.02.08 |