TCL (Transaction Control Language)

트랜잭션 제어 언어 (COMMIT, ROLLBACK)

트랜잭션이란?

한꺼번에 수행되어야 할 최소 작업 단위를 말한다.

논리적인 작업 단위 (Logical Unit of Work : LUW)

하나의 트랜잭션으로 이루어진 작업은 반드시 한꺼번에 완료(COMMIT)되어야 하며, 그렇지 않은 경우에는 한꺼번에 취소(ROLLBACK)되어야 한다.

  • COMMIT : 트랜잭션 작업이 정상 완료 되고 나면 변경 내용을 영구히 저장
  • ROLLBACK : 트랜잭션 작업을 취소하고 최근 COMMIT한 시점으로 이동
  • SAVEPOINT 세이브포인트명 : 현재 트랜잭션 작업 시점에 이름을 정해줌. 하나의 트랜잭션 안에서 구역을 나눔. 작업량이 많을 경우 유용하게 쓰일 수 있다.
  • ROLLBACK TO 세이브포인트명 : 트랜잭션 작업을 취소하고 SAVEPOINT 시점으로 이동

DML (INSERT, UPDATE, DELETE) 구문은 반드시 COMMIT을 해야 반영된다.

 

DDL(Date Definition Language)

ALTER : 객체를 수정하는 구문

테이블 객체 수정 : ALTER TABLE 테이블명 수정할내용;

- ALTER로 수정할 수 있는 내용

컬럼 추가/수정/삭제,

제약조건 추가/수정/삭제,

테이블명 변경,

제약조건 이름 변경

칼럼추가, 컬럼 생성 시 DEFAULT 값 지정

ALTER TABLE DEPT_COPY
ADD (LNAME VARCHAR2(20) DEFAULT '한국');

컬럼삭제

ALTER TABLE DEPT_COPY
DROP COLUMN LNAME;

→ 테이블에 최소 한 개 이상의 컬럼이 남아있어야 하기 때문에 모든 열을 삭제할 수는 없다.

→ 제약 조건이 있는 컬럼을 삭제 시 제약 조건도 함께 삭제해야 한다.

CASCADE CONSTRAINTS

ALTER TABLE TB1
DROP COLUMN PK CASCADE CONSTRAINTS;

 

컬럼에 제약 조건 추가

NOT NULL 제약 조건의 경우 ADD가 아니라 MODIFY 를 사용한다.

-- DEPT_COPY2에 PK 제약조건 추가
ALTER TABLE DEPT_COPY2
ADD CONSTRAINT PK_DEPT_ID2 PRIMARY KEY(DEPT_ID);

-- DEPT_COPY2에 UNIQUE 제약조건 추가
ALTER TABLE DEPT_COPY2
ADD CONSTRAINT UN_DEPT_TITLE2 UNIQUE(DEPT_TITLE);
  
-- DEPT_COPY2에 NOT NULL 제약조건 추가
-- NOT NULL 제약조건의 경우 ADD가 아닌 MODIFY 사용
ALTER TABLE DEPT_COPY2
MODIFY DEPT_TITLE CONSTRAINT NN_DEPT_TITLE2 NOT NULL;

제약 조건 삭제

DROP CONSTRAINT 제약조건명;

-- 제약조건 1개 삭제 시
ALTER TABLE CONST_EMP
DROP CONSTRAINT CK_MARRIAGE;

-- 제약조건 여러 개 삭제 시, 연달아 작성
ALTER TABLE CONST_EMP
DROP CONSTRAINT FK_JID
DROP CONSTRAINT FK_MID
DROP CONSTRAINT FK_DID;

-- NOT NULL 제약 조건은 삭제 시 MODIFY 이용
-- 
ALTER TABLE CONST_EMP
MODIFY (ENAME NULL, ENO NULL);
  • NOT NULL 은 ‘수정’으로 취급

 

컬럼 자료형 수정

MODIFY 컬럼명 자료형

ALTER TABLE DEPT_COPY2
MODIFY DEPT_ID CHAR(3)
MODIFY DEPT_TITLE VARCHAR2(30)
MODIFY LOCATION_ID VARCHAR2(2);

DEFAULT 값 변경

ALTER TABLE DEPT_COPY
MODIFY CNAME DEFAULT '미국';

컬럼 이름 변경 / 제약조건명 변경

RENAME COLUMN 기존이름 TO 바꿀이름;

