KH정보교육원_웹 프로그래머 과정/Oracle DB

Database 기본8 DDL(ALTER), DML(INSERT, UPDATE, DELETE)

calvin9150 2021. 3. 12. 21:17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
----------- 2021-03-12
 
-- 서브쿼리 이용 테이블 만들기
 
-- 테이블 만들고 복사해오기
CREATE TABLE EMP_COPY
AS SELECT * FROM EMPLOYEE;
 
SELECT * FROM EMPLOYEE;
DROP TABLE EMP_COPY;
 
-- 복사시 데이터 없이 테이블만 생성하려면?
CREATE TABLE EMP_COPY
AS SELECT EMP_NAME, DEPT_CODE, JOB_CODE, SALARY
    FROM EMPLOYEE WHERE 1=2;
SELECT * FROM EMP_COPY;
 
-- DML (Data Manipulation Language.....INSERT, UPDATE, DELETE)
-- 1. 지정한 컬럼에만 데이터 추가해보기 (지정안된건 NULL)
INSERT INTO DEPARTMENT(DEPT_ID, LOCATION_ID) -- 지정되지 않은 컬럼에 NOT NULL 설정되어 있으면 오류
VALUES ('A1''L3');
 
-- 모든 컬럼에 값 넣기
INSERT INTO DEPARTMENT
VALUES ('A2''오라클개발부''L4'); -- NULL을 넣는것도 가능
 
-- INSERT문에 서브쿼리 이용해보기
CREATE TABLE INSERT_TEST
AS SELECT EMP_ID, EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID
    WHERE 1=2;
 
SELECT * FROM INSERT_TEST;
 
INSERT INTO INSERT_TEST
VALUES ('1''GOM''개발팀');
 
-- 기존에 있는 데이터를 복사해서 넣어보기
INSERT INTO INSERT_TEST (SELECT EMP_ID, EMP_NAME, DEPT_TITLE
    FROM EMPLOYEE JOIN DEPARTMENT ON DEPT_CODE=DEPT_ID
    WHERE DEPT_CODE='D5'
);
 
-- INSERT ALL : 2개 이상의 테이블에 한 SELECT문의 결괏값을 넣는다.
CREATE TABLE EMP_HIRE_DATE
AS SELECT EMP_ID, EMP_NAME, HIRE_DATE
FROM EMPLOYEE WHERE 1=0;
CREATE TABLE EMP_MANAGE
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_MANAGE VALUES(EMP_ID, EMP_NAME, MANAGER_ID)
SELECT EMP_ID, EMP_NAME, HIRE_DATE, MANAGER_ID
FROM EMPLOYEE;
 
SELECT*FROM EMP_HIRE_DATE;
 
-- INSERT ALL를 조건에 따라 분리해서 삽입해보기
CREATE TABLE EMP_OLD
AS SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE
FROM EMPLOYEE
WHERE 1=0;
 
CREATE TABLE EMP_NEW
AS SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE
FROM EMPLOYEE WHERE 1=0;
 
SELECT*FROM EMP_OLD;
SELECT*FROM EMP_NEW;
 
INSERT ALL
WHEN '00/01/01'>HIRE_DATE THEN INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, SALARY, HIRE_DATE)
WHEN '00/01/01'<= HIRE_DATE THEN INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, SALARY, HIRE_DATE)
SELECT EMP_ID, EMP_NAME, SALARY, HIRE_DATE
FROM EMPLOYEE;
 
-- UPDATE : 컬럼값을 수정.. 테이블 전체 행 갯수는 변화가 없다.
CREATE TABLE EMP_COPY
AS SELECT * FROM EMPLOYEE;
DROP TABLE EMP_COPY;
SELECT*FROM EMP_COPY;
-- 'A1'부서의 부서명을 '자바개발부'로 변경.. UPDATE에서 WHERE 빼먹지 말기! 전부 바뀌어버린다..
UPDATE DEPT_COPY SET DEPT_TITLE='자바개발부' WHERE DEPT_ID='A1';
 
-- UPDATE 문에서 서브쿼리 사용해보기
-- 급여가 200만원 미만인 사원의 보너스를 0.4로 변경하기
UPDATE EMP_COPY SET BONUS=0.4 WHERE SALARY<2000000;
 
-- 방명수의 월급을 심봉선과 같게 변경하기
UPDATE EMP_COPY SET SALARY=(SELECT SALARY FROM EMP_COPY WHERE EMP_NAME='심봉선')
WHERE EMP_NAME = '방명수';
 
-- 방명수의 월급과 보너스를 전지연의 월급과 보너스와 같게 변경하기
UPDATE EMP_COPY SET (SALARY, BONUS)=(SELECT SALARY, BONUS FROM EMP_COPY WHERE EMP_NAME='전지연')
WHERE EMP_NAME='방명수';
 
