SQL/sql 문법(mysql, mariaDB)

데이터 베이스 _뷰(VIEW) DML(INSERT, UPDATE, DELETE) 사용

읽히는 블로그 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 한다면 복합뷰를 만들어 해결할 수 있다.