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절)
의 형태로도 활용할 수 있습니다.
테이블 생성 시에도 매우 유용하게 활용할 수 있습니다.
조회한 데이터 중 불필요한 중복을 제거하고 특정 데이터 종류만 확인하고 싶을 때 사용합니다.
SELECT DISTINCT DEPTNO
FROM EMP;
--> SQL문의 출력 결과로 SELECT 절에 명시한 컬럼 중, 같은 내용이 2개 이상일 경우
중복행은 한 개만 남겨두고 그밖의 행은 모두 제거합니다.
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 *
FROM 테이블1 (기준 테이블)
,테이블2
,테이블3
,테이블4
WHERE 테이블1.컬럼 = 조건1
AND 테이블1.컬럼 = 테이블 2.컬럼 (이너 조인)
AND 테이블1.컬럼 = 테이블3.컬럼(+) (아우터 조인)
AND 테이블2.컬럼 = 조건2
AND 테이블2.컬럼 = 테이블4.컬럼
참고)
이너 조인과 아우터 조인은 다음에 더 상세하게 다뤄보겠습니다.
컬럼에 산술식을 사용할 수도 있습니다.
SELECT ENAME, SAL, SAL*12+COMM, COMM
FROM EMP;
위처럼 컬럼에 산술식을 사용하여 가져올 수 있는데, 이 경우에 컬럼 명이 너무 길어집니다.
따라서 AS를 활용하여 별칭을 줄 수 있습니다.
INSERT
INSERT INTO 테이블 명[(열1, 열2, ..., 열N)]
VALUES (열1에 들어갈 데이터, 열2에 들어갈 데이터, ..., 열N에 들어갈 데이터)
지정한 열 개수와 각 열에 입력할 데이터 개수가 일치하지 않거나, 자료형이 맞지 않는 경우
혹은 열 길이를 초과하는 데이터를 지정하는 경우
명시적 입력
INSERT INTO DEPT_TMP (DETPNO, DNAME, LOC)
VALUES (780, 'WEB', NULL);
;
암시적 입력
INSERT INTO DEPT_TMP (DEPTNO, LOC
VALUES (90, 'SEOUL')
;
위처럼 DNAME 컬럼을 빼고 그에 해당하는 데이터를 넣지 않으면 자동으로 NULL 입력
만약 날짜형 데이터를 입력하려면,
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;
데이터를 바로 반영하고 싶으면 COMMIT;을 입력하면 됩니다.
다만, COMMIT 이후에는 ROLLBACK을 해도 데이터가 복구되지 않으니 주의해야 합니다.
UPDATE TB_TMP
SET TMP_COL = "TMP2"
WHERE TMP_COL2 = '2'
이 경우, 조건식에 의해 TMP_COL2 = '2'인 행의 TMP_COL만 "TMP2"로 변경됩니다.