SQL 뷰(View) 소개

뷰란, CREATE TABLE로 정의된 실제 테이블로부터 작성되는 가상 테이블을 말합니다. 뷰는 그저 가상 테이블일 뿐이므로, 내부의 데이터는 존재하지 않습니다. 뷰는 실제 테이블을 어떻게 보여줄까를 정의한 것이라고 볼 수 있습니다.

이미 사용하고 있습니다만, CREATE TABLE에서 정의된, 데이터가 들어 있는 테이블을 실제 테이블이라고 하며, 이 실제 테이블에서 만들어지는 가상 테이블을 뷰라고 부릅니다.

뷰의 장점

뷰의 실체는 SELECT 문에 의한 쿼리를 정의한 것입니다. 뷰에 접근하면, 정의된 쿼리가 실행되며, 실제 테이블에서 필요한 데이터가 나타납니다. 또한, 뷰에서 뷰를 정의하는 것도 가능합니다. 그러므로 미리 매번 입력하는 것이 귀찮고 복잡한 쿼리를 한 번 뷰로 정의해두면, 유저와 프로그램에서는 단순한 쿼리를 실행하는 것으로 해결됩니다.

이러한 개발 노력의 경감이라고 하는 관점 이외에, 보안면에서도 장점이 있습니다. 예를 들어, 실제 테이블의 데이터 속에 일반 유저에게 보이고 싶지 않은 것이 있는 경우, 실제 데이터에 액세스 권한을 일반 유저에게 제공하는 것은 불가합니다. 그러나 보이고 싶지 않은 데이터를 제외한 뷰를 정의하는 것으로, 일반 유저에게도 실제 테이블의 데이터를 이용하게 할 수 있게 됩니다.

뷰의 작성

뷰를 작성하기 위해서 CREATE VIEW 문을 이용합니다. 기본 구조는 다음과 같습니다.

CREATE VIEW 뷰 이름 [(칼럼명, 칼럼명, .....)] AS
SELECT文
[WITH CHECK OPTION];

뷰 이름 이후에는, 추출되는 데이터의 칼럼명을 기술합니다. 칼럼명을 생략한 경우, SELECT 문에서 지정한 칼럼의 이름이 그대로 사용됩니다. SELECT 문에서 연산자를 사용한 경우와 미리 칼럼명을 지정한 경우에 명시적으로 기술하는 것입니다.

뷰 이름과 칼럼명 다음에는, AS에 이어서 SELECT 문에 의한 쿼리를 기술합니다. 이 쿼리 결과가 이 뷰의 데이터라는 것입니다. [WITH CHECK OPTION]은 뷰 갱신에 관련되는 옵션입니다. 뷰의 갱신에 대해서는 아래에서 설명합니다.

이 문장의 SQL 샘플에서 앞장까지 쓰이고 있던 수주표, 고객표, 상품표를 실제 테이블로 사용합니다. sample.21-1에서 v_수주라고 하는 이름의 뷰를 정의하고, 마지막에 뷰의 내용을 확인하고 있습니다.

/* 뷰의 작성 */
CREATE VIEW v_수주 AS
SELECT JJ.수주번호, KK.고객이름, SS.상품명,
JJ.수주개수, JJ.납품일
FROM 수주표 JJ, 고객표 KK, 상품표 SS
WHERE JJ.고객코드 = KK.고객코드
AND JJ.상품코드 = SS.상품코드;
 
/* 확인 */
SELECT JJ.수주번호, KK.고객이름, SS.상품명,
JJ.수주개수, JJ.납품일
FROM 수주표 JJ, 고객표 KK, 상품표 SS
WHERE JJ.고객코드 = KK.고객코드
AND JJ.상품코드 = SS.상품코드;

정의한 뷰에서 특정 행과 열을 출력할 수 있습니다. sample.21-2는 정의한 v_수주에서, 수주개수가 100 이상인 경우를 선택하여, 그 고객 이름과 상품명 및 수주 개수를 출력하는 것입니다.
실행결과

고객명 상품명 수용자수
──────────── ────── ───────
KUROKIYA JUICE 300
ONSIDE BEER 200
KUSHINANA BEER 150
ONSIDE WINE 110
KUROKIYA TEA 250
KUSHINANA BEER 135
KUROKIYA BEER 290
KUSHINANA BEER 175

표준규격에 대해서

표준 SQL 규격에 대해서는, SQL89부터 가능합니다. SQL92에서 CHECK OPTION, LOCAL, CASCADE의 기능 확장이 행해집니다. SQL99에서 더욱 기능 강화가 이뤄져서, 일정 조건 하에서 뷰에서 실제 표의 데이터 갱신이 가능해졌습니다. 또한 SQL89에서 뷰를 작성할 수 있는 한편, DROP 스테이트먼트가 없는 탓에 삭제할 수 없습니다.

뷰의 삭제

뷰 삭제를 할 때는, 다음과 같이 SQL문을 기술합니다. (DROP 스테이트먼트 상세)

DROP VIEW 뷰 이름;

실습 과제

  1. 다음 테이블로 이하 조건에 맞는 쿼리를 만들어봅시다.
  • 이름을 하나의 칼럼으로 만들어서 fullname으로 지정
  • Birthdate가 2001-09-01보다 이전인 경우만 표시
