mysql 강좌 8

INLINE VIEW => 서브쿼리를 이용해 가상의 테이블을 만들어 검색


문제) 자기 자신의 부서별 평균 급여보다 더 많은 급여를 사원의 이름,급여,부서번호부서별 평균급여를 검색하여 출력
mysql> select  p.pname,p.pay,p.dno,d.avgpay from person p,(select dno,avg(pay) avgpay from person group by dno) d where p.dno=d.dno && p.pay > d.avgpay;
20090114_01.jpg


※ delete 또는 update에서는 서브쿼리를 아직 사용할 수 없다.


insert와 SubQuery : 데이타 복사
형식)
insert into 테이블명1 select 검색대상 from 테이블명2;
=> 테이블2에서 검색된 데이타를 테이블1에 저장
=> select와 달리 서브쿼리에 괄호를 치지 않는다.


문제) 사번,이름,급여 필드를 가진 salesman 테이블을 만들고 person에서 업무가 salesman인 사원의 정보를 저장
mysql> create table salesman(pno int not null primary key,pname varchar(10) not null,pay int not null);
mysql> insert into salesman select pno,pname,pay from person where job=’salesman’;
mysql> select * from salesman;
20090114_02.jpg


create table과 SubQuery : 테이블 생성 및 데이타 복사
형식)
create table 테이블명1 as select 검색대상 from 테이블명2;
=> 테이블2에서 검색된 데이타를 이용해 테이블1을 생성하고 데이타를 저장
=> insert 서브쿼리의 경우 2번에 걸쳐 테이블 생성과 복사를 하지만 필드명을 임의로 바꿀 수 있다.


문제) 사번,이름,급여 필드를 가진 manager 테이블을 만들고 person에서 업무가 manager인 사원의 정보를 저장
mysql> create table manager select pno,pname,pay from person where job=’manager’;
mysql> desc manager;  (primary key 제약조건은 복사되지 않는다)
mysql> select * from manager;
20090114_03.jpg


TCL(Transaction Control Language)
– 트랜젝션 :  DML 명령(insert, delete, update) 명령의 집합
  => 저장된 데이타를 변경시키는 명령의 모임


– 트랜젝션의 시작 : DML명령을 수행하면 자동으로 트랜젝션이 만들어 진다.


– 트랜젝션 적용 : DML명령을 실제 테이블에 적용
mysql> commit;


– 트랜젝션 취소 : DML명령으로 이루어진 결과를 취소
mysql> rollback;


– 자동 commit 되는 경우
=> SQL을 정상적으로 종료한 경우
=> DDL또는 DCL 명령을 사용한 경우


– 자동으로 rollback되는 경우
=>SQL이 비정상적으로 종료된 경우


※ mysql의 테이블을 만들어 주는 엔진(프로그램)
1) MYISAM (버전 5.0 이하)
– 데이타의 저장 및 변경, 삭제 속도가 좋다
– Transaction이 존재하지 않는다. commit과 rollback을 사용하지 못한다.


2) Innodb (버전 5.1 이상)
– 데이타의 검색 속도가 좋다
– Transaction이 존재한다. commit과 rollback을 사용가능.
mysql> show table status; 로 Engine의 종류 확인


– Transaction 예제
mysql> begin ; => 트랜젝션 시작
mysql> delete from person;
mysql> select * from person;
mysql> rollback;
mysql> select * from person;


mysql> select  @@autocommit ;
@@autocommit : 환경변수. 값이 1이 나오면 자동으로 commit 하도록 설정됨


mysql> set @@autocommit=0;
자동으로 commit이 되지 않도록 설정. commit을 실행하거나 정상적으로 종료하면 적용됨. 대부분 autocommit을 적용하고 begin을 실행해서 사용함.


– Transaction 예제 2
첫번째 Session
mysql> begin;
mysql> update person set pay=0 where pname=’kim’;


두번째 Session
mysql> delete from person where pname=’kim’;
=> 첫번째 세션에서 commit 또는 rollback을 하기 전까지 데이타 Lock 걸려있다.



View
– 하나 또는 여러 개의 테이블에서 원하는 데이타만 정확하게 가지고 올 수 있도록 미리 원하는 필드로만 만든 가상의 테이블


– View을 만드는 목적
=> 여러 개의 테이블을 보다 쉽게 검색하기 위해 만든 가상의 테이블(편리성)
=> 특정 계정이 모든 테이블의 정보를 보여주는 것이 아니라 특정 데이타만 제어할수 있도록 만든 가상의 테이블(보안성)


형식)
create view 뷰이름 as select 검색대상 from 테이블명;


ex) person에서 사번,이름,월급만 보여주는 view001을 생성
mysql> create view view001 as select pno,pname,pay from person;
mysql> select * from view001;
20090114_04.jpg


ex) person에서 업무가 salesman인 사원의 사번,이름,월급만 보여주는 view002을 생성
mysql> create view view002 as select pno,pname,pay from person where job=’salesman’;
mysql> select * from view002;
20090114_05.jpg


mysql> begin;
mysql> delete from view002 where pname=’ally’;
mysql> select * from view002;
mysql> select * from person;
주목할 부분 : view테이블의 테이타를 삭제할 경우 원본 테이블의 데이타도 삭제되어 있다. 즉, 원본 테이블에 영향이 미친다.


mysql> rollback;


문제) person에서 사원의 사번,이름,월급만 보여주는 view003을 생성하되 급여순으로 내림차순으로 정렬하여 저장
mysql> create view view003 as select pno,pname,pay from person order by  pay desc;
20090114_06.jpg


mysql> begin;
mysql> update person set pay=800 where pname=’bill’;
mysql> select * from view003;
20090114_07.jpg
=> bill의 위치가 맨 아래로 내려가 있음을 볼 수 있다.  order by 명령이 지속되어 있다.
mysql> rollback;


문제) 부서별 최대 급여목록을 view004에 만들어 저장
mysql> create view view004 as select dno,max(pay) maxpay from person group by dno;
20090114_08.jpg


문제) 사원의 이름에 ‘a’가 있는 사번,이름,급여,부서명을 가진 view005를 만들어 저장
mysql> create view view005 as select pno,pname,pay,dname from person inner join division using(dno) where pname like ‘%a%’;
20090114_09.jpg


mysql> delete from view005 where pname=’ally’; => 삭제 불가(복합 view)


문제) 사원의 이름이 ‘park’인 사원보다 급여를 많이 받는 사원의 집합인 view006을 만들어 사번,이름,급여 저장
mysql> create view view006 as select pno,pname,pay from person where pay>(select pay from person where pname=’park’);
20090114_10.jpg


※ view 삭제
형식)
drop view 뷰이름;

create view 로 만든 가상의 테이블은 drop view 로 테이블을 삭제한다.


mysql  백업 및 복구


▶ 백업
mysqldump -u 계정명 -h 서버명 -p DB명 table명 > 백업파일명.sql
table명은 삭제 가능


▶ 복구
mysql -u 계정명 -h 서버명 -p DB명 table명 < 백업파일명.sql
=> 백업파일 안의 명령을 서버의 DB안에서 실행

Loading

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다