안녕하세요!
오늘은 DML 의 응용에 대해서 배워보겠습니다.
insert, merge, group function 에 대해 알아볼거에요.
시작하기 전에 테이블 정보가 없으신 분들은 아래 링크에서 받아주세요!
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
Multiple Insert
우리가 배웠던 INSERT 구문은 한 번에 한 줄의 데이터만 입력하는 방식이었습니다.
하지만 오늘 배울 multiple INSERT 구문은 한 번에 여러 줄의 데이터를 입력할 수 있습니다.
multiple INSERT 구문은 총 세가지가 있습니다.
1. unconditional INSERT : 조건과 관계없이 하나의 데이터를 여러 테이블에 입력
2. conditional all INSERT : 조건을 만족하는 모든 테이블에 입력
3. conditional first INSERT : 조건을 만족하는 첫번째 테이블에 입력
하지만 conditional first INSERT 는 잘 쓰지 않기 때문에 생략하고
unconditional INSERT와 conditional all INSERT 만 설명하겠습니다.
(설명 보다보면 conditional first INSERT 도 어떤것인지 감이 오실거에요..ㅎ)
실습을 하기 전에 준비를 하겠습니다.
emp테이블의 empno컬럼과 ename 컬럼만 갖고
emp_test와 emp_test2 테이블을 만들어주세요.
단, 데이터는 복사하지 않겠습니다.
지난번에 테이블을 생성할 때 다른 테이블을 참고하여
테이블의 틀만 복사하고자 할 때
위와 같은 쿼리를 사용한다고 했었습니다.
저렇게 작성하면 위 처럼 컬럼만 있고
데이터는 들어있지 않은 테이블이 생성이 됩니다.
unconditional INSERT
그럼 먼저 unconditional INSERT 를 해보겠습니다.
문법은
위와 같습니다.
좀 헷갈리실거 같으니 바로 보여드릴게요.
문법대로 작성 해봤습니다.
위의 쿼리를 해석해보자면
emp_test 테이블의 컬럼에 empno 와 ename 데이터를 넣을 것인데
그 데이터는 아래에 작성한 SELECT 절 이하가 됩니다.
그리고 emp_test2 테이블의 empno 컬럼에 empno 데이터'만' 넣을 것인데
그 데이터는 똑같이 아래에 작성한 SELECT 절 이하가 됩니다.
emp_test 테이블 뒤에는 컬럼을 쓰지 않았죠?
그럼 모든 컬럼에 데이터를 넣는 다는 말이죠?
그리고 emp_test2 에는 empno 컬럼에'만' 아래에 있는 empno 데이터만 넣는거죠.
두개 테이블의 결과 입니다.
emp_test 테이블에는 empno, ename 모두 데이터가 들어갔고,
emp_test2 테이블에는 empno 에만 데이터가 들어간 것을 볼 수 있습니다.
conditional INSERT
다음은 conditional INSERT 입니다.
아 하기전에 ROLLBACK; 해서 테스트 테이블들 비워줄게요.
conditional INSERT 는 말 그대로 조건을 만족하는 INSERT 입니다.
그럼 쿼리에 조건문이 들어가겠죠?
아까 작성했던 unconditional INSERT 에서 INTO ~
부분 앞에 WHEN 조건 THEN 을 넣어주면 됩니다.
마지막에는 항상 ELSE 를 넣어 주셔야 합니다.
첫 번째 조건은 empno 가 9999보다 큰 것 입니다.
아래 SELECT 절 이하를 보면 첫번째 줄이 조건을 만족하죠?
그럼 emp_test 테이블에는 첫번째 SELECT 절의 데이터가 들어가는 것입니다.
<emp_test 결과>
<emp_test2 결과>
제가 작성한 쿼리대로 결과가 나온것을 보실 수 있습니다 ㅎㅎ
MERGE
다음은 MERGE 구문입니다.
만약 우리가 테이블에 데이터를 추가 혹은 업데이트를 하기 위해서는 어떻게 할까요?
먼저 그 테이블을 조회를 해보겠죠?
emp 테이블을 예로 들어 보겠습니다.
empno가 9999인 데이터가 있으면 ename 을 업데이트 하고 싶고,
동일한 empno가 없다면 신규 입력을 하고 싶다고 가정 해보죠.
그러면 우리는 먼저 emp 테이블을 조회해서 확인을 해볼겁니다.
그리고나서 empno 를 확인한 뒤 UPDATE 혹은 INSERT 쿼리를 작성하겠죠.
MERGR 구문은 이렇게 두 번의 작업을 수행하지 않기 위해
하나의 쿼리로 작성해서 실행하는 구문입니다.
그럼 문법부터 살펴볼게요.
MERGE INTO 다음에 쓰는 테이블은 데이터를 UPDATE 혹은 INSERT를 할 테이블이고,
USING 다음에 쓰는 테이블은 참조할 테이블입니다.
ON 다음에는 조건을 달아 줄 수 있습니다.
그럼 emp 테이블을 예시로 한 번 사용해 보겠습니다.
(그 전에 먼저 ROLLBACK; 을 해서 emp_test 테이블을 비워주세요!)
emp 테이블을 이용하여 emp_test에
동일한 empno값이 있으면 emp_test.ename 업데이트,
동일한 empno값이 없으면 emp테이블의 데이터를 신규 입력 하고자 합니다.
쿼리로 작성하면 이렇게 되겠죠?
결과는 이렇게 나오겠네요.
왜냐하면 emp_test 테이블에는 아무 데이터도 없었기 때문에
모든 데이터가 INSERT 된 것입니다.
위는 비교를 하기 위해 제가 emp_test 테이블에
사번이 7900, 이름이 JAMES 인 사원정보를 넣어놓고
MERGE 구문을 실행한 결과입니다.
이미 있는 사번에 대해서는 _m 을 붙이는 것으로 업데이트 하기로 해서
저렇게 옆에 _m 이 붙은것 입니다.
MERGE 구문 이해 되셨나요?
ROLLUP
그 다음으로 group function 응용을 배워보겠습니다.
그 중에서 ROLLUP 에 대해서 배워볼건데요,
먼저 설명을 하자면
GROUP BY 의 확장 구문입니다.
정해진 규칙으로 서브 그룹을 생성하고 생성된 서브 그룹을 하나의 집합으로 반환합니다.
형식은 GROUP BY ROLLUP(col1, col2...) 이렇게 작성하고
ROLLUP 절에 기술된 컬럼을 오른쪽에서 부터 하나씩 제거해 가며 서브 그룹을 생성합니다.
'오른쪽에서 부터' 라는 방향성이 있기 때문에 컬럼 기술 순서가 다르면 다른 결과가 나옵니다.
오늘은 간략하게 예시만 보여드리고 마치도록 할게요.
위 처럼 결과를 낼 수 있습니다.
아! GROUPING 함수는 소계, 합계를 구할 때 사용하는
그룹쿼리에서 사용하는 함수입니다.
파라미터의 값이 null 이면 1을,
null 이 아니면 0을 반환합니다.
오늘은 여기까지하고 다음시간에 더 자세하게 알아보도록 하겠습니다!
요즘 들어 점점 내용이 어려워지고 있습니다.
하지만 처음부터 열심히 하신 분들은 잘 하고 계시리라
믿어 의심치 않습니다.
끝까지 포기하지 않고 열심히 해봐요!!
그럼 오늘도 끝까지 봐주셔서 감사합니다!
다음에 더 자세한 내용 가지고 오겠습니다!
안녕~
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
[SQL 기초 - 18장] 오라클 SQL 계층형 쿼리 (0) | 2024.12.27 |
---|---|
[SQL 기초 - 17장] 오라클 SQL rollup(2), 확장된 GROUP BY, 서브쿼리 응용 (0) | 2024.12.26 |
[SQL 기초 - 15장] 오라클 SQL 인덱스(2) (feat. 실행계획) (1) | 2024.12.20 |
[SQL 기초 - 14장] 오라클 뷰, view 사용 이유, 시퀀스, 인덱스(1) (1) | 2024.12.19 |
[SQL 기초 - 13장] 오라클 SQL 제약조건, ALTER (0) | 2024.12.18 |