본문 바로가기
SQL

SQL 6일차(2)

by teg0 2025. 7. 31.

DQL(QUERY 데이터) : SELECT

    DML(MANIPULATION 데이터 조작어) : INSERT, UPDATE, DELETE
    DDL(DEFINITION 데이터 정의어) : CREATE, ALTER, DROP
    DCL(CONNTROL 데이터 제어어) : GRANT, REVOKE
    TCL(TRANSACTION 트랜잭션 제어어) : COMMIT, ROLLBACK

<DML>

     데이터 조작어
     테이블 값을 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 구문

 


1. INSERT

     테이블에 새로운 행을 추가하는 구문
        
     [표현법]
          1) INSERT INTO 테이블명 VALUES(값1, 값2, 값3 ...)
    

     테이블의 모든 컬럼에 대한 값을 순서대로 제시해서 한 행을 INSERT하고자 할 때 사용
     컬럼의 수와 순번을 지켜서 VALUES값을 나열해야 한다.

 

SELECT * FROM EMPLOYEE;

INSERT INTO EMPLOYEE
VALUES(900, '김수민', '880914-1234567', 'SD123@NAVER.COM', 01012345678, 'D7', 'J5', 4000000, 0.2, 200, SYSDATE, NULL, 'N');

 

      [표현법] 

           2) INSERT INTO 테이블명(컬럼, 컬럼, 컬럼...) VALUES(값1, 값2, 값3...)
      테이블에 내가 선택한 컬럼에 대한 값만 INSERT할 수 있다.
       컬럼 값을 제시하지 않은 값은 기본적으로 NULL이 들어가며, DEFAULT가 설정되어 있다면, DEFAULT값으로 설정.
       -> DEFAULT 값이 없고 NOT NULL 제약조건이 걸려있는 컬럼은 반드시 직접 값을 넣어야한다.

INSERT INTO EMPLOYEE(EMP_ID, EMP_NAME, EMP_NO, JOB_CODE, HIRE_DATE)
VALUES(901, '최수민', '440701-2345678', 'J7', SYSDATE);

 

            3) INSERT INTO 테이블명 (서브쿼리);
       VALUES에 직접 값을 명시한느 것이 아니라, 대신 서브커리로 조화된 값을 모두 INSERT가능

DROP TABLE EMP_01;
--테이블 삭제

CREATE TABLE EMP_01(
    EMP_ID NUMBER,
    EMP_NAME VARCHAR2(20),
    DEPT_TITLE VARCHAR2(20)
);
--테이블 생성
SELECT * FROM EMP_01;

--생성 확인
INSERT INTO EMP_01 (SELECT EMP_ID, EMP_NAME, DEPT_TITLE 
                        FROM EMPLOYEE
                        LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID));
-- 서브쿼리와 LEFT JOIN으로 ROW값 삽입

 

2. INSERT ALL(다중 테이블 삽입)

         두개 이상의 테이블에 각각 INSERT 할때 사용되는 서브쿼리가 동일한 경우

 

CREATE TABLE EMP_DEPT
AS (SELECT EMP_ID, EMP_NAME, DEPT_CODE, 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을 사용하기 위한 두 테이블을 생성

 

      [표현법]
            INSERT ALL
                  INTO 테이블명1 VALUES(컬럼, 컬럼 ...)
                  INTO 테이블명2 VALUES(컬럼, 컬럼 ...)
                  서브쿼리;

 

INSERT ALL
    INTO EMP_DEPT 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');

각 테이블의 컬럼들을 VELUES로 작성하고 서브쿼리를 사용한다.

 

3. UPDATE

         테이블에 기록되어 있는 기존의 데이터를 수정하는 구문
        
        [표현법]
            UPDATE 테이블명
                SET 컬럼1 = 값1,
                    컬럼2 = 값2 ...
                 [WHERE 조건];
                 
        WHERE 절이 없으면 전체 행을 수정함.
        UPDATE시에도 제약조건을 잘 확인해야함.

 

CREATE TABLE DEPT_TABLE
AS (SELECT * FROM DEPARTMENT);

새로운 테이블에 DEPARTMENT 테이블을 복제한다.

 

D9부서의 부서명을 '전략기획팀'으로 변경

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

 

     UPDATE에서 서브쿼리 사용
    
     UPDATE 테이블명
          SET 컬럼명 = (서브쿼리)
          WHERE 조건

 

CREATE TABLE EMP_SALARY
AS (SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, BONUS
        FROM EMPLOYEE);

새로운 테이블에 EMPLOYEE 테이블을 복제하며, EMP_ID, EMP_NAME, DEPT_CODE, SALARY, BONUS을 컬럼으로 지정.

 

방명수 사원의 급여와 보너스 값을 유재식 사원의 급여와 보너스 값으로 변경

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

튜플 방식을 사용하는 다중열 서브쿼리를 이용.

 

아시아 지역에서 근무하는 사원들의 보너스값을 0.3으로 변경

UPDATE EMP_SALARY  
    SET BONUS = 0.3
    WHERE EMP_ID IN (SELECT EMP_ID FROM EMP_SALARY
                    JOIN DEPARTMENT ON DEPT_CODE = DEPT_ID
                    JOIN LOCATION ON LOCATION_ID = LOCAL_CODE
                    WHERE LOCAL_NAME LIKE 'ASIA%');

다중 조인, LIKE 연산자를 사용하여 ASIA에 있는 사원들을 찾는다.

 

4. DELETE

         테이블에 기록된 데이터를 삭제하는 구문(한 행 단위로 삭제가 됨.)
        
        [표현법]
            DELETE FROM 테이블명
                [WHERE 조건]
                
        WHERE 조건을 입력하지 않으면 전체행이 삭제됨.

 

DELETE FROM EMPLOYEE
WHERE EMP_ID = 901;

조건문을 사용하여 EMP_ID가 901인 사원을 삭제한다.

 

'SQL' 카테고리의 다른 글

SQL 7일차(1)  (3) 2025.08.01
SQL 6일차(3)  (2) 2025.07.31
SQL 6일차(1)  (1) 2025.07.31
SQL 5일차(연습문제)  (4) 2025.07.30
SQL 5일차  (1) 2025.07.30