id first_name last_name email birthdate added
1 Bonnie Medhurst [email protected] 1999-07-26 1982-05-01 21:32:19
2 Vincenza Streich [email protected] 2006-01-30 2000-07-15 18:19:18
3 Carter Kilback do’[email protected] 1998-12-07 1998-08-14 06:13:52
4 Mariano Stroman [email protected] 1996-06-18 2008-04-06 14:43:43
5 Deondre Kerluke [email protected] 1994-04-10 2008-06-26 22:02:19
6 Gia Towne [email protected] 1988-07-13 1982-03-22 03:16:39
7 Margarett Beahan [email protected] 2008-01-22 2010-09-12 08:59:33
8 Gilda Brekke [email protected] 1981-09-18 2016-04-14 01:17:38
9 Zackary Cummerata [email protected] 2001-05-27 2003-05-23 21:18:54
10 Kory Wiegand [email protected] 2010-03-16 1992-03-22 04:14:31
11 Vinnie Zboncak [email protected] 2016-06-23 2014-12-29 20:55:25
12 Carmella Bogan [email protected] 1978-06-10 1993-01-17 08:43:08
13 Vance Rice [email protected] 1996-10-09 1999-09-14 15:27:08
14 Coleman Maggio [email protected] 1999-11-22 2001-05-01 05:42:36
15 Patricia Zieme [email protected] 1978-11-18 1987-07-21 18:44:25
16 Jada Beer [email protected] 1991-07-17 1997-10-08 09:41:57
17 Kianna Torphy [email protected] 1994-03-17 2011-11-20 20:15:40
18 Maegan Harvey [email protected] 1979-07-18 2010-10-06 20:52:03
19 Winona Welch [email protected] 1974-10-28 2010-09-02 22:05:57
20 Queen Mosciski [email protected] 1983-05-23 1985-10-09 08:51:49

CREATE VIEW scit_view AS
SELECT (first_name || last_name) AS fullname, email
FROM scit_user
WHERE birthdate < to_date('2001-09-01','YYYY-MM-DD');

SELECT fullname, email FROM scit_view;
  1. WHERE에 지정된 조건에 맞는 아이템이 원래 테이블에서 변경되면, 뷰 결과는 어떻게 됩니까?
  2. Oracle을 포함하여, 최근 데이터베이스 시스템에서 INSERT, UPDATE, DELETE가 가능합니다만, 이러한 DML 조작이 불가능한 경우를 생각해봅시다.

 

이 본문은 Techscore 원문을 가공하여 발표를 위해 준비한 자료입니다.

와사비망고 USB Type C Gen 2 케이블 수령

와사비망고 USB Type-A – Type-C Gen 2 케이블

와사비망고에서 새로 출시한 이 케이블은 예전 USB 3.0으로 불리던 지금의 3.1 Gen 1 수준에 머무르던 기존의 케이블 수준을 크게 상회하여 Gen 2라는 새로운 규격을 지원할 수 있는 물건입니다.

아직까지 Gen 2를 제대로 지원하는 기기도 부족한 현실이긴 하나, 이런 부분이야말로 소모품이 그 자리를 메꿔줄 필요가 있습니다. 저렴하게 주변 기기가 자리 잡아야 규격의 생태계도 자리잡기 마련이니까요.

물론 하위 호환성도 있고 단순히 폰을 충전하는데 써도 하등의 문제는 없습니다.

경비실을 스루-하고 뒤늦게 찾아오느라 본의 아니게 인증이 늦어졌습니다.

당장 이것을 써보지 아니할 수가 없군요.

풍성한 스티커는 기글러의 충성심을 인증하는데 유용할 것입니다.

리사이즈로 글씨를 알아보기 어려워지긴 하였으나, 상당히 친절한 안내 문구라는 것은 명확합니다.

USB 포장이 간소하고 뜯기 편합니다. 제품을 쓸데없이 뜯기도 힘든 플라스틱 내부에 봉할 필요는 없는 것이죠.

왜냐하면 이 제품이 워낙 두껍고 단단해서 집어던져도 괜찮을 거 같거든요.(…)

케이블 표면에 적힌 문구로 80도, 30V, VW-1, USB 3.1 HIGH SPEED라고 표기된 내용이 눈에 띕니다.

케이블이 얼마나 여유로운 스펙 기준을 갖고 있는지, 믿음직한지 알 수 있는 부분입니다.

갤럭시 노트 8이 고속 충전을 인식합니다. 이 녀석은 QC 2.0만 지원하고 Adaptive Charge라는 갈라파고스를 자랑하지만 와사비망고는 이를 가리지 않고 고속으로 충전해버리죠.

USB 테스터에 찍힌 전력량은 11W입니다.

볼트가 높아지면 심장도 벌렁벌렁 뛰지만, 그간 케이블은 전압이 올라가도 전류가 제자리 걸음을 하여 답답하였죠.

특히 12W에 커넥터 주위가 열받기 시작하는 바로 아래 은색 케이블에 대한 불만과 불안을 떠올리면, 와사비망고는 타 케이블과 확연히 다르단 걸 알 수 있습니다.

그리고 뒤늦게 서랍에서 꺼낸 루미아 950을 충전합니다.
주인이 자꾸 까먹어서 맨날 방전되네요.

전압이 왜 5V에서 더 많이 안 뛰나 했는데 QC 미지원이었군요.
(Type-C Fast Charge 1.5A만 만족)

아무튼 와망 케이블은 이렇게 주어진 역할을 충실히 해내고 있습니다.

특징으로 무척 강력한 결합력을 들 수 있습니다.
끝까지 끼우면 기기 통째로 포트가 빠질까 두렵기까지 할 정도로 잘 붙습니다.
그리고 C-Type이 헐거운 케이블이 적지 않은데 이것은 양쪽 모두 흔들림 없이 붙는 게 인상적입니다.

이 글은 기글 하드웨어에서 이벤트로 지원받은 물건을 간단히 소감 형식으로 작성한 것입니다.
https://gigglehd.com/gg/2634311