RENAME CONSTRAINT 기존이름 TO 바꿀이름;

ALTER TABLE DEPT_COPY3
RENAME COLUMN DEPT_ID TO DEPT_CODE;

ALTER TABLE DEPT_COPY3
RENAME CONSTRAINT PK_DEPT_CODE3 TO PK_DCODE;

테이블 이름 변경

RENAME TO 바꿀명;

ALTER TABLE DEPT_COPY3
RENAME TO DEPT_TEST;

 

테이블 삭제

DROP TABLE 테이블명 CASCADE CONSTRAINTS;

'LECTURE > Oracle' 카테고리의 다른 글

11_SEQUENCE  (0) 2023.01.19
10_VIEW  (0) 2023.01.18
07_DML  (1) 2023.01.18
06_테이블 생성 및 제약조건  (0) 2023.01.17
05_SUBQUERY  (0) 2023.01.16

문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.

예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

import java.util.Scanner;

public class Main {

	public static void main(String[] args)  {
		
		Scanner sc = new Scanner(System.in);
		
        
        int[] arr = new int[9]; 
       
   
       for(int i = 0; i < arr.length; i++) {
    	   arr[i] = sc.nextInt();
       }
      
       int max = arr[0]; //최대값
       int maxi = 0;
       
     
       for(int i = 0; i<arr.length; i++) {
    	   if (arr[i] > max) {
    		   max = arr[i];
    		   maxi = i+1;
    	
    	   }
       }
    	   
    	 for(int i = 0; i < arr.length; i++) {
          if (max == arr[i]) {
        		
        		   maxi = i+1;
        	
        	   }
    	 
       }
	   System.out.println(max);
	   System.out.println(maxi);
       
       }

	}

 

메모

최대값 구하는 방법을 다시 찾아서 적용해봤다.

처음엔  배열이 9개인 걸 적용하는 것부터 헤맸고, max의 순서를 구하는 방법도 몰라서 찾아봤다.

의외로 간단한 거라 허탈하긴 했지만 잘 합쳐서 작성해봤는데 max 순서가 1 작게 나왔다.

그때 i는 0 부터 시작해서 +1을 해줘야 한다는 게 떠올라서 수정했더니 맞는 답이 나와서 제출했는데 틀렸다..

다른 사람들이 올린 질문을 보고 max 순서를 구하는 for 문을 따로 작성했더니 성공!

문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args)  {
		
		Scanner sc = new Scanner(System.in);
		
       int n = sc.nextInt();
       int[] arr = new int[n]; 
       
   
       for(int i = 0; i < n; i++) {
    	   arr[i] = sc.nextInt();
       }
      
       
       Arrays.sort(arr);
       System.out.println(arr[0] + " " + arr[n-1]);
       }

	}

 

메모

최대값, 최소값 구하는 방법을 찾아서 풀어보았다.

배열을 오름차순으로 정렬하는 메소드 Arrays.sort() 이용하기!!

문제

정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)

둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

출력

X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

import java.util.Scanner;

public class Main {

	public static void main(String[] args)  {
		
		Scanner sc = new Scanner(System.in);
		
       int n = sc.nextInt();
       int[] arr = new int[n]; 
       int x = sc.nextInt();
       
   
       for(int i = 0; i < n; i++) {
    	   arr[i] = sc.nextInt();
       }
      
       
       for(int i = 0 ; i < arr.length; i++) {
    	   if(x > arr[i]) {
    		   System.out.print(arr[i] + " ");
    	   }
       }
       
       
	}	
		
	}

 

메모

앞 문제의 풀이법을 바탕으로 문제에 맞게 수정했다.

 

문제

총 N개의 정수가 주어졌을 때, 정수 v가 몇 개인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정수의 개수 N(1 ≤ N ≤ 100)이 주어진다. 둘째 줄에는 정수가 공백으로 구분되어져있다. 셋째 줄에는 찾으려고 하는 정수 v가 주어진다. 입력으로 주어지는 정수와 v는 -100보다 크거나 같으며, 100보다 작거나 같다.

출력

첫째 줄에 입력으로 주어진 N개의 정수 중에 v가 몇 개인지 출력한다.

import java.util.Scanner;

public class Main {

