오라클 DML

95qwer·2022년 5월 19일
0

DML이란

데이터베이스 사용자 또는 소프트웨어가 컴퓨터 DB에 대해 데이터 검색 / 등록 / 삭제 / 수정을 위한 DB 언어 또는 DB 언어 요소이다.

종류

SELECT, INSERT, DELETE, UPDATE

SELECT

WHERE : 어떤 열을 불러올지 지정
GROUP BY : 연산 함수가 각 그룹에 적용되도록 속성을 그룹 열에 공유하는 것
HAVING : GROUP BY 절에서 정의된 그룹 중에서 검색
ORDER BY : 반환하는 열의 정렬 순서를 지정

기본 형태

SELECT 조회할 컬럼 명, ~ (A.컬럼 명)
FROM 테이블1 A
         ,테이블2 B
         , …
         ,테이블N N

필요 시
WHERE 조건
   AND 조건 (OR) 조건
   AND 조건
GROUP BY 묶을 컬럼
HAVING 그룹 함수
ORDER BY 정렬 순서

SELECT 활용

SELECT문은 정말 다양하게 활용할 수 있습니다.

서브쿼리

SELECT 컬럼1
         ,(SELECT절) AS "~"
의 형식으로 새로운 컬럼을 뽑아낼 수 있습니다.

또한
SELECT 컬럼1
  FROM 테이블1
           ,테이블2
 WHERE 컬럼2 = (SELECT절)
의 형태로도 활용할 수 있습니다.

테이블 생성 시에도 매우 유용하게 활용할 수 있습니다.

중복 데이터 삭제 : DISTINCT(열이 1개인 경우)

조회한 데이터 중 불필요한 중복을 제거하고 특정 데이터 종류만 확인하고 싶을 때 사용합니다.

SELECT DISTINCT DEPTNO
FROM EMP;
--> SQL문의 출력 결과로 SELECT 절에 명시한 컬럼 중, 같은 내용이 2개 이상일 경우
중복행은 한 개만 남겨두고 그밖의 행은 모두 제거합니다.

중복 데이터 삭제 : DISTINCT(열이 여러 개인 경우)

SELECT DISTINCT JOB, DEPTNO
FROM EMP;

열 하나의 중복이 아니라 JOB,DEPTNO 두 컬럼을 합쳐 중복을 확인합니다.
예를 들어 (매니저, 10) (매니저, 20) (근로자, 10)
이 3가지의 데이터인 경우, 모두 출력됩니다. 각각의 컬럼으로 보면 데이터가 중복되는 게 있지만, 2개의 컬럼을 묶으면 각각 유니크한 데이터가 되기 때문입니다.

테이블을 그대로 복사하고 싶으면

CREATE TABLE 새로 만들 테이블 명
AS
SELECT *
FROM 복사할 테이블 명

테이블 구조만 재사용하고 싶으면

CREATE TABLE 새로 만들 테이블 명
AS
SELECT *
FROM 복사할 테이블 명
WHERE 1 <> 1

SELECT를 통한 다양한 조인들

SELECT *
FROM 테이블1 (기준 테이블)
         ,테이블2
         ,테이블3
         ,테이블4
WHERE 테이블1.컬럼 = 조건1
   AND 테이블1.컬럼 = 테이블 2.컬럼 (이너 조인)
   AND 테이블1.컬럼 = 테이블3.컬럼(+) (아우터 조인)
   AND 테이블2.컬럼 = 조건2
   AND 테이블2.컬럼 = 테이블4.컬럼

참고)
이너 조인과 아우터 조인은 다음에 더 상세하게 다뤄보겠습니다.

별칭 설정하기(Alias, AS)

컬럼에 산술식을 사용할 수도 있습니다.
SELECT ENAME, SAL, SAL*12+COMM, COMM
FROM EMP;
위처럼 컬럼에 산술식을 사용하여 가져올 수 있는데, 이 경우에 컬럼 명이 너무 길어집니다.
따라서 AS를 활용하여 별칭을 줄 수 있습니다.

INSERT

