DBMS table_DML.sql 활용

으누·2024년 8월 30일
1
post-thumbnail

table_DML.sql

INSERT

- 테이블에 새로운 데이터를 추가할 때 사용합니다

- INSERT INTO table_name

( column name , ... )

VALUES ( column_value , ... );

-- 새로운 데이터를 추가하기 위해서 사용하는 명령어 INSERT INTO VALUES 는

-- 괄호안의 컬럼명에 있는 목록수와 VALUES 다음에 오는 괄호에 작성한 값의 갯수가 일치해야 합니다

INSERT INTO dept01
(deptno, dname, loc)
VALUES
(10, 'accounting', 'new york');

dept01 생성 후 행 을 추가합니다.

SELECT * FROM dept01;

-- 컬럼명이 다르면 error

-- INSERT INTO dept01 (deptno, dname, lok) VALUES (10, 'accounting', 'new york');

-- 컬럼수와 VALUES 다음에 작성한 값의 수가 다르면 error

-- INSERT INTO dept01 (deptno, dname, loc) VALUES (10, 'accounting');
-- INSERT INTO dept01 (deptno, dname, loc) VALUES (10, 'accounting', 'new york', 1);

-- 컬럼에 입력할 값의 데이터 타입이 다르면 error

-- INSERT INTO dept01 (deptno, dname, loc) VALUES (10, 'accounting', 12);

-- 모든 컬럼에 데이터를 입력하는 경우에는 컬럼 목록을 작성하지 않아도 됩니다

-- 컬럼 목록이 생략되면 VALUES 다음에 값들이 테이블 컬럼에 순서대로 저장됩니다

INSERT INTO dept01 VALUES (50, 'accounting', 'seoul');
INSERT INTO dept01 VALUES (50, 'accounting', 'seoul');
INSERT INTO dept01 (dname, loc, deptno) VALUES ('cloud', 'busan', 70);


SELECT * FROM dept01;

NULL 값 추가

- NULL 또는 '' 사용

INSERT INTO dept01 VALUES (40, 'system', NULL);
INSERT INTO dept01 VALUES (70, NULL, '');

행을 추가 한후

서브쿼리를 사용해서 row 복사

CREATE TABLE dept02
AS
SELECT * FROM dept WHERE 1=0;

SELECT * FROM dept02;

INSERT INTO dept02
SELECT * FROM dept;

SELECT * FROM dept02;

INSERT ALL 을 사용한 다중행 입력

-- 사원번호, 사원명, 입사일자를 관리하는 EMP_HIRE 테이블 생성

CREATE TABLE emp_hire
AS
SELECT empno, ename, hiredate
FROM emp WHERE 1=0;

생성후 확인

SELECT * FROM emp_hire;

-- 사원번호, 사원명, 상사를 관리하는 emp_mgr 테이블 생성

CREATE TABLE emp_mgr
AS
SELECT empno, ename, mgr
FROM emp WHERE 1=0;

생성후 확인하기

SELECT * FROM emp_mgr;

행추가하기

INSERT ALL
INTO emp_hire VALUES (empno, ename, hiredate)
INTO emp_mgr VALUES (empno, ename, mgr)
SELECT empno, ename, hiredate, mgr
FROM emp
WHERE deptno=20;

SELECT * FROM emp_hire;

SELECT * FROM emp_mgr;

UPDATE

- 테이블에 저장된 데이터를 수정할 때 사용합니다

- UPDATE table_name

SET column_name = value, ...

WHERE conditions;

- WHERE 절을 지정하면 특정 행의 값이 수정되고, 사용하지 않으면 모든 행이 수정됩니다

-- 연습테이블 생성

DROP TABLE emp01 PURGE;
CREATE TABLE emp01 AS SELECT * FROM emp;
SELECT * FROM emp01;

-- 모든 사원의 부서번호를 30번으로 수정

UPDATE emp01
SET deptno=30;

행을 추가합니다

SELECT * FROM emp01;

특정 행만 수정

-- 부서번호가 10번인 사원의 부서번호를 50번으로 수정

UPDATE emp01
SET deptno=50
WHERE deptno=10;

SELECT * FROM emp01;

2개 이상의 컬럼의 값 수정

- 기존 SET 절에 쉼표로 구분해서 '컬럼=값' 을 작성합니다

UPDATE emp01
SET deptno=40, job='MANAGER'
WHERE ename='SMITH';

SELECT * FROM emp01;

서브 쿼리를 사용한 데이터 수정

  • UPDATE 문의 SET 절에 서브쿼리를 적용하면, 서브쿼리를 실행한 결과로 내용이 변경됩니다

dept01 연습테이블 생성

DROP TABLE dept01 PURGE;
CREATE TABLE dept01 AS SELECT * FROM dept;
SELECT * FROM dept01;

-- 20번 부서의 지역명을 40번 부서의 지역명으로 설정

UPDATE dept01
SET loc=(SELECT loc
         FROM dept01
         WHERE deptno=40)
WHERE deptno=20;

행을 추가합니다

SELECT * FROM dept01;

-- 부서번호 20번인 부서의 부서명과 지역명을 부서번호 30번과 동일하게 설정

UPDATE dept01
SET (dname, loc)=(SELECT dname, loc
                  FROM dept01
                  WHERE deptno=30)
WHERE deptno=20;

SELECT * FROM dept01;

DELETE

- 테이블에 저장되어 있는 데이터를 삭제합니다

- DELETE FROM table_name

WHERE conditions;

dept01 테이블의 모든 데이터 삭제

DELETE FROM dept01;

삭제 확인

SELECT * FROM dept01;