	public static void main(String[] args)  {
		
		Scanner sc = new Scanner(System.in);
		
       int n = sc.nextInt();
       int[] arr = new int[n]; // 입력 받는 값 만큼의 객체의 개수를 갖는 배열을 만든다.
       int count = 0; // count 초기화
       
       // 배열 안의 숫자를 읽는다.
       for(int i = 0; i < n; i++) {
    	   arr[i] = sc.nextInt();
       }
       
       //찾을 값
       int s = sc.nextInt();
       
       //배열의 첫번째 숫자부터 마지막 숫자까지 같은지 확인, 같으면 카운트
       for(int i = 0 ; i < arr.length; i++) {
    	   if(s == arr[i]) {
    		   count ++;
    	   }
       }
       
       System.out.println(count);
       
	}	
		
	}

 

메모

그새 잊어 버려서 문법이랑 풀이 방법을 찾아보며 풀었다. 거의 풀이법을 보고 해석만 하다싶이 했는데 

맞는 개념인지 ...

 

1. 계열 정보를 저장할 카테고리 테이블을 만들려고 한다. 다음과 같은 테이블을 작성하시오.

CREATE TABLE TB_CATEGORY (
  NAME VARCHAR2(20),
  USE_YN CHAR(1) DEFAULT 1
);

ALTER TABLE TB_CATEGORY 
MODIFY USE_YN DEFAULT 'Y';

--실수 수정

 

2. 과목 구분을 저장할 테이블을 만들려고 한다. 다음과 같은 테이블을 작성하시오.

CREATE TABLE TB_CLASS_TYPE (
  NO VARCHAR2(5) PRIMARY KEY,
  NAME VARCHAR2(10)
);

 

3. TB_CATAGORY 테이블의 NAME 컬럼에 PRIMARY KEY 를 생성하시오. (KEY 이름을 생성하지 않아도 무방함. 만일 KEY 이를 지정하고자 한다면 이름은 본인이 알아서 적당한 이름을 사용한다.)

ALTER TABLE TB_CATEGORY
ADD CONSTRAINT PK_NAME PRIMARY KEY(NAME);

 

4. TB_CLASS_TYPE 테이블의 NAME 컬럼에 NULL 값이 들어가지 않도록 속성을 변경하시오.

ALTER TABLE TB_CLASS_TYPE
MODIFY NAME NOT NULL;

 

5. 두 테이블에서 컬럼 명이 NO 인 것은 기존 타입을 유지하면서 크기는 10 으로, 컬럼명이 NAME 인 것은 마찬가지로 기존 타입을 유지하면서 크기 20 으로 변경하시오.

ALTER TABLE TB_CLASS_TYPE
MODIFY NO VARCHAR2(10);

ALTER TABLE TB_CLASS_TYPE
MODIFY NAME VARCHAR2(20);

ALTER TABLE TB_CATEGORY
MODIFY NAME VARCHAR2(20);

 

6. 두 테이블의 NO 컬럼과 NAME 컬럼의 이름을 각 각 TB_ 를 제외한 테이블 이름이 앞에 붙은 형태로 변경한다. (ex. CATEGORY_NAME)

ALTER TABLE TB_CATEGORY
RENAME COLUMN NAME TO CATEGORY_NAME;

ALTER TABLE TB_CLASS_TYPE
RENAME COLUMN NAME TO CLASS_TYPE_NAME;
ALTER TABLE TB_CLASS_TYPE
RENAME COLUMN NO TO CLASS_TYPE_NO;

 

7. TB_CATAGORY 테이블과 TB_CLASS_TYPE 테이블의 PRIMARY KEY 이름을 다음과 같이 변경하시오. Primary Key 의 이름은  'PK_ + 컬럼이름‛으로 지정하시오. (ex. PK_CATEGORY_NAME )

ALTER TABLE TB_CATEGORY
RENAME CONSTRAINT PK_NAME TO PK_CATEGORY_NAME;

ALTER TABLE TB_CLASS_TYPE
RENAME CONSTRAINT SYS_C007535 TO PK_CLASS_TYPE_NO;

 

8. 다음과 같은 INSERT 문을 수행한다.

INSERT INTO TB_CATEGORY
VALUES
('공학','Y');
INSERT INTO TB_CATEGORY
VALUES
('자연과학','Y');
INSERT INTO TB_CATEGORY
VALUES
('의학','Y');
INSERT INTO TB_CATEGORY
VALUES
('예체능','Y');
INSERT INTO TB_CATEGORY
VALUES
('인문사회','Y');
COMMIT;

 

