[SQLD 시험 대비] 2과목. SQL 기본 및 활용 : 1장. SQL 기본 - 3. DML(DATA MANIPULATION LANGUAGE)
DML(Data Manipulation Language)
- 만들어진 테이블에 관리하기를 원하는 자료들을 입력, 수정, 삭제, 조회
INSERT
- 테이블에 데이터를 입력
- 해당 칼럼명과 입력되어야 하는 값을 서로 1:1로 매핑해서 입력하면 된다.
- 해당 칼럼의 데이터 유형이 CHAR나 VARCHAR2 등 문자 유형일 경우
'
(SINGLE QUOTATION)로 입력할 값을 입력한다.
- 숫자일 경우
'
(SINGLE QUOTATION)을 붙이지 않는다.
- 첫 번째 방법
- 테이블의 칼럼을 정의할 수 있는데, 이때 칼럼의 순서는 테이블의 칼럼 순서와 매치할 필요는 없다.
- 정의하지 않은 칼럼은 Default로 NULL 값이 입력된다.
- 단, Primary Key나 Not NULL 로 지정된 칼럼은 NULL이 허용되지 않는다.
INSERT INTO 테이블명 (COLUMN_LIST)
VALUES (COLUMN_LIST에 넣을 VALUE_LIST);
- 두 번째 방법
- 모든 칼럼에 데이터를 입력하는 경우로 굳이 COLUMN_LIST를 언급하지 않아도 되지만, 칼럼의 순서대로 빠짐없이 데이터가 입력되어야 한다.
INSERT INTO 테이블명
VALUES (전체 COLUMN에 넣을 VALUE_LIST);
예제
- 선수 테이블에 박지성 선수의 데이터를 일부 칼럼만 입력해보자.
- INSERT 문장에서 BACK_NO가 마지막에 정의가 되었더라도 테 이블에는 칼럼 순서대로 데이터가 입력된다.
- 칼럼명이 정의되지 않은 경우 NULL 값이 입력된다.
INSERT INTO PLAYER
(PLAYER_ID, PLAYER_NAME, TEAM_ID, POSITION, HEIGHT, WEIGHT, BACK_NO)
VALUES ('2002007', '박지성', 'K07', 'MF', 178, 73, 7);

- 이번에는 해당 테이블에 이청용 선수의 데이터를 입력해보자.
- 데이터를 입력하는 경우 정의되지 않은 미지의 값인 E_PLAYER_NAME은 두 개의 『 '' 』SINGLE QUOTATION을 붙여서 표현하거나, NATION이나 BIRTH_DATE의 경우처럼 NULL이라고 명시적으로 표현할 수 있다.
INSERT INTO PLAYER
VALUES ('2002010','이청용','K07','','BlueDragon','2002','MF','17',NULL,NULL,'1',180,69);

