INSERT INTO 테이블명 VALUES(값, 값);
INSERT INTO 테이블명 (컬럼, 컬럼) VALUES (값, 값);
1. 타입이 안 맞을때 2.가상컬럼일때 , 제약조건을 지키자
INSERT INTO test1(num, birth, name) VALUES(2, '1999-09-09', '박보검');
CREATE TABLE test1 ( -- test1 테이블 생성
num NUMBER PRIMARY KEY,
name VARCHAR2(30) NOT NULL,
birth DATE NOT NULL,
meno VARCHAR2(1000)
);
-- 모든 컬럼 값을 추가하는 경우에만 컬럼명을 생략할 수 있다.
INSERT INTO test1 VALUES(1, '김자바', '2000-10-10', '조퇴하고싶다');
SELECT * FROM test1;
-- 컬럼명 명시
INSERT INTO test1(num, birth, name) VALUES(2, '1999-09-09', '박보검');
SELECT * FROM test1;
INSERT INTO test1(num, name, birth, meno)
VALUES(4, '호자바', TO_DATE('05/09/09','MM/DD/RR'), '테스트');
INSERT INTO test1 VALUES(2, '다자바', '2020-10-11'); -- 에러 : 컬럼 개수
INSERT INTO test1 VALUES(2, '2021-11-11', '엄자바', '테스트'); -- 에러 타입 일치X
COMMIT;
-- ORA-01400 : 에러 name은 null이 될 수 없다.
SQL 오류: ORA-01400: NULL을 ("SKY"."TEST1"."NAME") 안에 삽입할 수 없습니다
INSERT INTO test1(num, name, birth, meno) VALUES(4, null, '1999-10-10', '테스트');
ORA-12899: "SKY"."TEST1"."NAME" 열에 대한 값이 너무 큼(실제: 36, 최대값: 30)하세요
INSERT ALL
INTO 테이블명1 [(컬럼명1, 컬럼명2)] VALUES (expr1, expr2, expr_n)
INTO 테이블명2 [(컬럼명1, 컬럼명2)] VALUES (expr1, expr2, expr_n)
...
subquery;
CREATE TABLE emp2 AS
SELECT empNO, name, dept, pos FROM emp WHERE 1 = 0;
DROP TABLE emp3 PURGE;
CREATE TABLE emp3 AS
SELECT empNO, sal, bonus FROM emp WHERE 1 = 0;
INSERT ALL
INTO emp2 (empNO, name, dept, pos) VALUES('9999', '나자바', '개발부', '사원')
INTO emp3 (empNO, sal, bonus) VALUES('9999', 2500000, 100000)
SELECT * FROM dual;
INSERT { ALL | FIRST }
WHEN 조건 THEN
INTO 테이블명1 [(컬럼명1, 컬럼명2, 컬럼_n)] VALUES (expr1, epxr2, expr_n)
WHEN 조건 THEN
INTO 테이블명2 [(컬럼명1, 컬럼명2, 컬럼_n)] VALUES (expr1, epxr2, expr_n)
...
ELSE
INTO 테이블_N [(컬럼명1, 컬럼명2, 컬럼_n)] VALUES (expr1, epxr2, expr_n)
subquery;
설명
CREATE TABLE emp4 AS
SELECT empNo, name, rrn, dept, pos FROM emp WHERE 1 = 0;
CREATE TABLE emp5 AS
SELECT empNo, name, rrn, dept, pos FROM emp WHERE 1 = 0;
INSERT ALL
WHEN MOD( SUBSTR(rrn, 8,1), 2) = 0 THEN
INTO emp4 VALUES (empNo, name, rrn, dept, pos)
WHEN MOD( SUBSTR(rrn, 8,1), 2) = 1 THEN
INTO emp5 VALUES (empNo, name, rrn, dept, pos)
SELECT * FROM emp;
개요
구문 형식
UPDATE 테이블명 SET 컬럼명1 = expr1 [, 컬럼명2 = expr2, ...] WHERE condition];
수정 할 컬럼과 subquery의 컬럼 개수 및 데이터 타입이 일치해야 하며, subquery의 결과는 하나의 행만 가능하다.
UPDATE emp_score SET excel = 100; -- 이렇게 할 경우 모든 excel 값 변경이 된다.
UPDATE emp_score SET com = 90, excel = 95 WHERE empNo = '1002';
emp_score: empNo, com, excel, word, tot, avg, grade
tot = com + excel + word
avg = (com + excel + wrod) / 3
grade : 모든 과목의 점수가 40 이상이고 평균 60 이상이면 합격,
평균이 60 이상이고 한과목이라도 40 미만이면 과학 나머지는 불합격
grade를 계산할때는 평균을 반올림 하지 않는다.
SELECT empNo, com, excel, word, (com + excel + word) tot, ROUND((com + excel + word) / 3, 1) ave,
CASE
WHEN com >= 40 AND excel >= 40 AND word >= 40 AND (com + excel + word) / 3 >= 60 THEN '합격'
WHEN (com + excel + word) / 3 >= 60 THEN '과락'
ELSE '불합격'
END grade
FROM emp_score;
개발부의 empNo, com, excel, word만 출력
SELECT empNo, com, excel, word
FROM emp_score
WHERE empNo IN (SELECT empNo FROM emp WHERE dept = '개발부');
기본 형식
UPDATE 테이블명 SET colum = (subquery) [WHERE condition];
수정 할 컬럼과 subquery의 컬럼 개수 및 데이터 타입이 일치해야 하며, subquery의 결과는 하나의 행만 가능 한다.
-- 서브쿼리로 수정
UPDATE emp_score SET (excel, word) = (SELECT 100, 100 FROM dual)
WHERE empNo = '1001';
UPDATE emp_score SET excel = 100, word = 100
WHERE empNo = '1001';
UPDATE emp_score SET empNo = '2001' -- 무겨렁 제약조건 부모키 위반
WHERE empNo = '1001';
-- FROM 쓰고 WHERE 쓰고 GROUP BY 쓰고 HAVING 쓰고 SELECT 쓰자 .
개요
구문 형식
DELETE [ FROM ] 테이블명 [WHWERE 조건];
CREATE TABLE emp1 AS
SELECT * FROM emp;
CREATE TABLE emp_score1 AS
SELECT * FROM emp_score;
DELETE FROM emp1 WHERE dept = '영업부';
SELECT * FROM emp1;
COMMIT;
DELETE FROM emp_score1
WHERE empNo IN (SELECT empNo FROM emp1 WHERE dept = '개발부');
-- 모든 레코드 삭제
DELETE FROM emp1
COMMIT;
SELECT * FROM emp1;
TRUNCATE TABLE emp_score1;
SELECT * FROM emp_score1;
DROP TABLE 한 건 복구 불가능 DELETE는 복구 가능
오라클에서 삭제한 20분전의 테이블을 볼 수 있는 방법
AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '20' MINUTE );
-- 20분 전의 emp 테이블로 삭제된 레코드 복원
INSERT INTO emp (
SELECT * FROM emp
AS OF TIMESTAMP ( SYSTIMESTAMP - INTERVAL '20' MINUTE )
WHERE city = '서울'
);
COMMIT;
-- 레코드의 추가된 순서는 중요하지 않다. 조건을 주고 ODERY BY를 하기 때문.
개요
사용법
MERGE INTO emp1 e1 -- 대상
USING emp2 e2 -- 비교테이블
ON (e1.empNo = e2.empNo) -- 조건
WHEN MATCHED THEN
UPDATE SET e1.sal = e1.sal + e2.sal -- 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);
COMMIT;