728x90
반응형
본 포스팅은 '한빛출판네트워크'의 '혼공SQL' 책을 기반으로 작성한 포스팅입니다.
1. 뷰의 개념
1.1 뷰의 기본 생성
📌 뷰를 만드는 형식
create view 뷰_이름
as
select 문;
📌 뷰에 접근하는 형식
select 열_이름 from 뷰_이름
[where 조건];
- 뷰 생성
create view v_member
as
select mem_id, mem_name, addr from member;
- 뷰 접근
select * from v_member;
-- 필요한 열만 출력, 조건식 추가할 수 있음
select mem_name, addr from v_member
where addr in ('서울', '경기');
1.2 뷰를 사용하는 이유
1) 보안(security)에 도움이 된다.
- 사용자의 중요한 개인 정보에 접근하게 할 수 없음
- ▶ 개인정보가 담긴 테이블에는 접근 권한 제한, 뷰에만 접근할 수 있도록 권한 부여
2) 복잡한 SQL을 단순하게 만들 수 있다.
select B.mem_id, M.mem_name, B.prod_name, M.addr, concat(M.phone1, M.phone2) '연락처'
from buy B
inner join member M
on B.mem_id = M.mem_id;
- 내용이 길고 복잡한 쿼리를 자주 사용해야 한다면, 매번 복잡한 쿼리를 입력해야 함
- 그러나 이것을 뷰로 생성해놓고 사용자들은 해당 뷰에만 접근하도록 하면 복잡한 쿼리를 입력할 필요가 없음
create view v_memberbuy
as
select B.mem_id, M.mem_name, B.prod_name, M.addr, concat(M.phone1, M.phone2) '연락처'
from buy B
inner join member M
on B.mem_id = M.mem_id;
select * from v_memberbuy where mem_name = '블랙핑크';
2. 뷰의 실제 작동
2.1 뷰의 실제 생성, 수정, 삭제
2.1.1 뷰 생성 (CREATE VIEW)
- 뷰에서 사용될 열 이름을 테이블과 다르게 지정할 수 있음 → 별칭(alias) 사용
- 별칭 : 따옴표로 묶어주고 AS를 붙여줌
- 뷰를 조회할 때 열 이름에 공백이 있으면 백틱()` 으로 묶어줘야 함
USE market_db;
CREATE VIEW v_viewtest1
AS
SELECT B.mem_id 'Member ID', M.mem_name AS 'Member Name',
B.prod_name "Product Name",
CONCAT(M.phone1, M.phone2) AS "Office Phone"
FROM buy B
INNER JOIN member M
ON B.mem_id = M.mem_id;
SELECT DISTINCT `Member ID`, `Member Name` FROM v_viewtest1;
2.1.2 뷰 수정 (ALTER VIEW)
ALTER VIEW v_viewtest1
AS
SELECT B.mem_id '회원 아이디', M.mem_name AS '회원 이름',
B.prod_name "제품 이름",
CONCAT(M.phone1, M.phone2) AS "연락처"
FROM buy B
INNER JOIN member M
ON B.mem_id = M.mem_id;
SELECT DISTINCT `회원 아이디`, `회원 이름` FROM v_viewtest1;
2.1.3 뷰 삭제 (DROP VIEW)
drop view v_viewtest1;
2.2 뷰에 대한 정보 확인
DROP VIEW v_viewtest1;
USE market_db;
CREATE OR REPLACE VIEW v_viewtest2
AS
SELECT mem_id, mem_name, addr FROM member;
💡 CREATE OR REPLACE VIEW
- 기존에 뷰가 있어도 덮어쓰는 효과를 내기에 오류가 발생하지 않음
- DROP VIEW와 CREATE VIEW를 연속으로 작성한 효과
2.2.1 DESCRIBE 활용
DESCRIBE v_viewtest2;
▶ 테이블과 동일하게 정보를 보여주나 PK 등의 정보는 확인되지 않음
- 테이블 정보 확인
DESCRIBE member;
2.2.2 뷰의 소스 코드 확인 (SHOW CREATE VIEW 활용)
SHOW CREATE VIEW v_viewtest2;
2.3 뷰를 통한 데이터의 수정/삭제
2.3.1 데이터 수정
update v_member set addr = '부산'
where mem_id = 'BLK';
- 뷰를 통해서 데이터를 입력하려면
- 뷰에서 보이지 않는 테이블의 열에 NOT NULL이 없어야 함
insert into v_member(mem_id, mem_name, addr) values('BTS', '방탄소년단', '경기');
Error Code: 1423. Field of view 'market_db.v_member' underlying table doesn't have a default value
▶ 뷰가 참조하는 테이블의 열 중에서 mem_number 열이 NOT NULL로 설정되어 있어서 오류가 발생함
- 위의 상황에서 뷰를 통해 테이블에 값을 입력하고 싶다면?
- 뷰(v_member)에 mem_number 열을 포함하도록 뷰를 재정의
- 테이블(member)에서 mem_number 열의 속성을 NULL로 변경, 기본값(Defalut)을 지정
2.3.2 데이터 삭제
- 키가 167 이상인 데이터로 뷰 생성
create view v_height167
as
select * from member
where height >= 167;
select * from v_height167;
- 키가 167 미만인 데이터 제거 → 없으므로 삭제할 데이터 없음
delete from v_height167 where height < 167;
→ 0 row(s) affected
2.4 뷰를 통한 데이터 입력
- v_height167 뷰에서 키가 167 미만인 데이터 입력이 됨
insert into v_height167 values('TRA', '티아라', 6, '서울', null, null, 159, '2005-01-01');
- 하지만 뷰의 데이터를 확인하였을 때는 티아라 데이터가 확인 안 됨
select * from v_height167;
▶ 키가 167 이상인 뷰이므로 167 이상의 데이터만 입력되도록 해야 함!
- WITH CHECK OPTION 예약어 사용 : 뷰에 설정된 값의 범위에 벗어나는 값은 입력되지 않도록 함
alter view v_height167
as
select * from member
where height >= 167
**WITH CHECK OPTION** ;
- 키가 167 미만인 데이터를 입력 → 에러 발생
insert into v_height167 values('TOB','텔레토비', 4, '영국', NULL, NULL, 140, '1995-01-01') ;
Error Code: 1369. CHECK OPTION failed 'market_db.v_height167'
2.5 뷰가 참조하는 테이블의 삭제
- 여러 개의 뷰가 두 테이블과 관련이 있으나 테이블이 삭제됨
drop table if exists buy, member;
- 두 테이블과 연관된 뷰 조회 → 조회되지 않음
select * from v_height167;
→ Error Code: 1356. View 'market_db.v_height167' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
- CHECK TABLE 문으로 뷰의 상태를 확인할 수 있음
check table v_height167;
728x90
반응형
'Data Analysis > 혼공SQL' 카테고리의 다른 글
[혼공SQL] 6-2 인덱스의 내부 작동 (0) | 2022.08.09 |
---|---|
[혼공SQL] 6-1 인덱스 개념을 파악하자 (0) | 2022.08.09 |
[혼공SQL] 5-2 제약조건으로 테이블을 견고하게 (0) | 2022.08.03 |
[혼공SQL] 5-1 테이블 만들기 (0) | 2022.08.03 |
[혼공SQL] 4-3 SQL 프로그래밍 (0) | 2022.07.04 |