UPDATE
UPDATE 테이블명
SET 수정되어야 할 칼럼명 = 수정되기를 원하는 새로운 값;
예제
- 선수 테이블의 백넘버를 일괄적으로 99로 수정해보자.
UPDATE PLAYER
SET BACK_NO = 99;
- 선수 테이블의 포지션을 일괄적으로 ‘MF’로 수정해보자.
UPDATE PLAYER
SET POSITION = 'MF';
DELETE
- 데이터 삭제
- FROM 문구는 생략이 가능한 키워드이며, 뒤에서 배울 WHERE절을 사용하지 않는다면 테이블의 전체 데이터가 삭제됨
DELETE [FROM] 삭제를 원하는 정보가 들어있는 테이블명;
예제
DELETE FROM PLAYER;
[참고] 데이터베이스에서 DDL 명령어와 DML 명령어를 처리하는 방식
- DDL(CREATE, ALTER, RENAME, DROP) 명령어인 경우에는 직접 데이터베이스의 테이블에 영향을 미치기 때문에 DDL 명령어를 입력하는 순간 명령어에 해당하는 작업이 즉시(AUTO COMMIT) 완료됨
- DML(INSERT, UPDATE, DELETE, SELECT) 명령어의 경우, 조작하려는 테이블을 메모리 버퍼에 올려놓고 작업을 하기 때문에 실시간으로 테이블에 영향을 미치는 것은 아님
- 따라서 버퍼에서 처리한 DML 명령어 가 실제 테이블에 반영되기 위해서는 COMMIT 명령어를 입력하여 TRANSACTION을 종료해야 함.
- SQL Server의 경우는 DML의 경우도 AUTO COMMIT으로 처리되기 때문에 실제 테이블에 반영하기 위해 COMMIT 명령어를 입력할 필요가 없음.
- 테이블의 전체 데이터를 삭제하는 경우, 시스템 활용 측면에서는 삭제된 데이터를 로그로 저장하는 DELETE TABLE 보다는 시스템 부하가 적은 TRUNCATE TABLE을 권고
- 단, TRUNCATE TABLE의 경우 삭제된 데이터의 로그가 없으므로 ROLLBACK이 불가능하므로 주의해야 함.
- SQL Server의 경우 사용자가 임의적으로 트랜잭션을 시 작한 후 TRUNCATE TABLE을 이용하여 데이터를 삭제한 이후 오류가 발견되어, 다시 복구를 원할 경우 ROLLBACK 문을 이용하여 테이블 데이터를 원 상태로 되돌릴 수 있음.
- 트랜잭션과 COMMIT, ROLLBACK에 대해서는 다음 절에서 알아보겠다.
SELECT
SELECT [ALL/DISTINCT] 보고 싶은 칼럼명, 보고 싶은 칼럼명, ...
FROM 해당 칼럼들이 있는 테이블명;
DISTINCT 옵션
- 중복된 데이터가 있는 경우 1건으로 처리해서 출력한다.
- 지정하지 않을 경우
ALL
이 Default 옵션
WILDCARD 사용하기
- 해당 테이블의 모든 칼럼 정보를 보고 싶을 경우에는 와일드카드로
애스터리스크(*)
를 사용하여 조회할 수 있다.
SELECT *
FROM 테이블명;
ALIAS 부여하기
- 조회된 결과에 일종의 별명(ALIAS, ALIASES)을 부여해서 칼럼 레이블을 변경할 수 있다.
- 칼럼 별명(ALIAS)에 대한 사항을 정리하면 다음과 같다.
- 칼럼명 바로 뒤에 온다.
- 칼럼명과 ALIAS 사이에
AS
, as
키워드를 사용할 수도 있다. (option)
- 이중 인용부호(Double quotation)는 ALIAS가 공백, 특수문자를 포함할 경우와 대소문자 구분이 필요할 경우 사용된다.
예제
- 입력한 선수들의 정보를 칼럼 별명을 이용하여 출력해보자.
SELECT PLAYER_NAME AS 선수명, POSITION AS 위치, HEIGHT AS 키, WEIGHT AS 몸무게
FROM PLAYER;
SELECT PLAYER_NAME 선수명, POSITION 위치, HEIGHT 키, WEIGHT 몸무게
FROM PLAYER;
- 칼럼 별명을 적용할 때 별명 중간에 공백이 들어가는 경우
" "
를 사용해야 한다. SQL Server의 경우" "
, ' '
, [ ]
와 같이 3가지의 방식으로 별명을 부여할 수 있다.
SELECT PLAYER_NAME "선수 이름", POSITION "그라운드 포지션", HEIGHT "키", WEIGHT "몸무게"
FROM PLAYER;
산술 연산자와 합성 연산자
산술 연산자
- 산술 연산자는 NUMBER와 DATE 자료형에 대해 적용되며 일반적으로 수학에서의 사칙연산과 동일하며 우선순위를 위한 괄호 적용이 가능하다.
- 일반적으로 산술 연산을 사용하거나 특정 함수를 적용하게 되면 칼럼의 LABEL이 길어지게 되고, 기존의 칼럼에 대해 새로운 의미를 부여한 것이므로 적절한 ALIAS를 새롭게 부여하는 것이 좋다.
- 산술연산자 종류
예제
SELECT PLAYER_NAME 이름, HEIGHT - WEIGHT "키-몸무게"
FROM PLAYER;
- 선수들의 키와 몸무게를 이용해서 BMI(Body Mass Index) 비만지수를 측정해보자.
SELECT PLAYER_NAME 이름, ROUND(WEIGHT/((HEIGHT/100)*(HEIGHT/100)),2) "BMI 비만지수"
FROM PLAYER;
합성(CONCATENATION) 연산자
- 문자와 문자를 연결하는 합성(CONCATENATION) 연산자를 사용하면 별도의 프로그램 도움 없이도 SQL 문장만으로도 유용한 리포트를 출력할 수 있다.
- 합성(CONCATENATION) 연산자의 특징은 다음과 같다.
- 문자와 문자를 연결하는 경우 2개의 수직 바(
||
)에 의해 이루어진다. (Oracle)
- 문자와 문자를 연결하는 경우
+
표시에 의해 이루어진다. (SQL Server)
- 두 벤더 모두 공통적으로 CONCAT (string1, string2) 함수를 사용할 수 있다.
- 칼럼과 문자 또는 다른 칼럼과 연결시킨다.
- 문자 표현식의 결과에 의해 새로운 칼럼을 생성한다.
예제
- 다음과 같은 선수들의 출력 형태를 만들어 보자.
출력 형태) 선수명 선수, 키 cm, 몸무게 kg
예) 박지성 선수, 176 cm, 70 kg
SELECT PLAYER_NAME || '선수,' || HEIGHT || 'cm,' || WEIGHT || 'kg' 체격정보
FROM PLAYER;
SELECT PLAYER_NAME +'선수, '+ HEIGHT +'cm, '+ WEIGHT +'kg'체격정보
FROM PLAYER;