9.TB_DEPARTMENT 의 CATEGORY 컬럼이 TB_CATEGORY 테이블의 CATEGORY_NAME 컬럼을 부모 값으로 참조하도록 FOREIGN KEY 를 지정하시오. 이 때 KEY 이름은 FK_테이블이름_컬럼이름으로 지정한다. (ex. FK_DEPARTMENT_CATEGORY )

ALTER TABLE TB_DEPARTMENT
ADD 
CONSTRAINT FK_DEPARTMENT_CATEGORY FOREIGN KEY(CATEGORY) REFERENCES TB_CATEGORY(CATEGORY_NAME);

 

10. 춘 기술대학교 학생들의 정보만이 포함되어 있는 학생일반정보 VIEW 를 만들고자 한다. 아래 내용을 참고하여 적절한 SQL 문을 작성하시오.

CREATE VIEW VW_STUDENT
AS
SELECT
      STUDENT_NO 
    , STUDENT_NAME
    , STUDENT_ADDRESS
 FROM TB_STUDENT;

 

11. 춘 기술대학교는 1 년에 두 번씩 학과별로 학생과 지도교수가 지도 면담을 진행한다. 이를 위해 사용할 학생이름, 학과이름, 담당교수이름 으로 구성되어 있는 VIEW 를 만드시오. 이때 지도 교수가 없는 학생이 있을 수 있음을 고려하시오 (단, 이 VIEW 는 단순 SELECT 만을 할경우 학과별로 정렬되어 화면에 보여지게 만드시오.)

CREATE VIEW VW_COACH
 AS
 SELECT
        STUDENT_NAME
      , DEPARTMENT_NAME
      , PROFESSOR_NAME
  FROM TB_STUDENT S
  JOIN TB_DEPARTMENT D ON (S.DEPARTMENT_NO = D.DEPARTMENT_NO )
  LEFT JOIN TB_PROFESSOR P ON (S.COACH_PROFESSOR_NO = P.PROFESSOR_NO)
  ORDER BY DEPARTMENT_NAME;

 

12. 모든 학과의 학과별 학생 수를 확인할 수 있도록 적절한 VIEW 를 작성해 보자.

CREATE VIEW VW_DEPT_STUDENT
(
  DEPARTMENT_NAME
, STUDENT_COUNT
)
AS
SELECT
        D.DEPARTMENT_NAME
      , COUNT(S.STUDENT_NO)
  FROM  TB_STUDENT S
  JOIN  TB_DEPARTMENT D ON (S.DEPARTMENT_NO = D.DEPARTMENT_NO)
  GROUP BY D.DEPARTMENT_NAME;

 

13. 위에서 생성한 학생일반정보 View 를 통해서 학번이 A213046 인 학생의 이름을 본인 이름으로 변경하는 SQL 문을 작성하시오.

UPDATE
       VW_STUDENT
   SET STUDENT_NAME = 'HEYWOO'
 WHERE STUDENT_NO = 'A213046';

 

14. 13 번에서와 같이 VIEW 를 통해서 데이터가 변경될 수 있는 상황을 막으려면 VIEW 를 어떻게 생성해야 하는지 작성하시오.

CREATE VIEW VW_STUDENT
AS
SELECT
      STUDENT_NO 
    , STUDENT_NAME
    , STUDENT_ADDRESS
 FROM TB_STUDENT
 WITH READ ONLY;

-> 수정하기

'LECTURE > Oracle 과제' 카테고리의 다른 글

[춘대학시스템 워크북] DML 문제 풀이  (0) 2023.01.18

1. 과목유형 테이블(TB_CLASS_TYPE)에 아래와 같은 데이터를 입력하시오.

INSERT
  INTO TB_CLASS_TYPE
(
  CLASS_TYPE_NO
 ,CLASS_TYPE_NAME
 )
 VALUES
  ('01','전공필수');

INSERT
  INTO TB_CLASS_TYPE
(
  CLASS_TYPE_NO
 ,CLASS_TYPE_NAME
 )
 VALUES
  ('02','전공선택');
  
INSERT
  INTO TB_CLASS_TYPE
(
  CLASS_TYPE_NO
 ,CLASS_TYPE_NAME
 )
 VALUES
  ('03','교양필수');  

INSERT
  INTO TB_CLASS_TYPE
(
  CLASS_TYPE_NO
 ,CLASS_TYPE_NAME
 )
 VALUES
  ('04','교양선택');
  
