게으른 완벽주의자의 개발자 도전기
[DATABASE]union view 다중 insert 본문
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;
'SQL' 카테고리의 다른 글
mapper 서브쿼리 작성 두가지 방법 (selectKey) (1) | 2022.09.21 |
---|---|
장바구니 같은 상품 추가(merge(INSERT + UPDATE) into table using dual) (0) | 2022.08.22 |
ITEM_CODE(ITEM_001)쿼리로 만들기(LPAD, TO_NUMBER, SUBSTR, MAX, NVL, || 활용하기) (0) | 2022.08.13 |
오라클SQL Developer실행안됨 (windows를 복원하는 중) (0) | 2022.08.06 |
DataBase 주요 함수 정리 (0) | 2022.08.03 |