Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

게으른 완벽주의자의 개발자 도전기

[DATABASE]union view 다중 insert 본문

SQL

[DATABASE]union view 다중 insert

머리방울 2022. 8. 21. 15:24

UNION / UNION ALL

-> 2개 이상의 SELECT문을 합칠 때 사용한다

SELECT * FROM EMP WHERE EMPNO <1005
UNION ALL
SELECT * FROM EMP WHERE EMPNO >1005;

1) SELECT문에서 컬럼명은 다르더라도, 자료형이 일치하면 UNION 실행 가능
SELECT ENAME FROM EMP WHERE EMPNO < 1005
UNION ALL
SELECT JOB FROM EMP WHERE EMPNO > 1005;

2) 조회하려는 컬럼의 개수가 동일해야 한다.
SELECT EMPNO, ENAME, SAL FROM EMP WHERE EMPNO < 1005
UNION ALL
SELECT EMPNO, JOB, 1000 FROM EMP WHERE EMPNO > 1005;


3) UNION ALL 과 UNION의 차이 -> 중복 유무
UNION은 중복을 제거하여 정렬을 유발한다.
SELECT * FROM EMP WHERE EMPNO <= 1005
UNION
SELECT * FROM EMP WHERE EMPNO >= 1005;

UNION ALL은 중복도 포함하여 결과가 나오는걸 확인할 수 있다.
SELECT * FROM EMP WHERE EMPNO <= 1005
UNION ALL
SELECT * FROM EMP WHERE EMPNO >= 1005;

 


다중 INSERT

기존 INSERT 문법은 INSERT INTO TABLE () VALUES(); 이거였다.
VALUES 대신에 SELECT문을 이용하여 자료를 넣을 수 있다.
(INSERT + SELECT) 조합은 속도 측면에서 빠르다.

1) 먼저 TABLE을 만들고
CREATE TABLE CAR(
CAR_NUMBER NUMBER PRIMARY KEY
, MODEL_NAME VARCHAR2(100)
, MODEL_COLOR VARCHAR2(100)
);

2) 테이블 안에 자료를 다중 INSERT로 넣고자 한다.
INSERT INTO CAR(CAR_NUMBER, MODEL_NAME, MODEL_COLOR)
SELECT 2, '제네시스', '화이트' FROM DUAL
UNION ALL
SELECT 3, 'K5', '블랙' FROM DUAL;


SELECT * FROM ITEM_IMAGE;
--#{i} 우리가 이미지 파일은 1씩 증가하여 만들어지게 했는데 foreach문을 돌리면
-- union 전에 작성했던것 아직 커밋이 안됐으니 다음껀 커밋된 숫자 기반으로 1씩 증가하게 된다
--그래서 순차적으로 1씩 더 증가시키는 값이 들어가도록 해야하는데 그게 index(0, 1, 2, 3)를 이용해서 증가하도록 만든다.

SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))),0) +1 + 0 , 3, 0) FROM ITEM_IMAGE;
SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))),0) +1 + 1 , 3, 0) FROM ITEM_IMAGE;
SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))),0) +1 + 2 , 3, 0) FROM ITEM_IMAGE;

 

< 뷰(view) > 가상테이블

뷰를 처음 실행하고자 할 때는 system에서 현재 사용하는 계정에 권한을 부여 해야 한다.
GRANT CREATE VIEW TO MYDB;

SELECT 할 때 빈번한 조인과 서브쿼리의 사용은 프로그램 개발에 엄청난 피로감을 느낌
빈번한 조인, 서브쿼리를 한 번만 사용하여 조인 및 서브쿼리를 사용하지 않아도 마치 사용한 것 처럼
쿼리의 결과를 조회할 수 있는 기능이다!

--사원의 사번, 이름, 급여, 부서번호, 부서명, 부서지역 조회하는 뷰 생성
CREATE VIEW MY_EMP AS
SELECT EMPNO, ENAME, SAL, D.DEPTNO, DNAME, LOC
FROM EMP E, DEPT D
WHERE D.DEPTNO = E.DEPTNO;

SELECT * FROM MY_EMP;


뷰(VIEW)는 기존 테이블에 자료가 추가나 수정될 때 반영된다.
뷰에서 자료 수정, 추가 시에도 기존 테이블에 반영된다.

뷰는 가상테이블이라 MY_EMP에 조건담긴 자료가 복사된게 아니라
EMP에서 쿼리문이 실행되는 것
-> 그래서 EMP에서 자료 수정 추가되더라도 반영되는 것이다.

뷰 삭제
DROP VIEW MY_EMP;

3가지 테이블을 합하여 뷰를 만들고자 한다.
OR REPLACE - 조건 바꾸거나 컬럼 추가 해야할 일이 생길 수 있다.
그때마다 DROP하고 다시 만들기 번거롭기에 추가/변경 가능하도록 설정하는 것
상품코드, 상품 카테고리코드, 상품카테고리명, 상품이름, 상품가격, 상품설명,
첨부된 이미지, 이미지 메인여부를 나타내는 뷰를 만들어라

CREATE OR REPLACE VIEW ITEM_VIEW AS
SELECT ITEM.ITEM_CODE
, ITEM.CATE_CODE
, CATE.CATE_NAME
, ITEM.ITEM_NAME
, ITEM.ITEM_PRICE
, ITEM.ITEM_COMMENT
, IMG.ATTACHED_NAME
, IMG.IS_MAIN
, IMG_CODE
FROM SHOP_ITEM ITEM, ITEM_IMAGE IMG, ITEM_CATEGORY CATE
WHERE ITEM.ITEM_CODE = IMG.ITEM_CODE
AND CATE.CATE_CODE = ITEM.CATE_CODE
ORDER BY ITEM.ITEM_CODE;





4개 테이블 합하여 VIEW 만들기
--shop_cart view table 만들기 (Item_image, shop_cart, shop_item, shop_member)

CREATE OR REPLACE VIEW CART_VIEW AS
SELECT CART_CODE
, ITEM.ITEM_CODE
, ATTACHED_NAME
, IS_MAIN
, MEM.MEM_ID
, ITEM_NAME
, ITEM_PRICE
, PUT_DATE
, PUT_CNT
, TOTAL_PRICE
FROM ITEM_IMAGE IMG, SHOP_CART CART, SHOP_ITEM ITEM, SHOP_MEMBER MEM
WHERE IMG.ITEM_CODE = ITEM.ITEM_CODE
AND ITEM.ITEM_CODE = CART.ITEM_CODE
AND MEM.MEM_ID = CART.MEM_ID
ORDER BY CART_CODE;