INSERT
  INTO TB_CLASS_TYPE
(
  CLASS_TYPE_NO
 ,CLASS_TYPE_NAME
 )
 VALUES
  ('05','논문지도');

 

2. 춘 기술대학교 학생들의 정보가 포함되어 있는 학생일반정보 테이블을 만들고자 한다. 아래 내용을 참고하여 적절한 SQL 문을 작성하시오. (서브쿼리를 이용하시오)

CREATE TABLE TB_SIMPLE_STUDENT (
  STUDENT_NO VARCHAR2(10),
  STUDENT_NAME VARCHAR2(40),
  STUDENT_ADDRESS VARCHAR2(200)
);

INSERT
    INTO TB_SIMPLE_STUDENT
(
  STUDENT_NO
, STUDENT_NAME
, STUDENT_ADDRESS
)

(SELECT 
        STUDENT_NO
      , STUDENT_NAME
      , STUDENT_ADDRESS
   FROM  TB_STUDENT
   );

 

3. 국어국문학과 학생들의 정보만이 포함되어 있는 학과정보 테이블을 만들고자 한다. 아래 내용을 참고하여 적절한 SQL 문을 작성하시오. (힌트 : 방법은 다양함, 소신껏 작성하시오)

CREATE TABLE TB_KOR (
   STUDENT_NO VARCHAR2(10),
  STUDENT_NAME VARCHAR2(40),
  STUDENT_BIRTH VARCHAR2(10),
  PROFESSOR_NAME VARCHAR2(30)
  );
  
INSERT 
  INTO TB_KOR
( STUDENT_NO
, STUDENT_NAME
, STUDENT_BIRTH
, PROFESSOR_NAME
)
(SELECT
        STUDENT_NO
      , STUDENT_NAME
      , TO_CHAR(TO_DATE(SUBSTR(STUDENT_SSN,1,6), 'RRMMDD'), 'YYYY')
      , PROFESSOR_NAME
      FROM TB_STUDENT S
      LEFT JOIN TB_PROFESSOR P ON (S.COACH_PROFESSOR_NO = P.PROFESSOR_NO)
      JOIN TB_DEPARTMENT D ON (S.DEPARTMENT_NO = D.DEPARTMENT_NO)
      WHERE D.DEPARTMENT_NAME = '국어국문학과'
      );
      
      
      --------------------------------------------
      CREATE TABLE TB_국어국문학과
AS 
SELECT STUDENT_NO 학번
     , STUDENT_NAME 학생이름
     , 19||SUBSTR(STUDENT_SSN,1,2) 출생년도
     , PROFESSOR_NAME 교수이름
  FROM TB_STUDENT S
     , TB_PROFESSOR P
     , TB_DEPARTMENT D
 WHERE S.COACH_PROFESSOR_NO = P.PROFESSOR_NO(+)
   AND S.DEPARTMENT_NO = D.DEPARTMENT_NO
   AND DEPARTMENT_NAME = '국어국문학과';

 

4. 현 학과들의 정원을 10% 증가시키게 되었다. 이에 사용한 SQL 문을 작성하시오. (단, 반올림을 사용하여 소수점 자릿수는 생기지 않도록 한다)

UPDATE TB_DEPARTMENT
  SET CAPACITY = ROUND(CAPACITY * 1.1, 0);

 

5. 학번 A413042 인 박건우 학생의 주소가 "서울시 종로구 숭인동 181-21 "로 변경되었다고 한다. 주소지를 정정하기 위해 사용한 SQL 문을 작성하시오.

UPDATE TB_SIMPLE_STUDENT
  SET STUDENT_ADDRESS = '서울시 종로구 숭인동 181-21'
 WHERE STUDENT_NO = 'A413042';

 

6. 주민등록번호 보호법에 따라 학생정보 테이블에서 주민번호 뒷자리를 저장하지 않기로 결정하였다. 이 내용을 반영한 적절한 SQL 문장을 작성하시오. (예. 830530-2124663 ==> 830530 )

UPDATE TB_STUDENT
 SET STUDENT_SSN = SUBSTR(STUDENT_SSN,1,6);

 

7. 의학과 김명훈 학생은 2005 년 1 학기에 자신이 수강한 '피부생리학' 점수가 잘못되었다는 것을 발견하고는 정정을 요청하였다. 담당 교수의 확인 받은 결과 해당 과목의 학점을 3.5 로 변경키로 결정되었다. 적절한 SQL 문을 작성하시오.

