ROW(DATA)를 삽입, 수정, 삭제하는 명령어이다.
- INSERT : 테이블에 새로운 ROW를 추가하는 명령어
- 표현법
INSERT INTO 테이블명 [(컬럼명, 컬럼명 ...)] VALUES(값,값,값.....)2. UPDATE : 테이블에 특정ROW의 컬럼값을 수정하는 명령어
- 표현법
UPDATE 테이블명 SET 컬럼명=값[,컬럼명=값...][WHERE 조건문]3. DELETE : 테이블에 특정ROW를 삭제하는 명령어
- 표현법
DELETE FORM 테이블명[WHERE 조건식]
INSERT INTO 테이블명 VALUES(값,...)-> VALUES값의 갯수는 테이블의 컬럼수와 같아야한다.
✔️컬럼의 순서대로 매칭돼서 들어가서 순서를 맞춰서 INSERT 해줘야함
CREATE TABLE TEMP_DEPT
AS SELECT*FROM DEPARTMENT WHERE 1=0;
INSERT INTO TEMP_DEPT VALUES('D1','자바학부','L3');
--> 값이 3개가 아니면 오류가 발생한다.
✔️컬럼의 타입에 맞춰서 INSERT 해줘야함
CREATE TABLE TEMP_EMP
AS SELECT EMP_NAME,SALARY,HIRE_DATE FROM EMPLOYEE WHERE 1=0;
SELECT*FROM TEMP_EMP;
INSERT INTO TEMP_EMP VALUES('TEST','101원','1234'); --수치가 부적합니다 오류가 뜸
--> 타입에 맞게 INSERT해줘야함 아니면 오류가 발생한다.
TEMP_DEPT테이블의 DEPT_ID,LOCATION_ID의 컬럼의 값을 'D2','L2' 로 대입하기
INSERT INTO TEMP_DEPT(DEPT_ID,LOCATION_ID) VALUES('D2','L2');
✔️ 지정안한 컬럼은 NULL로 들어가게된다.
✔️ NOT NULL제약조건이 있는 컬럼은 무조건 선택해서 값을 넣어줘야함
이유 : NOT NULL제약 조건을 설정하지 않았을 때 나머지는 NULL로 들어가는데 제약조건이 NOT NULL인값에 NULL을 넣을 수 없기 때문에 오류 발생한다. (DEFAULT값이 있는 경우 NULL이 아닌DEFAULT값으로 대체되기 때문에 제외)
CREATE TABLE INSERT_SUB
AS SELECT EMP_ID,EMP_NAME,DEPT_TITLE,HIRE_DATE
FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID WHERE 1=2;
SELECT*FROM INSERT_SUB;
INSERT INTO INSERT_SUB(
SELECT EMP_ID,EMP_NAME,DEPT_TITLE,SALARY
FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID
WHERE SALARY>=3000000
);
✔️ 오류 발생 : DATE가 필요하지만 NUMBER임 -> 데이터 타입을 맞춰줘야한다.
INSERT INTO INSERT_SUB(EMP_ID,EMP_NAME)(
SELECT EMP_ID,EMP_NAME FROM EMPLOYEE;
한개의 SELECT문의 데이터를 다수 테이블 저장하는 명령어
- 표현법
INTO 테이블명 VALUES(컬럼명, 컬럼명,.....) INTO 테이블명 VALUES(컬럼명, 컬럼명,.....) SELECT 문
CREATE TABLE EMP_HIRE_DATE
AS SELECT EMP_ID,EMP_NAME,HIRE_DATE FROM EMPLOYEE WHERE 1=0;
CREATE TABLE EMP_MANAGER
AS SELECT EMP_ID,EMP_NAME,MANAGER_ID FROM EMPLOYEE WHERE 1=0;
INSERT ALL
INTO EMP_HIRE_DATE VALUES(EMP_ID,EMP_NAME,HIRE_DATE)
INTO EMP_MANAGER VALUES(EMP_ID,EMP_NAME,MANAGER_ID)
SELECT EMP_ID,EMP_NAME,HIRE_DATE,MANAGER_ID FROM EMPLOYEE;
WHEN을 사용해준다.
- 표현식
INSERT ALL WHEN 조건식 THEN INTO 테이블명 VALUES(값, 값...) WHEN 조건식 THEN INTO 테이블명 VALUES(값, 값...) WHEN 조건식 THEN INTO 테이블명 VALUES(값, 값...) SELECT문
🖐️문제풀이
1. 테이블 생성
CREATE TABLE OLD_EMP
AS SELECT EMP_ID,EMP_NAME,HIRE_DATE FROM EMPLOYEE WHERE 1=0;
CREATE TABLE NEW_EMP
AS SELECT EMP_ID,EMP_NAME,HIRE_DATE FROM EMPLOYEE WHERE 1=0;
2. 데이터 삽입(저장) -> 입사일이 00/01/01이전인 사람과 이후인 사람으로 나뉘어서 OLD_EMP, NEW_EMP 에 저장된다. (아이디, 이름,입사일)
INSERT ALL
WHEN HIRE_DATE<'00/01/01' THEN INTO OLD_EMP VALUES(EMP_ID,EMP_NAME,HIRE_DATE)
WHEN HIRE_DATE>='00/01/01' THEN INTO NEW_EMP VALUES(EMP_ID,EMP_NAME,HIRE_DATE)
SELECT*FROM EMPLOYEE;
3. 조회
SELECT FROM OLD_EMP; --00/01/01 이전 입사한사람
SELECT FROM NEW_EMP; --00/01/01 이후 입사한사람
- 표현법
UPDATE 테이블명 SET 컬럼명= 값[,컬럼명=값][WHERE 조건식]
UPDATE EMP_SALARY SET SALARY=3000000 WHERE EMP_NAME='전형돈';
ROLLBACK; -- 다시 돌아가기 -- 주의해야할 점 WHERE절 안쓰면 월급이 모두 300만원으로 바뀜
UPDATE EMP_SALARY SET SALARY=200,BONUS=0.5 WHERE EMP_NAME='전형돈';
UPDATE EMP_SALARY SET SALARY=SALARY+100;
🖐️ 문제 풀이
UPDATE EMP_SALARY SET SALARY=SALARY+500000,BONUS=0.4 WHERE SUBSTR(EMP_NAME,1,1)='유';
UPDATE문 SELECT문 이용하기
UPDATE EMP_SALARY
SET SALARY=(SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME='심봉선'),
BONUS=(SELECT BONUS FROM EMPLOYEE WHERE EMP_NAME='심봉선')
-- 이렇게 두줄 써도되지만 아래 구문처럼도 씀
SET(SALARY,BONUS)=(SELECT SALARY,BONUS FROM EMPLOYEE EMP_NAME='심봉선');
WHERE EMP_NAME='방명수';
두 테이블의 데이터를 합치는 명령어이다.
기준테이블에 다른 테이블의 값을 저장 -> 동일값은 수정(UPDATE), 동일하지 않은 값은 추가(INSERT)
- 표현법
MERGE INTO 기준테이블 USING 다른테이블 ON 조건 WHEN MATHCED/NOT MATHCED THEN 실행할 DML구문(UPDATE,INSERT)
CREATE TABLE EMP_M1
AS SELECT*FROM EMPLOYEE;
CREATE TABLE EMP_M2
AS SELECT*FROM EMPLOYEE WHERE JOB_CODE='J4';
INSERT INTO EMP_M2 VALUES(999,'전승우','961028-1234567','JEON@JOEN.COM','01012341234','D3','J4','S1',30,0.5,NULL,SYSDATE,DEFAULT,DEFAULT);
UPDATE EMP_M2 SET BONUS=0.3,SALARY=20 WHERE EMP_NAME!='전승우';
UPDATE SET
일치할 때는 합치고 일치하지 않을 때는 어떤걸로 바꿀지 결정할때 사용한다.
MERGE INTO EMPI_M1 USING EMP_M2 ON(EMP_M1,EMP_ID=EMP_M2,EMP_ID)
WHEN MATCHED THEN
UPDATE SET
EMP_M1.BONUS=EMP_M2.BONUS,
EMP_M1.SALARY=EMP_M2.SALARY
WHEN NOT MATCHED THEN
INSERT VALUES(EMP_M2.EMP_ID,EMP_M2.EMP_NAME,EMP_M2.EMP_NO,EMP_M2.EMAIL,
EMP_M2.PHONE,EMP_M2.DEPT_CODE,EMP_M2.JOB_CODE,EMP_M2.SAL_LEVEL,EMP_M2.BONUS,
EMP_M2.MANAGER_ID,EMP_M2_HIRE_DATE,EMP_M2.ENT_DATE,EMP_M2.ENT_YN);
ROW를 삭제하는 명령어이다.
- 표현법
DELETE FROM 테이블명[WHERE 조건식]
- 전체를 삭제하고 싶을 때
DELETE FROM EMP_M1;
- 조건에 따라 삭제하고 싶을 때(JOB_CODE의 값이 'J4'인 값을 삭제하고 싶을 때)
DELETE FROM EMP_M1 WHERE JOB_CODE='J4';
전체 ROW를 삭제할 때 사용한다.
- 표현법
TRUNCATE TABLE EMP_M1;✔️ 삭제했습니다가아닌 잘렸습니다로 출력됨(DELETE보다 속도가 더 빠름)
✔️
ROLLBACK 안됨(완료라고 뜨긴뜨지만 실행되지 않는다)
외울게 너무 많네욥 ... 화이팅입니당