INSERT INTO 테이블 명[(열1, 열2, ..., 열N)]
VALUES (열1에 들어갈 데이터, 열2에 들어갈 데이터, ..., 열N에 들어갈 데이터)

발생할 수 있는 오류

지정한 열 개수와 각 열에 입력할 데이터 개수가 일치하지 않거나, 자료형이 맞지 않는 경우
혹은 열 길이를 초과하는 데이터를 지정하는 경우

테이블에 NULL 데이터 입력하기

  1. 명시적 입력
    INSERT INTO DEPT_TMP (DETPNO, DNAME, LOC)
    VALUES (780, 'WEB', NULL);
    ;

  2. 암시적 입력
    INSERT INTO DEPT_TMP (DEPTNO, LOC
    VALUES (90, 'SEOUL')
    ;

위처럼 DNAME 컬럼을 빼고 그에 해당하는 데이터를 넣지 않으면 자동으로 NULL 입력

날짜형 데이터 입력하기

만약 날짜형 데이터를 입력하려면,

  1. YYYY/MM/DD
  2. YYYY-MM-DD
  3. TO_DATE 함수 활용

INSERT INTO TB_TMP (NUMB, ACCT_DATE)
VALUES (10, '1995/03/15')
;

INSERT INTO TB_TMP (NUMB, ACCT_DATE)
VALUES (10, ‘1995-03-15’)
;

INSERT INTO TB_TMP (NUMB, ACCT_DATE)
VALUES (10, TO_DATE(‘15/03/1995’, DD/MM/YYYY))
;

편리하게 현재 시점으로 날짜 입력하기 --> SYSDATE 활용

INSERT INTO TB_TMP (NUMB, REGI_DATE)
VALUES (10, SYSDATE)
;
→ YYYY/MM/DD 오전/오후 hh:mm:ss

유의점)
년/월/일 순서와 반대로 일/월/년 순서로 데이터를 입력하면 오류가 발생하고 데이터 입력되지 않습니다.

INSERT 활용

서브 쿼리를 사용하여 한 번에 여러 데이터 추가하기

INSERT INTO EXP_TEMP (EMPNO, ENAME, JOB, HIREDATE, SAL, DETPNO)
SELECT EMPNO, ENAME, JOB, HIREDATE, SAL, DEPTNO
FROM EMP

INSERT문에서 서브 쿼리 사용할 때 유의점

  • VALUES절은 사용하지 않는다.
  • 데이터가 추가되는 테이블의 열 개수와 서브 쿼리의 열 개수가 일치해야 한다.
  • 데이터가 추가되는 테이블의 자료형과 서브 쿼리의 자료형이 일치해야 한다.

UPDATE

  • 테이블에 있는 데이터 수정하기

기본 틀

UPDATE 변경할 테이블 명
SET 변경할 컬럼1 = 데이터, 변경할 컬럼2 = 데이터, ..., 변경할 컬럼n = 데이터
WHERE 데이터를 변경할 대상 행을 선별하기 위한 조건 (선택 요소)

데이터 전체 수정하기

UPDATE TB_TMP
SET TMP_COL = "TMP"

위의 쿼리는 TB_TMP 테이블의 TMP_COL 컬럼의 데이터를 모두 "TMP" 수정하라는 것입니다.

수정한 내용을 되돌리고 싶을 때 : ROLLBACK

원치 않는 내용으로 바뀌었거나, 실수했을 때 실행을 취소하기 위해 ROLLBACK 명령문을 사용할 수 있습니다.

ROLLBACK;

데이터를 바로 반영하고 싶으면 COMMIT;을 입력하면 됩니다.
다만, COMMIT 이후에는 ROLLBACK을 해도 데이터가 복구되지 않으니 주의해야 합니다.

WHERE 절을 활용하여 데이터 일부분만 수정하기

UPDATE TB_TMP
SET TMP_COL = "TMP2"
WHERE TMP_COL2 = '2'

이 경우, 조건식에 의해 TMP_COL2 = '2'인 행의 TMP_COL만 "TMP2"로 변경됩니다.

profile
한땀한땀오타없이

0개의 댓글