-- dept01 테이블의 30번 부서번호 삭제( 부분 삭제)

DELETE FROM dept01
WHERE deptno=30;

삭제 확인

SELECT * FROM dept01;

MERGE

  • 구조가 같은 두개의 테이블을 하나의 테이블로 합치는 기능을 합니다

    기존에 존재하는 행이 있으면 새로운 값으로 갱신(UPDATE) 하고,
    존재하지 않으면 새로운 행으로 추가(INSERT) 됩니다

-- 연습 테이블1 생성

DROP TABLE emp01 PURGE;
CREATE TABLE emp01 AS SELECT * FROM emp;
SELECT * FROM emp01;

-- 연습테이블2 생성

DROP TABLE emp02 PURGE;
CREATE TABLE emp02 AS SELECT * FROM emp WHERE job='MANAGER';
SELECT * FROM emp02;

-- emp02 테이블의 job 을 'TEST' 로 변경

UPDATE emp02
SET job='TEST';

결과 확인

SELECT * FROM emp02;

-- emp02 테이블에 데이터 추가

INSERT INTO emp02
VALUES (7000, 'ROBOT', 'AI', 7777, '2024/08/26', 2000, 200, 90);

데이터 추가 확인

SELECT * FROM emp02;

-- emp01 테이블에 emp02 테이블 병합

MERGE INTO emp01 -- 병합 테이블
USING emp02 -- 병합에 사용하는 데이터 테이블
ON(emp01.empno=emp02.empno) -- 테이블 연결 조건 : empno 값이 일치하는 행을 기준
WHEN MATCHED THEN -- emp01 테이블과 emp02 테이블에서 일치하는 empno 가 있을 경우 실행

UPDATE SET emp01.ename=emp02.ename,
           emp01.job=emp02.job,
           emp01.mgr=emp02.mgr,
           emp01.hiredate=emp02.hiredate,
           emp01.sal=emp02.sal,
           emp01.comm=emp02.comm,
           emp01.deptno=emp02.deptno

WHEN NOT MATCHED THEN -- emp02 테이블에는 있지만 emp01 테이블에는 없는 empno 의 경우 실행

INSERT VALUES (emp02.empno,
               emp02.ename,
               emp02.job,
               emp02.mgr,
               emp02.hiredate,
               emp02.sal,
               emp02.comm,
               emp02.deptno);
           ![](https://velog.velcdn.com/images/smsee3/post/0a2242b5-01b9-4996-b309-b50f0dae6950/image.png)

SELECT * FROM emp01;

quiz

-- EMP 테이블의 empno, ename, job, sal 컬럼 이름만 적용된 TEST01 테이블을 생성하세요

-- 이미 있는 테이블이면 삭제후에 생성하세요

DROP TABLE TEST01 PURGE;
DROP TABLE TEST02 PURGE;
CREATE TABLE TEST01
AS
SELECT empno, ename, job, sal FROM emp WHERE 1=0;
SELECT * FROM TEST01;

-- TEST01 테이블에 데이터를 3개 추가하세요

INSERT INTO TEST01 VALUES (1000, 'manA', 'coder', 10000);
INSERT INTO TEST01 VALUES (1010, 'robot', 'ai', 20000);
INSERT INTO TEST01 VALUES (1020, 'manB', 'system', 30000);
SELECT * FROM TEST01;

-- TEST01 테이블에 job 은 null 값을 가지는 데이터 2개를 추가하세요

INSERT INTO TEST01 VALUES (1030, 'manA', '', 40000);
INSERT INTO TEST01 VALUES (1040, 'manA', NULL, 50000);
SELECT * FROM TEST01;

-- TEST01 테이블에 EMP 테이블의 부서번호 10번의 사원 정보를 추가하세요

INSERT INTO TEST01
SELECT empno, ename, job, sal
FROM emp
WHERE deptno=10;
SELECT * FROM TEST01;

-- TEST01 테이블의 사원 중 급여가 5000 이상인 사원들의 급여를 3000씩 감소 시키세요

UPDATE TEST01
SET sal=sal-3000
WHERE sal>=5000;
SELECT * FROM TEST01;

-- 서브쿼리를 사용해서 EMP 테이블의 저장된 ename, sal, hiredate, deptno 컬럼을 적용한 TEST02 테이블을 생성하세요

CREATE TABLE TEST02
AS
SELECT ename, sal, hiredate, deptno
FROM emp;
SELECT * FROM TEST02;

-- TEST02 테이블의 DALLAS 에 위치한 부서 소속의 사원들 급여를 1000 씩 인상하세요

UPDATE TEST02
SET sal=sal+1000
WHERE deptno=(SELECT deptno
              FROM dept
              WHERE loc='DALLAS');
SELECT * FROM TEST02;

-- 서브쿼리 문을 사용해서 TEST02 테이블의 모든 사원의 급여와 입사일을 KING 인 사원의 급여와 입사일로 변경하세요

UPDATE TEST02
SET (sal, hiredate)=(SELECT sal, hiredate
                     FROM TEST02
                     WHERE ename='KING');
SELECT * FROM TEST02;

-- TEST01 테이블에서 직급이 정해지지 않은 사원을 삭제하세요

DELETE FROM TEST01
WHERE job IS NULL;
SELECT * FROM TEST01;

-- TEST02 테이블에서 RESEARCH 부서 소속 사원들만 삭제하세요

DELETE FROM TEST02
WHERE deptno=(SELECT deptno
              FROM dept
              WHERE dname='RESEARCH');
SELECT * FROM TEST02;
profile
코딩 일기장

0개의 댓글