SeSac (2021-08 ~ 2021-12)/MySQL

MySQL 09 - 뷰와 트리거 (View, Trigger, UNION, @rownum)

배워도끝이없네 2021. 8. 27. 18:41

CREATE VIEW <view-name> AS SELECT ... ; : 뷰를 생성한다.

UPDATE <view-name> set ...; : 뷰를 업데이트한다

(sum,avg, union all, distinct, group by가 들어간 view는 수정이 안된다)

 

select * from information_schema.views where table_schema=<스키마명> : 해당스키마의 모든 뷰를 보여준다

-> 여기서 is updatable이 yes여야 수정이 가능하다.

 

뷰를 쓰는 이유

- 보안에 좋음 : (다른유저별 다른권한을 줄수 있기 떄문)

- 단순하다 : 구조를 쉽게 보여준다.

- 성능이 좋다 : 컴파일된 쿼리기 때문이다 (prepared statement)

- 프로그래머에게 디테일을 주기 좋다

 

뷰는 거의 읽기 위주로 사용한다 (쓰기는 거의 하지 않음)

 

쿼리를 실행하면 컴파일해서 최적의 인덱스를찾고 메모리에 올려둔다.

뷰를 만들어두면 컴파일이 되어서 메모리에 올라가있다 그래서 빠르다(컴파일하는 과정없이 그냥 메모리에서 가져오면되기때문)

 

Trigger

- 트리거는 방아쇠다. 어떤 테이블에 트리거를 걸면 그 테이블이 insert,update, delete될 때 같이 수행된다.

- 수행되는시점을 변경 이전, 이후로 지정할 수 있다.

DELIMITER //
CREATE Trigger <trigger-name> 
	{ BEFORE | AFTER} { INSERT | UPDATE | DELETE}
	ON <table-name> FOR EACH ROW BEGIN
		... OLD.<col> ...NEW.<col>;
END //
DELIMITER ;

tool을 쓰지 않고 쿼리로 실행할때는 DELIMITER  사이에서 선언해야한다.

(평소에 SQL은 DELIMITER가 ;로 잡혀있어서 ;를 만날때까지를 컴파일한다. 하지만 트리거나 펑션 등등은 프로그램이기 때문에

또다른 딜리미터를 걸어두고, 마치는것으로 실행단위를 잡는다. 위에서는 //로 딜리미터를 바꾸고 //를 만날때까지를 하나의 기준으로 한다. 마지막에 DELIMITER ;를 넣어주는 이유는 다시 SQL에서 ;를 단위로 하기 위함이다.)

 

트리거는 명확성과 성능이 좀 떨어질 수 있기 떄문에 가급적 절제하는것이 좋다.

=> 실제 실무에서는 트리거보다 프로시져로 짠다.

 

update시에 OLD는 바뀌기 전 값 NEW는 바뀔값.

 

join은 table을 합친는것이고

UNION은 ROW를 합치는 것이다.

UNION은 컬럼수와 타입이 일치되어야 합칠 수 있다.

 

select * from Subject where id <3

{ UNION | UNION ALL }

select * from Subject where id <5

 

UNION은 PK의 중복을 방지하고(중복되는 데이터는 무시)

UNION ALL은 전체 데이터를 합친다.

 

mysql은 오라클의 rank가 없다.

 

@는 세션마다 생기는 변수를 의미한다.

@rownum := 0은 rownum변수에 0을 넣겠다는 의미이다.