본문 바로가기

MySQL

MySQL VIEW 사용법

CREATE VIEW
MySQL 5  버전 이후 부터는 VIEW를 사용할 수 있다.

아래와 같은 구조의 테이블 tData1, tData2 를 생성했다.

(여기서 tData1 과 tData2 의 참조관계는 없으며 이해를 돕기 위해 작성한 테이블이다.)

-- Data1 테이블 작성
CREATE TABLE tData1 (
  idx int(10) unsigned NOT NULL auto_increment,
  nMoney int(10) NOT NULL default '0',
  nDate int(10) NOT NULL,
  PRIMARY KEY  (idx)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- Data2 테이블 작성
CREATE TABLE tData2 (
  idx int(10) unsigned NOT NULL auto_increment,
  strJukyo varchar(30) NOT NULL,
  PRIMARY KEY  (idx)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- Data1 테이블 데이터 삽입
TRUNCATE tData1;
INSERT INTO tData1 VALUES
(null, 1000, UNIX_TIMESTAMP() - 86300 * 5),
(null, 2000, UNIX_TIMESTAMP() - 86300 * 4),
(null, 1500, UNIX_TIMESTAMP() - 86300 * 3),
(null, 3500, UNIX_TIMESTAMP() - 86300 * 2),
(null, 1000, UNIX_TIMESTAMP() - 86300 * 1),
(null, 3000, UNIX_TIMESTAMP());

-- Data2 테이블 데이터 삽입
TRUNCATE tData2;
INSERT INTO tData2 VALUES
(null, '용돈'),
(null, '주운돈'),
(null, '은행이자'),
(null, '잔돈'),
(null, '휴대폰요금'),
(null, '월급');

-- View 를 작성한다.
CREATE VIEW Money AS SELECT 

    D1.idx AS 'Number',
    D1.nMoney AS 'Money',
    D2.strJukyo AS 'Jukyo',
    FROM_UNIXTIME(D1.nDate) AS 'Date'
FROM
    tData1 AS D1 INNER JOIN tData2 AS D2
        ON (D2.idx = D1.idx);

-- 일반 테이블 처럼 View 테이블을 SELECT 한다.
SELECT * FROM Money ;

SELECT 결과

Number	Money	Jukyo	Date

1	1000	용돈	2009-03-27 오후 1:03:22
2	2000	주운돈	2009-03-28 오후 1:01:42
3	1500	은행이자	2009-03-29 오후 1:00:02
4	3500	잔돈	2009-03-30 오후 12:58:22
5	1000	휴대폰요금	2009-03-31 오후 12:56:42
6	3000	월급	2009-04-01 오후 12:55:02

VIEW 는 가상의 테이블을 말한다.
생성된 VIEW 에는 삽입, 삭제 , 업데이트는 할수 없고 오직 CREATE VIEW 구문에서 정의한 SELECT 문의 결과를 하나의 테이블 처럼 이용 할 수 있다.

VIEW 를 사용할때는 몇가지 제약 사항이 있는데 아래와 같다.
- SELECT 명령문은 FROM 구문에 있는 서브쿼리를 가질 수 없다.
- SELECT 명령문은 시스템 또는 사용자 변수를 참조 할 수 없다.
- SELECT 명령문은 준비 명령문 파라미터를 참조 할 수 없다.
- 스토어드 루틴 내에서 뷰 정의는 루틴 파라미터 또는 로컬 변수를 참조 할 수 없다.
- 테이블 또는 뷰가 정의문 내에서 참조되기 위해서는 이미 존재해 있어야 한다. 하지만, 뷰가 생성된 후에는 정의문이 참조하는 테이블또는 뷰를 없애는 것은 가능하다. 이런 종류의 문제에 대한 뷰 정의를 검사하기 위해서는 CHECK TABLE 명령문을 사용한다.
- 뷰 정의문은 TEMPORARY 테이블을 참조할 수 없으며, 사용자는 TEMPORARY를 생성할 수 없다.
- 트리거를 뷰에 연관 지을수는 없다.

위와 같은 제약사항이 있다.