-- 임시환의 직급을 과장, 부서를 해외영업3부로 변경하는 쿼리 작성
UPDATE EMP_COPY SET (JOB_CODE, DEPT_CODE)=(SELECT JOB_CODE, DEPT_CODE
    FROM JOB CROSS JOIN DEPARTMENT
    WHERE JOB_NAME='과장' AND DEPT_TITLE='해외영업3부')
-- SET JOB_CODE=(SELECT JOB_CODE FROM JOB WHERE JOB_NAME ='과장'),
--                     DEPT_CODE=(SELECT DEPT_ID FROM DEPARTMENT WHERE DEPT_TITLE='해외영업3부')
WHERE EMP_NAME='임시환';
 
-- DELETE : 조건에 맞는 ROW를 삭제하는 명령어
-- DELETE FROM 테이블 [WHERE 조건식] // WHERE절 생략시 전체 삭제
 
-- 차태연 삭제하기
DELETE FROM EMP_COPY WHERE EMP_NAME='차태연';
 
-- BONUS 안받는 사원 삭제
DELETE FROM EMP_COPY WHERE BONUS IS NULL;
 
-- TRUNCATE : 테이블 전체 행 삭제.. DELETE보다 빠르고 ROLLBACK으로 복구 불가능
 
-- MERGE : 구조가 같은 2개의 테이블을 1개의 테이블로 합치는 기능
-- MERGE INTO 기준이 될 테이블
-- USING 합칠테이블 ON (동일여부 판단할 기준컬럼)
-- WHEN [NOT]MATCHED THEN DML구문
MERGE INTO TBL_MERGE01
USING TBL_MERGE02 ON (TBL_MERGE01.ID=TBL_MERGE02.ID)
WHEN MATCHED THEN UPDATE TBL_MERGE01.NAME=TBL_MERGE02.NAME;
 
-- DDL (Dtat Definition Language) : 객체를 CREATE, ALTER(수정), DROP
 
-- ALTER : 테이블에 정의된 내용을 수정할 때 사용..
-- ㄴ 컬럼 및 제약조건의 삭제/추가, 컬럼의 자료형 변경, DEFAULT값 변경, 테이블-컬럼-제약조건 이름을 바꿀 수 있다.
 
CREATE TABLE TBL_USER_ALTER(
    USER_NO NUMBER PRIMARY KEY,
    USER_ID VARCHAR2(20),
    USER_PWD VARCHAR2(20),
    USER_NAME VARCHAR2(20)
);
 
INSERT INTO TBL_USER_ALTER VALUES (1'ADMIN''1234''관리자');
INSERT INTO TBL_USER_ALTER VALUES (2'USER01''USER01''유저일1');
 
-- 테이블에 데이터가 있는 상태에서 새 컬럼 추가
ALTER TABLE TBL_USER_ALTER ADD (ADDRESS VARCHAR2(100));
 
-- 새 컬럼 추가할 때 제약조건도 추가
ALTER TABLE TBL_USER_ALTER ADD (GENDER VARCHAR2(10) CHECK ( GENDER IN ('남''여')));
 
-- 데이터가 있는 테이블에 컬럼을 추가할 때 주의.. NOT NULL 제약조건 설정 시 주의
ALTER TABLE TBL_USER_ALTER ADD(EMAIL VARCHAR2(50DEFAULT 'NONE' NOT NULL );
 
-- 제약조건 추가
ALTER TABLE TBL_USER_ALTER ADD CONSTRAINT TBL_USER_ID_QU UNIQUE (USER_ID);
-- NOT NULL -> 추가가 안된다.. 컬럼 생성시 디폴트가 NULL 허용이라 기존 조건을 수정해야 함.
-- ALTER TABLE 테이블명 MODIFY 컬럼명 자료형 -> 컬럼 수정
-- ALTER TABLE 테이블명 MODIFY 컬럼명 CONSTRAINT 제약조건명 제약조건 -> 제약조건 수정
ALTER TABLE TBL_USER_ALTER MODIFY EMAIL CHAR(100);
 
-- ALTER TABLE 테이블명 DROP COLUMN 컬럼명 -> 컬럼 삭제하기
ALTER TABLE TBL_USER_ALTER DROP COLUMN EMAIL;
 
-- ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건명 -> 제약조건 삭제
ALTER TABLE TBL_USER_ALTER DROP CONSTRAINT SYS_C007200;
 
-- ALTER TABLE 테이블명 RENAME COLUMN 수정전컬럼명 TO 수정후컬럼명 -> 컬럼명 수정
ALTER TABLE TBL_USER_ALTER RENAME COLUMN USER_ID TO USER_NICK;
ALTER TABLE TBL_USER_ALTER RENAME CONSTRAINT TBL_USER_ID_QU TO TBL_USER_NICK_QU;-- 제약조건명 수정
cs