UPDATE TB_GRADE
 SET POINT = '3.5'
 WHERE TERM_NO = '200501'
 AND STUDENT_NO = (SELECT 
                         STUDENT_NO
                     FROM TB_STUDENT S
                     JOIN TB_DEPARTMENT D ON (S.DEPARTMENT_NO = D.DEPARTMENT_NO)
                     WHERE S.STUDENT_NAME = '김명훈'
                     AND D.DEPARTMENT_NAME = '의학과'
                     );
                     
                     ++
   AND CLASS_NO = (SELECT CLASS_NO
                     FROM TB_CLASS
                    WHERE CLASS_NAME = '피부생리학');

 

8. 성적 테이블(TB_GRADE) 에서 휴학생들의 성적항목을 제거하시오

DELETE FROM TB_GRADE
WHERE STUDENT_NO IN (SELECT 
                            STUDENT_NO 
                       FROM TB_STUDENT
                       WHERE ABSENCE_YN = 'Y'
                       );
--483개 행 이(가) 삭제

'LECTURE > Oracle 과제' 카테고리의 다른 글

[춘대학시스템 워크북] DDL 문제 풀이  (0) 2023.01.18

DML(Date Manupluation Language)

INSERT UPDATE DELETE

데이터 조작 언어. 테이블에 값을 삽입 / 수정 / 삭제 하거나 조회 하는 언어

 

INSERT : 새로운 행을 추가하는 구문이다. 테이블의 행 개수가 증가한다.
  • 테이블의 일부 컬럼에 INSERT 할 때
  • INSERT INTO 테이블명 (컬럼명, 컬럼명, …) VALUES (데이터, 데이터…);
  • 테이블에 모든 컬럼에 INSERT 할 때→ 컬럼명을 기술하는 것이 의미 파악에는 더 좋다.
  • INSERT INTO 테이블명 VALUES (데이터, 데이터, …);
  • INSERT 시 VALUES 대신에 서브쿼리를 이용할 수 있다.

INSERT ALL : INSERT시에 사용하는 서브 쿼리가 같은 경우 두 개 이상의 테이블에 INSERT ALL을 이용하여 한 번에 데이터를 삽입할 수 있다.

단, 서브쿼리의 조건절이 같아야 한다.

INSERT ALL 할 테이블 만들 때,

CREATE TABLE EMP_DEPT_D1
AS
SELECT
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , HIRE_DATE
  FROM EMPLOYEE
 WHERE 1 = 0; 
    -> 무조건 FALSE. 구조만 복사하고 데이터 행들은 복사하지 않는다

CREATE TABLE EMP_MANAGER
AS
SELECT 
       EMP_ID
     , EMP_NAME
     , MANAGER_ID
  FROM EMPLOYEE
 WHERE 1 = 0;

부서코드가 D1인 직원을 조회해서 삽입

INSERT ALL
  INTO EMP_DEPT_D1
VALUES
(
  EMP_ID
, EMP_NAME
, DEPT_CODE
, HIRE_DATE
)
  INTO EMP_MANAGER
VALUES
(
  EMP_ID
, EMP_NAME
, MANAGER_ID
)
SELECT -> 서브쿼리
       EMP_ID
     , EMP_NAME
     , DEPT_CODE
     , HIRE_DATE
     , MANAGER_ID
  FROM EMPLOYEE
 WHERE DEPT_CODE = 'D1';  -> 조건이 같으면 서브쿼리 공유 가능하다

 

WHEN ~ THEN 을 이용하여 데이터를 나눠서 한 번에 삽입한다.

INSERT ALL
  WHEN HIRE_DATE < '2000/01/01'
  THEN
  INTO EMP_OLD
VALUES
(
  EMP_ID
, EMP_NAME
, HIRE_DATE
, SALARY
)
  WHEN HIRE_DATE >= '2000/01/01'
  THEN
  INTO EMP_NEW
VALUES
(
  EMP_ID
, EMP_NAME
, HIRE_DATE
, SALARY
)  
SELECT
       EMP_ID
     , EMP_NAME
     , HIRE_DATE
     , SALARY
  FROM EMPLOYEE;

 

UPDATE : 테이블에 기록된 컬럼의 값을 수정하는 구문이다.

테이블의 전체 행 개수는 변화가 없다

UPDATE 테이블명 SET 컬럼명 = 바꿀값, 컬럼명 = 바꿀값, …

