DML
DML: INSERT(입력) , UPDATE(변경) , DELETE (삭제) , MERGE(병합)
DDL : CREATE (생성) , ALTER(수정) , TRUNCATE(잘라내기), DROP(삭제)
TCL : COMMIT(확정) , ROLLBACK(취소)
SELECT : 어떤 분류에서는 DQL 라고 하기도 함
■ INSERT
INSERT 명령어는 테이블에 새로운 데이터를 입력할 때 사용
데이터를 입력할 때 숫자 값 이외에는 데이터를 ‘(홑따옴표)로 감싸야 함
문법 INSERT INTO table[(column1, column2,....)] VALUES (value1 , value2 ....) |
INSERT INTO DEPT2(DCODE,DNAME,PDEPT,AREA)
VALUES (9000, '특판1팀', '영업부', '임시지역');
COMMIT;
* 삽입 할 컬럼명 입력 해주고 컬럼 위치에 맞게 values 입력. (컬럼 없을 시 null 값 입력)
INSERT INTO DEPT2
VALUES (9000, '특판1팀', '영업부', '임시지역');
COMMIT;
* 컬럼 개수와 values의 개수가 맞아야함
※ ITAS 문
INSERT INTO PROFESSOR2
SELECT * FROM PROFESSOR
WHERE POSITION='정교수'; -- (중복삽입가능)
* PROFESSOR 테이블의 POSITION이 정교수인 데이터들만 PROFESSOR2테이블에 INSERT 해줌
INSERT INTO PROFESSOR2(NAME,ID,POSITION,PAY,HIREDATE)
SELECT NAME, ID, POSITION, PAY,HIREDATE FROM PROFESSOR
WHERE POSITION = '조교수';
※INSERT ALL
여러 테이블에 여러 행 입력
INSERT ALL
INTO P_01(NO,NAME)
VALUES (1,'AAA')
INTO P_02(NO,NAME)
VALUES(2,'BBB')
SELECT * FROM DUAL;
COMMIT;
- -다른테이블의 데이터를 가져와서 입력하기
INSERT ALL
WHEN PROFNO BETWEEN 1000 AND 1999 THEN
INTO P_01 VALUES(PROFNO,NAME)
WHEN PROFNO BETWEEN 2000 AND 2999 THEN
INTO P_02 VALUES(PROFNO,NAME)
SELECT PROFNO,NAME
FROM PROFESSOR;
CREATE TABLE STUDENT3
AS SELECT * FROM STUDENT
WHERE 1=2;
** 데이터는 없고 구조만 가지고 싶다면 where 1=2(껍데기만 생성)
--STUDENT테이블의 1,2학년은 STUDENT3 테이블로 3,4학년은 STUDENT4 테이블로 넣으세요
INSERT ALL
WHEN GRADE BETWEEN 1 AND 2 THEN
INTO STUDENT3
WHEN GRADE BETWEEN 3 AND 4 THEN
INTO STUDENT4
SELECT * FROM STUDENT;
■ UPDATE
UPDATE 문장은 기존 데이터를 다른 데이터로 변경할 때 사용하는 방법
문법 UPDATE TABLE SET COLUMN = VALUE WHERE 조건 ; |
UPDATE PROFESSOR
SET BONUS = 100
WHERE POSITION = '조교수';
COMMIT;
--PROFESSOR 테이블에서 차범철 교수의 직급과 동일한 직급을 가진 교수들 중 현재 급여가 250만원이
-- 안 되는 교수들의 급여를 15% 인상하세요.
SELECT * FROM PROFESSOR
WHERE POSITION = (SELECT POSITION
FROM PROFESSOR
WHERE NAME ='차범철');
UPDATE PROFESSOR
SET PAY=PAY*1.15
WHERE POSITION = (SELECT POSITION
FROM PROFESSOR
WHERE NAME ='차범철')
AND PAY < 250;
**=> PAY가 1.15배 되서 update 된 것을 확인 할 수 있다.
--PROFESSOR 테이블에서 나한열 교수의 급여와 보너스를 주승재 교수와 동일하게 수정하여라
UPDATE PROFESSOR
SET (PAY,BONUS) = ( SELECT PAY,BONUS
FROM PROFESSOR
WHERE NAME = '주승재')
WHERE NAME = '나한열';
COMMIT;
--STUDENT 테이블에서 1학년 학생 중에 키가 175미만이고 몸무게가 60이상인 학생은 1학년의 평균 키와 평균
--몸무게로 수정하여라
UPDATE STUDENT
SET (WEIGHT,HEIGHT) = (SELECT AVG(WEIGHT),AVG(HEIGHT)
FROM STUDENT
WHERE GRADE = 1)
WHERE HEIGHT < 175 AND WEIGHT >= 60 AND GRADE = 1;
COMMIT;
■ DELETE
DELETE 문장은 데이터를 삭제하는 구문
DELETE는 바로 반환되지 않아 메모리에 남아있을 수 있음. (TRUNCATE는 바로 반환[ 복구불가능 ])
구문 DELETE FROM TABLE WHERE 조건 |
--DELETE 실습--
-- test table 생성
CREATE TABLE scott.test01 (no NUMBER, name VARCHAR2(20), addr VARCHAR2(20));
-- 프로시저를 통한 대용량 데이터 입력
BEGIN
FOR i IN 1..500000 LOOP
INSERT INTO scott.test01
VALUES(i, DBMS_RANDOM.STRING('A',19) ,
DBMS_RANDOM.STRING('Q',19) );
END LOOP;
COMMIT;
END;
select count(*) from scott.test01;
-- TEST01 테이블 사이즈 확인
select sum(bytes)/1024/1024 MB
from dba_segments
where owner = 'SCOTT'
and segment_name = 'TEST01'; --테이블명
-- 각 테이블 정보 확인
select table_name, num_rows, blocks, empty_blocks
from dba_tables
where owner='SCOTT'
and table_name='TEST01';
-- 통계 정보 생성
ANALYZE TABLE SCOTT.TEST01 COMPUTE STATISTICS;
생성후 위 각 테이블 정보 확인시
-- 실 사용 블럭 수 조회
SELECT COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) ||
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "실사용 블록수"
FROM SCOTT.TEST01;
-- 테이블의 테이블스페이스 조회
SELECT TABLE_NAME, TABLESPACE_NAME
FROM DBA_TABLES
WHERE TABLE_NAME='TEST01';
-- 테이블 전체 삭제
DELETE FROM SCOTT.TEST01;
COMMIT;
--> DELETE로 삭제하게 되면 INSERT시 HWM이후에 있는 주소 값에 삽입하게 된다. --> reorg 작업
** reorg작업 : full scan 후 빈 공간에 차례대로 정렬하는 작업
REORG 작업
-- 테이블 스페이스 MOVE
ALTER TABLE SCOTT.TEST01 MOVE TABLESPACE EXAMPLE;
MERGE(위험성 때문에 잘 사용안함)
MERGE 란 여러 테이블 데이터를 합치는 병합을 의미
이 명령어는 문법이 다소 복잡하므로 잘 살펴봐야함
문법 MERGE INTO Table1 USING Table2 ON (병합 조건절) WHEN MATCHED THEN UPDATE SET 업데이트 내용 DELETE WHERE 조건 WHEN NOT MATCHED THEN INSERT VALUES(컬럼이름); |
->다량 중복데이터 관리할 때 사용
--MERGE 작업 QUERY 1 (pt_01 테이블과 p_total 테이블 병합)
merge into p_total total
using pt_01 p01
on (total.판매번호 = p01.판매번호)
when matched then
update set total.제품번호=p01.제품번호
when not matched then
insert values(p01.판매번호,p01.제품번호,p01.수량,p01.금액);
merge into p_total total
using pt_02 p02
on (total.판매번호 = p02.판매번호)
when matched then
update set total.제품번호=p02.제품번호
when not matched then
insert values(p02.판매번호,p02.제품번호,p02.수량,p02.금액);
--확인
select * from p_total;
select * from pt_01;
select * from PT_02;
commit;
'Study Note > Database' 카테고리의 다른 글
SQL TUNING - 기본 (0) | 2016.02.15 |
---|---|
DDL (0) | 2016.02.04 |
[Tool] Orange Character Set 설정하기 (0) | 2016.02.04 |
SUB QUERY (서브쿼리) (0) | 2016.02.04 |
JOIN (0) | 2016.02.04 |