[ORACLE] INTO 구문

김민성·2023년 4월 11일
0
post-thumbnail

INTO 구문에는 4가지가 있다.

  1. SELECT INTO
    • SELECT INTO는 쿼리 결과를 테이블로 생성하고 싶을 때 사용한다.
  2. INSERT INTO
    • INSERT INTO는 쿼리 결과를 기존의 테이블에 추가하고 싶을 때 사용한다.
  3. MERGE INTO
    • MERGE INTO는 테이블에 데이터가 없으면 INSERT 있으면 UPDATE한다.
  4. FETCH INTO
    • 결과 집합에서 데이터를 검색하고 변수에 할당한다.
    • Cursor에서 사용하므로 Cursor를 포스트 할 때 설명하겠다.

SELECT INTO

  • 쿼리의 결과를 새 테이블로 만든다.
  • 기존에 존재하지 않는 테이블이 새로 생성된다.

    뷰와 비슷한 효과를 낼 수 있다.

선언

CREATE TABLE 테이블명 AS
	SELECT *
    FROM 테이블명
    
-- 뷰의 선언 (차이점)
CREATE [OR REPLACE] VIEW 뷰 이름 AS 쿼리

또는 이렇게 사용한다

SELECT name, department, salary
INTO high_salary_employees
FROM employees
WHERE salary >= 5000;

employees 테이블에서 조건에 맞는 데이터를 선택하여
high_salary_employees 라는 새로운 테이블을 생성하고
선택한 데이터를 새로운 테이블에 삽입한다.

INSERT INTO

  • 쿼리의 결과를 기존의 테이블에 추가한다.
    원본 테이블과 대상 테이블이 모두 있을 경우에 사용한다.
  • SELECT 하는 테이블과 INSERT 하는 테이블은 동일한 구조를 가져야 한다.
  • 두 개의 별도 쿼리를 하나로 합치는 것이다.

선언

INSERT INTO 테이블명1
	SELECT *
    FROM 테이블명2
    WHERE 조건~~

아래는 예시이다.

INSERT INTO high_salary_employees
SELECT name, department, salary
FROM employees
WHERE salary >= 5000;

employees 테이블에서 조건에 맞는 데이터를 선택하여
high_salary_employees 테이블에 삽입한다.

MERGE INTO

  • 대상 테이블의 해당 KEY에 맞는 데이터가 이미 존재한다면 UPDATE를 하고 존재하지 않으면 INSERT를 한다.
  • Oracle 9i 부터 사용이 가능하다.
  • DELETE 절은 Oracle 10g 부터 사용이 가능하다

선언

MERGE INTO 테이블명
USING DUAL
ON 조건
WHEN MATCHED THEN
	UPDATE SET 업데이트 내용
	DELETE 삭제할 내용
WHEN NOT MATCHED THEN
	INSERT 컬럼명1, 컬럼명2 ..
	VALUES1,2...
    
  • INTO : INSERT or UPDATE 될 테이블 or 뷰를 지정
  • USING : 비교할 소스 테이블 or 뷰 or 서브쿼리를 지정
    - INTO 절의 테이블과 동일하거나 다를 수 있다.
  • ON : 조건절
  • WHEN MATCHED : ON 조건이 TRUE인 ROW에 수행할 내용 (UPDATE + DELETE 또는 UPDATE)
  • WHEN NOT MATCHED : ON 조건이 FALSE인 ROW에 수행할 내용 (INSERT)

예제
employees 테이블과 salary_changes 테이블을 병합하는 예시를 만들어보자.

"employees" 테이블은 직원들의 정보를
"salary_changes" 테이블은 직원들의 급여 변화를 가지고 있다.

먼저 테스트 데이터를 생성해준다.

CREATE TABLE employees (
  employee_id NUMBER PRIMARY KEY,
  name VARCHAR2(50) NOT NULL,
  department VARCHAR2(50) NOT NULL,
  salary NUMBER NOT NULL
);

CREATE TABLE salary_changes (
  employee_id NUMBER PRIMARY KEY,
  salary NUMBER NOT NULL
);

INSERT INTO employees (employee_id, name, department, salary)
VALUES (1, 'John Smith', 'Sales', 5000);

INSERT INTO employees (employee_id, name, department, salary)
VALUES (2, 'Jane Doe', 'Marketing', 6000);

INSERT INTO salary_changes (employee_id, salary)
VALUES (1, 5500);

INSERT INTO salary_changes (employee_id, salary)
VALUES (3, 7000);
employee_idnamedepartmentsalary
1John SmithSales5000
2Jane DoeMarketing6000

이제 employees 테이블과 salary_changes 테이블을 병합하여 employees 테이블의 급여를 업데이트하거나,
salary_changes 테이블에만 있는 새로운 직원 데이터를 employees 테이블에 추가하는 다음과 같은 SQL 쿼리를 작성해 보자

MERGE INTO employees e
USING salary_changes s
ON (e.employee_id = s.employee_id)
WHEN MATCHED THEN
  UPDATE SET e.salary = s.salary
WHEN NOT MATCHED THEN
  INSERT (e.employee_id, e.name, e.department, e.salary)
  VALUES (s.employee_id, 'New Employee', 'New Department', s.salary);

위의 쿼리는
1. employees 테이블과 salary_changes 테이블을 조인하여 두 테이블에서 일치하는 데이터를 찾는다.
2. employees 테이블에서 일치하는 데이터가 있는 경우, 해당 직원의 급여를 salary_changes 테이블의 급여로 업데이트 한다.
3. employees 테이블에서 일치하는 데이터가 없는 경우, salary_changes 테이블의 새로운 직원 데이터를 employees 테이블에 추가 한다.

결과적으로 이 테이블이 출력된다.

employee_idnamedepartmentsalary
1John SmithSales5500
2Jane DoeMarketing6000
3New EmployeeNew Department7000
profile
정리하는 개발자

0개의 댓글