[WHERE 컬럼명 / 비교연산자 / 비교값];

업테이트 할 테이블을 복사해온다.

CREATE TABLE DEPT_COPY
AS
SELECT D.*
  FROM DEPARTMENT D;

조건에 따른 업데이트

UPDATE
       DEPT_COPY
   SET DEPT_TITLE = '전략기획팀'
 WHERE DEPT_ID = 'D9';

UPDATE시에도 서브쿼리를 사용할 수 있다.

UPDATE 테이블명 SET 컬럼명 = (서브쿼리)

UPDATE
       EMP_SALARY
   SET (SALARY, BONUS) = (SELECT
                                 SALARY
                               , BONUS
                            FROM EMP_SALARY
                           WHERE EMP_NAME = '유재식'
                         )
 WHERE EMP_NAME = '방명수';

UPDATE시 변경 값은 해당 컬럼에 대한 제약 조건에 위배되지 않아야 한다.

 

DELETE : 테이블의 행을 삭제하는 구문이다. 테이블의 행의 개수가 줄어든다

DELETE FROM 테이블명 WHERE 조건

WHERE절의 조건을 설정하지 않으면 모든 행이 다 삭제된다.

FK 제약 조건이 설정되어 있는 경우 참조되고 있는 값에 대해서는 삭제가 불가능하다. 기본 삭제 룰이 삭제 제한으로 설정되어 있기 때문이다.

FK 제약 조건이 설정되어 있어도 참조되고 있지 않은 값에 대해서는 삭제가 가능하다.

 

TRUNCATE : 테이블의 전체 행을 삭제할 시 사용한다.

TRUNCATE TABLE 테이블명;

DELETE보다 수행 속도가 더 빠르며 ROLLBACK을 통해 복구할 수 없다.

 

MERGE : 구조가 같은 두 개의 테이블을 하나로 합치는 기능을 한다.

테이블에서 지정하는 조건의 값이 존재하면 UPDATE, 조건의 값이 없으면 INSERT됨

MERGE
 INTO EMP_M01 M1 --> 이 쪽으로 병합하겠다.
USING EMP_M02 M2 --> 2번 테이블을 이용해서
   ON (M1.EMP_ID = M2.EMP_ID) --> 이 기준으로 
 WHEN MATCHED THEN --> 위 조건이 매치된다면
UPDATE --> 업데이트
   SET M1.EMP_NAME = M2.EMP_NAME
     , M1.EMP_NO = M2.EMP_NO
     , M1.EMAIL = M2.EMAIL
     , M1.PHONE = M2.PHONE
     , M1.DEPT_CODE = M2.DEPT_CODE
     , M1.JOB_CODE = M2.JOB_CODE
     , M1.SAL_LEVEL = M2.SAL_LEVEL
     , M1.SALARY = M2.SALARY
     , M1.BONUS = M2.BONUS
     , M1.MANAGER_ID = M2.MANAGER_ID
     , M1.HIRE_DATE = M2.HIRE_DATE
     , M1.ENT_DATE = M2.ENT_DATE
     , M1.ENT_YN = M2.ENT_YN
 WHEN NOT MATCHED THEN --> ON 기준이 매치되지 않는다면
INSERT --> 인서트
(
  M1.EMP_ID, M1.EMP_NAME, M1.EMP_NO, M1.EMAIL, M1.PHONE
, M1.DEPT_CODE, M1.JOB_CODE, M1.SAL_LEVEL, M1.SALARY, M1.BONUS
, M1.MANAGER_ID, M1.HIRE_DATE, M1.ENT_DATE, M1.ENT_YN
)
VALUES
(
  M2.EMP_ID, M2.EMP_NAME, M2.EMP_NO, M2.EMAIL, M2.PHONE
, M2.DEPT_CODE, M2.JOB_CODE, M2.SAL_LEVEL, M2.SALARY, M2.BONUS
, M2.MANAGER_ID, M2.HIRE_DATE, M2.ENT_DATE, M2.ENT_YN
);

'LECTURE > Oracle' 카테고리의 다른 글

10_VIEW  (0) 2023.01.18
08_TCL & 09_DDL  (0) 2023.01.18
06_테이블 생성 및 제약조건  (0) 2023.01.17
05_SUBQUERY  (0) 2023.01.16
04_ JOIN  (0) 2023.01.16

+ Recent posts