ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 베이스 _뷰(VIEW) DML(INSERT, UPDATE, DELETE) 사용
    SQL/sql 문법(mysql, mariaDB) 2024. 5. 14. 10:39

    ▤ 목차

      ✔ 읽기 전용뷰

      📝 읽기 전용 뷰 생성 : with read only

      읽기 전용 뷰를 만들 수 있다.'with read only'를 sql 문장에 생성하면 된다.

      읽기 전용 뷰에서는 각종 DML 작업(DELETE, INSERT, UPDATE,...) 이 제약이 걸린다.

      💻 코드로 보기

      create or replace view 뷰이름 as (
      SELECT FROM 구문)
      with read only;

       

       

      읽기 전용 모드인지 확인하기 하는 코드이다. 뷰 이름은 반드시 영문 대문자로 조회해야 한다.

      select read_only 
      from user_views
      where view_name='뷰이름';

       

      ✔ DML(INSERT, UPDATE, DELETE) 사용

      단순 뷰인경우 INSERT, UPDATE, DELET가 자유롭다.

      단 NOT NULL 조건이 걸린 칼럼이 있다면 에러가 뜬다. (FK 조건이 되어 있다면 삭제 불)

      ⌨ 단순 뷰 

      #v_e는 v_d로 만든 뷰테이블이다.
      CREATE VIEW v_d AS SELECT jikwon_no AS 번호,jikwon_name 이름,jikwon_pay * 10000 AS 연봉
      FROM jikwon ORDER BY jikwon_pay DESC;

      CREATE VIEW v_e AS SELECT * FROM v_d WHERE 연봉 >= 78000000;

       

      연봉 테이블은 원래 물리적 칼럼이 아닌 뷰를 만들 때 연산작업으로 진행된 칼럼이다.

      👏 UPDATE

      UPDATE v_e SET 이름 = '홍길동' WHERE 이름 = '공기밥';

      뷰 테이블의 이름이 '공깃밥'인 사람을 '홍길동'으로 바꿨다. 결과를 확인해 보자.

      SELECT * FROM v_e;

      예상과 같이 v_e 테이블은 해당 칼럼이 달라졌다. 주의할 점은 앞으로 나온다.

      분명 v_e테이블을 변경했다. 원본 DB를 확인해 보자.

      SELECT * FROM jikwon;

      원본 DB인 jikwon 테이블의 데이터도 변경되었다.


      UPDATE v_e  SET 연봉=0 WHERE 번호=1;

      그럼 연봉 칼럼은 변경이 가능한가? 

      불가능하다 물리적인 칼럼이 아닌 칼럼은 변경이 불가능하다. 연봉은 연산에 의해 만들어진 가상의 칼럼이다.

      update는 물리적 칼럼을 수정한다.


      👏 DELETE

      DELETE FROM v_e WHERE 번호=18;

      해당 값이 사라졌다. 번호가 18번인 값이 삭제되었다.  원본 테이블을 확인해 보자.

       

      뷰의 칼럼을 삭제하면 원본 테이블 칼럼이 삭제된다.

       

      👏 INSERT

      CREATE VIEW v_f AS SELECT jikwon_no, buser_num, jikwon_jik FROM jikwon
      WHERE jikwon_jik='사원';

      새로운 v_f 뷰테이블을 만들자.

      INSERT INTO v_f VALUES(35,40,'대리');

       

      위의 쿼리는 원본 테이블에 insert 되는 것이다. 하지만 에러 메시지가 나온다.

      왜냐하면 직원 이름의 조건 not null이기 때문이다.

      insert에 오류가 나면 원본 테이블이 not null이기 때문이라고 유추해 볼 수 있다.


       

      새로운 테이블을 사용해 보자.

      CREATE VIEW v_g AS SELECT jikwon_no,jikwon_name,buser_num ,jikwon_jik FROM jikwon
      WHERE jikwon_jik='사원';

      INSERT INTO v_g VALUES(35,'이진수',40,'사원');

       

      해당 값이 들어갔다.

       

      👏 GROUP BY

      CREATE VIEW v_h AS SELECT jikwon_jik, SUM(jikwon_pay) AS payhap FROM jikwon
      GROUP BY jikwon_jik;

      UPDATE v_h SET jikwon_jik='차장' WHERE jikwon_jik='과장';

      group by 연산에 의해 만들어진다.

      때문에 group by는 insert, delete, update는 안된다.

      read only, 참조만 가능하다.

       

      💻 복합 뷰

      복합 뷰는 조인, 함수, UNION 등 사용하여 뷰를 생성하는 것을 말한다.

      이 경우 함수를 사용 시 반드시 칼럼에 별명을 꼭 부여해야 한다.

      복합 뷰는 SELECT는 가능하지만 INSERT, UPDATE, DELETE는 상황에 따라서 가능하지 않을 수도 있다.

      ✔조인테이블 + 뷰

      조인된 테이블을 마치 하나의 테이블처럼 뷰로 만들어 사용한다.

      💻 코드로 보기

      CREATE OR REPLACE VIEW v_join AS
      SELECT jikwon_no, jikwon_name, buser_name, jikwon_jik
      FROM jikwon
      INNER JOIN buser ON buser_num=buser_no
      WHERE buser_num IN(10,30);
      SELECT * FROM v_join;

       

      😊정리

       

      부서명을 알기 위해 사원 테이블과 부서 테이블을 자주 join 한다면 복합뷰를 만들어 해결할 수 있다.

    Designed by Tistory.