-
테이블(2) 데이터 조작 (추가, 수정, 삭제)프로그래밍/DBMS 2021. 8. 11.반응형
TRUNCATE
모든 데이터를 삭제한다. (구조는 삭제 안됨)
TRUNCATE TABLE emp1;
emp1은 테이블 이름이다.
INSERT
INSERT 후 COMMIT 또는 ROLLBACK으로 트랜잭션을 완료 해야 한다.
COMMIT : 트랜잭션 완료
ROLLBACK : 트랜잭션 취소
그러나 데이터 조작언어를 실행 후 DDL(CREATE, ALTER, DROP) 명령을 실행하면 자동 COMMIT 된다.
VS Code : 자동으로 커밋 COMMIT 되지 않도록 설정
SET AUTOCOMMIT OFF;
이제 실험을 위해 테이블 하나를 만들어 준다.
CREATE TABLE test1( num NUMBER PRIMARY KEY, name VARCHAR2(30) NOT NULL, birth DATE NOT NULL, memo VARCHAR2(1000) );
여기서 PRIMARY KEY는 테이블의 고유성을 나타내준다. (제약 조건)
하나의 테이블에는 하나의 기본키만 가질 수 있다.
즉 이 키를 가지고 구분하거나 여러 방면으로 사용할 수 있기 때문에 키는 주는게 좋다.
INSERT INTO test1 (num,name,birth,memo) VALUES (1234,'name','2000-11-11','this is memo');
INSERT INTO test1 (num,name,birth,memo) VALUES (1234,'name','2000-11-11','this is memo'); COMMIT; SELECT * FROM test1;
확인을 해보면 정상적으로 데이터가 추가됨을 알 수 있다.
INSERT INTO test1 (num,name,birth,memo) VALUES (2222,'name2','2021-01-01', '');
작은 따옴표 두개 붙여놓으면 이것은 NULL이다.
순서 INSERT를 하고 COMMIT을 하면 ROLLBACK해도 데이터 안사라짐
그러나 COMMIT을 안한 데이터들은 모두 ROLLBACK 하면 사라짐
가상컬럼 (virtual column)
디스크에 저장 x
가상 컬럼의 예
CREATE TABLE test2( hak VARCHAR2(30) PRIMARY KEY, name VARCHAR(30) NOT NULL, kor NUMBER(3) NOT NULL, eng NUMBER(3) NOT NULL, mat NUMBER(3) NOT NULL, tot NUMBER(3) GENERATED ALWAYS AS (kor + eng + mat) VIRTUAL, ave NUMBER(3) GENERATED ALWAYS AS ((kor + eng + mat) / 3) VIRTUAL, reg_date DATE );
tot와 ave가 가상컬럼의 예 이다.
이제 값을 넣어보자
INSERT INTO test2 (hak,name,kor,eng,mat,reg_date) VALUES ('111-111','name',100,90,80,SYSDATE);
다른 예제
CREATE TABLE test3 ( eno VARCHAR(30) PRIMARY KEY, name VARCHAR(30) NOT NULL, pay NUMBER(10) NOT NULL, tax NUMBER(10) GENERATED ALWAYS AS( TRUNC( CASE WHEN pay >= 3000000 THEN pay * 0.03 WHEN pay >= 2000000 THEN pay * 0.02 ELSE 0 END , -1) ) VIRTUAL );
서브쿼리(subquery)를 이용해서 다중 행 입력하기
CREATE TABLE emp1 AS SELECT empNo, name, dept, pos FROM emp WHERE 1 = 0; --구조만 가져와서 테이블 생성
INSERT INTO emp1 SELECT empNo, name, dept, pos FROM emp WHERE dept = '개발부';
다중 행 입력 완료
INSERT ALL
두개 이상의 테이블에 여러 행을 추가
INSERT ALL INTO emp1 (empNo, name,dept, pos) VALUES('1111','name111','dept11','pos111') INTO emp2 (empNo, name,dept, pos) VALUES('2222','name222','dept22','pos222') SELECT * FROM dual;
한줄만 표시되는 dual을 활용해서 각 테이블 마지막 행에다가 값을 넣을 수 있다.
예제
CREATE TABLE emp4 AS SELECT rrn, name, dept, pos FROM emp WHERE 1 = 0; CREATE TABLE emp5 AS SELECT rrn, name, dept, pos FROM emp WHERE 1 = 0;
INSERT ALL WHEN MOD(SUBSTR(rrn,8,1),2) = 1 THEN INTO emp4 VALUES(rrn,name,dept,pos) ELSE INTO emp5 VALUES(rrn,name,dept,pos) SELECT * FROM emp;
UPDATE
데이터를 수정
조심 : 조건을 안주면 모든 데이터가 다 바뀌어 버림 위험함
UPDATE SET WHERE로 기억할것
UPDATE emp_score SET com=90, excel=95 WHERE empNo = '1002';
empNo가 1002인 열의 값들을 변경
ROLLBACK으로 수정 취소 가능 커밋만 안하면 됨.
DELETE
데이터 삭제
UPDATE와 마찬가지로 조건을 안달면 모든 데이터가 삭제된다.
sql 업데이트를 해준다.
@c:\db\emp_score.sql
경로 잘 확인할 것.
CREATE TABLE emp_score1 AS SELECT * FROM emp_score;
값 그대로 가져온 테이블 만들고
DELETE FROM emp_score1; --모든 데이터 제거 --구조는 남는다.
테이블의 모든 값을 삭제할 때는 TRUNCATE가 더 빠름 (자동 커밋)
DELETE FROM emp_score1 WHERE empNo = '1001'; --특정 행만 삭제
실수로 삭제하거나 수정한 경우 복구하기
INSERT INTO emp ( SELECT * FROM emp AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '30' MINUTE ) WHERE city = '서울' );
30분 전의 emp 테이블로 삭제된 데이터 복구
MERGE
데이터 병합하기
CREATE TABLE emp1 AS SELECT empNo, name, city, dept, sal FROM emp WHERE city = '인천'; CREATE TABLE emp2 AS SELECT empNo, name, city, dept, sal FROM emp WHERE dept = '개발부';
MERGE INTO emp1 e1 USING emp2 e2 ON (e1.empNo = e2.empNo) WHEN MATCHED THEN UPDATE SET e1.sal = e1.sal + e2.sal WHEN NOT MATCHED THEN INSERT (e1.empNo, e1.name, e1.city, e1.dept, e1.sal) VALUES (e2.empNo, e2.name, e2.city, e2.dept, e2.sal);
인천 사는 사람과 부서가 개발부인 사람들의 목록을 합친다.
반응형'프로그래밍 > DBMS' 카테고리의 다른 글
JOIN (INNER JOIN / OUTER JOIN) (0) 2021.08.13 제약 조건 / PRIMARY KEY / FOREIGN KEY (0) 2021.08.12 테이블 생성 / 수정 / 삭제 / DDL (0) 2021.08.09 SELECT(4) 날짜 관련 함수 (0) 2021.08.09 SELECT (3) (0) 2021.08.09