Data 조작어(DML, Data Manipulation Language)
테이블에 새 행을 추가 하거나, 기존 행 수정 또는 기존 행 삭제 등의 논리 작업 단위를 형성하는 DML문 모음을 트랜잭션(Transaction)이라 한다.
SELECT
SELECT문은 데이터베이스에서 정보를 검색한다.
SELECT [DISTINCT] { *, column [alias], ... }
FROM table
[WHERE condition];
SELECT 절은 표시할 컬럼을칼럼을 지정하고, FROM 절은 SELECT 절에 나열된 칼럼을 포함하는 테이블을 지정한다.
SELECT : 하나 이상의 컬럼으로 구성되는 목록
DISTINCT : 명시하는 경우 중복되는 칼럼을 생략
* : 모든 컬럼 선택
column : 명명된 칼럼을 선택
alias : 선택된 컬럼에 다른 머리글을 부여 (별칭)
FROM table : 해당 칼럼을 포함하는 테이블을 지정
SQL문은 대소문자를 구별하지 않고, 한 줄이 넘어가도 상관없다. 그러나 Keyword 같은 경우는 약어로 쓰거나 다음 행에 나눠 쓸 수 없다.
SQL문이 길어지는 경우 절(ex. FROM절, WHERE절 등)은 일반적으로 서로 다른 행에 쓴다.
모든 컬럼 선택
SELECT *
FROM employee;
특정 컬럼 선택
SELECT id, name
FROM employee;
INSERT
INSERT문을 사용하여 테이블에 새 행을 추가한다. INSERT문은 한 번에 한 행만 추가할 수 있다.
INSERT INTO table [(coluumn [, column, ...])]
VALUES (value [, value, ...])
기본적으로 테이블의 칼럼 순서대로 값을 나열한다.
INSERT INTO employee (id, name, address)
VALUES (10, '홍길동', '서울');
문자와 날짜 값은 작은 따옴표로 묶어야 한다.
Null 값을 갖는 행 삽입
INSERT INTO employee (id, name)
VALUES (10, '홍길동');
암시적 방법으로, address 값을 Null 값으로 넣기 위해 칼럼 목록에서 address를 생략하였다.
INSERT INTO employee (id, name, address)
VALUES (10, '홍길동', NULL);
명시적 방법으로 직접 NULL 키워드를 지정하였다.
특정 값 삽입
현재 날짜 삽입은 굉장히 많이 쓰이는데, MySQL에서는 now()로 표현하는 것과 달리 Oracle SQL에서는 SYSDATE 함수를 사용하여 현재 날짜와 시간을 기록한다.
INSERT INTO employee (id, name, email, hire_date)
VALUES (10, '홍길동', 'hong@mail.com', SYSDATE);
현재 날짜가 아닌 특정 날짜 값을 삽입하고 싶다면, TO_DATE() 함수를 사용하면 된다.
INSERT INTO employee (id, name, mail, hire_date)
VALUES (11, '김철수', 'kim@mail.com', TO_DATE('20220201', 'yyyymmdd'));
Subquery 사용
다른 테이블에서 행 복사를 하여 INSERT문을 작성할 수 있다.
INSERT INTO table [(column [, column, ...])
subquery;
서브쿼리 사용 시 VALUES 절은 사용하지 않고, INSERT 절의 칼럼 수와 서브 쿼리의 칼럼 수를 일치시켜야 한다.
INSERT INTO employee (id, name, email, hire_date)
SELECT employee id, name, email, TO_DATE('20220201', 'yyyymmdd')
FROM employee
WHERE id = 10;
UPDATE
기존 행을 수정해야할 때 사용한다. INSERT문과는 다르게 필요한 경우 한 번에 여러 행을 수정할 수 있다
UPDATE table
SET column = value [, column = value, ...]
[WHERE condition];
WHERE 절을 지정하여 특정 행을 수정할 수 있다.
UPDATE employee
SET name = '홍길순'
WHERE id = 10;
WHERE 절에 id 칼럼이 10인 경우를 조건으로 명시하였다.
WHERE 절 생략 시 테이블의 모든 행이 수정된다.
다중 컬럼 수정
UPDATE employee
SET (id, name) = (SELECT id, name form employee WHERE id = 11)
WHERE id = 10;
SET 절에 서브 쿼리를 사용하여 여러 개의 칼럼을 수정할 수 있다.
다른 테이블을 기반으로 한 개의 행 수정
UPDATE employee
SET dept_id = (SELECT dept_id FROM employee WHERE id = 21)
WHERE job_id = (SELECT job_id FROM employee WHERE id = 21);
WHERE 절에 서브쿼리를 사용하여 갱신할 행을 추출한 뒤 수정하는 것이다.
UPDATE문 사용 시에는 (다른 쿼리문들도 그렇지만) 무결성 제약조건을 만족하는지 잘 따져보아야 한다.
무결성 제약조건이 위배되는 경우 해당 행이 수정되지 않는다.
DELETE
DELETE 문을 사용하여 테이블에서 기존 행을 제거한다.
DELETE [FROM] table
[WHERE condition];
앞서 보았던 UPDATE문과 마찬가지로 WHERE 절을 지정하여 특정 행(들)을 삭제할 수 있고, WHERE 절 생략 시 테이블의 모든 행이 삭제된다.
DELETE FROM employee
WHERE id = 10;
DELETE FROM employee; /* 모든 행 삭제 */
다른 테이블을 기반으로 한 개의 행 삭제
DELETE FROM employee
WHERE dept_id = (SELECT dept_id FROM department WHERE dept_id = 21);