DML(Data Manipulation Language) 데이터 조작어
데이터 조작어로는 SELECT, INSERT, UPDATE, DELETE가 있는데 개발을 하면서 가장 많이 접했던 언어가 DML이지 않을까 싶다. 하나씩 기본적인 형식으로 사용해보면서 개념을 익혀보자. 아래 내용을 쭉 읽으면 DML은 테이블의 인스턴스에 대한 CRUD를 담당하는 문법이라고 생각이 들것이다.
✅ SELECT
먼저 SELECT이다. 테이블 안에서의 데이터를 조회하는 문법인데 모두가 한번쯤 사용해보지 않았을까 싶다. 아래와 같은 형식으로 사용한다. SELECT에 사용할 수 있는 WHERE, JOIN, GROUP BY 등이 있지만 해당 글에서의 설명하려는 내용이 아니기 때문에 생략한다.
SELECT [COLUMN] FROM [TALBE];
✅ INSERT
INSERT는 테이블에 인스턴스(row)를 삽입하는 문법이다. 아래예시는 "[TABLE]안에 [value1], [value2]를 [column1], [column2]에 매핑한 인스턴스를 생성해줘" 하는 것이고, INSERT를 not null이 설정되어 있는 속성(column)은 무조건 입력해줘야한다.
INSERT INTO [TABLE] ([column1], [column2]) VALUE ([value1], [value2]);
✅ UPDATE
사실 INSERT까지는 대부분의 사람이 익숙할 것이라고 생각한다. 본인은 UPDATE를 사용했던 기억이 잘 나지 않는다. 아래 예시를 보면 UPDATE 문법은 "[TABLE]안에 [column3]의 값이 100 이상인 인스턴스만 [column1], [column2]의 값을 ''로 바꿔줘" 와 같이 이해하면 된다.
UPDATE [TABLE] SET [column1] = '', [column2] = '' WHERE [column3] >= 100;
✅ DELETE
DELETE는 인스턴스의 삭제를 담당하는 문법이다. "[TABLE]"안에 [column3]의 값이 100이상인 인스턴스를 삭제해줘"와 같이 이해하면되고, 삭제하려는 인스턴스가 외부 데이터와 연결되어 있을때는 조건에 따라 삭제가 잘 안되고, 다른 데이터에 영향을 미칠 수 있으니 삭제에 주의해야한다.
DELETE FROM [TABLE] WHERE [column3] >= 100;
DDL(Data Definition Language) 데이터 정의어
데이터 정의어로는 CREATE, ALTER, DROP, RENAME이 있다. 앞서 살펴본 DML이 테이블 인스턴스의 CRUD를 담당했다면 DDL은 데이터베이스, 테이블의 CRUD를 담당한다는 생각이 든다. DDL또한 문법을 하나씩 살펴보면서 이해해보자.
✅ CREATE
CREATE는 데이터베이스와 테이블을 생성할때 쓰이는 문법이다. 데이터베이스의 생성은 매우 쉽고, 테이블의 생성은 좀 복잡한 편이다. 아래와 같이 작성하면 되는데 테이블 생성을 예시로 들면 "[TABLE]이라는 이름의 테이블을 생성해주는데 그 안에 속성은 아래 처럼 구성해줘"이다. 속성에 대한 설정 및 키값에 대한 내용은 나중에 다루도록 하겠다.
//DATABASE
CREATE DATABASE [DATABASE];
//TABLE
CREATE TABLE [TABLE] (
ID INTEGER NOT NULL AUTO_INCREMENT,
USERNAME VARCHAR(10) NOT NULL,
PRIMARY KEY(ID)
);
✅ ALTER
ALTER는 직접 데이터베이스를 조작하면서 SELECT 가장 많이 접했던 문법이다. UPDATE가 인스턴스의 값을 수정한다면 ALTER는 속성을 수정하는 문법이라고 생각하면 쉽다. Column을 추가하거나, 수정하거나, 삭제하는 문법이다. ALTER를 이용해 데이터베이스의 이름 또한 바꿀 수 있는데, 굳이 ALTER를 사용하지 않고 뒤에 RENAME을 사용하면 된다.
//생성
ALTER TABLE [TABLE] ADD AGE varchar(3) NOT NULL;
//수정
ALTER TABLE [TALBE] ALTER COLUMN USERNAME varchar(20) NOT NULL;
//삭제
ALTER TABLE [TABLE] DROP COLUMN AGE;
✅ DROP
DROP은 데이터베이스, 테이블을 삭제하는 문법이다. DROP은 너무 단순해서 설명할게 없다. 예시를 참고하면 바로 이해가 될 것이다.
//DATABASE
DROP DATABASE [DATABASE];
//TABLE
DROP TABLE [TABLE];
✅ RENAME
RENAME은 테이블의 이름을 변경하는 문법이다. RENAME도 DROP과 같이 매우 단순해서 바로 이해할 수 있을 것이다.
RENAME [OLD_TABLE_NAME] TO [NEW_TABLE_NAME];
DCL(Data Control Language) 데이터 제어어
DML, DDL은 그래도 꽤 들어봤지만 솔직히 데이터제어어부터는 학부생시절 데이터베이스 시간에 잠깐 스친것 이외에 진짜 처음 들어본다. DCL로는 GRANT, REVOKE가 있는데 테이블의 접근, 사용권한을 부여, 회수하는 문법이다.
✅ GRANT
GRANT는 아래와 같이 사용자에게 테이블에 대한 권한을 부여하는 문법이다. 아래 예시는 "[USER] 사용자에게 [TABLE] 테이블에SELECT하고 DELETE할 수 있는 권한을 부여해줘." 이다.
GRANT SELECT, DELETE ON [TABLE] TO [USER];
✅ REVOKE
REVOKE는 GRANT와 정 반대의 개념이다. GRANT에서 TO를 사용했다면 REVOKE에서는 FROM을 사용하면 된다. 아래 예시는 "[USER]사용자에게 있는 [TABLE] 테이블의 SELECT, DELETE 권한을 회수해줘." 이다.
REVOKE SELECT, DELETE ON [TABLE] FROM [USER];
TCL(Transaction Control Language) 트랜젝션 제어어
트랜젝션 제어어는 DCL에서 트랜잭션을 제어하는 명령인 COMMIT과 ROLLBACK을 분리해서 묶은 문법이다. TCL까지 보면 SQL은 데이터, 테이블을 직접 접근하는 DML, DDL과 데이터, 테이블에 접근한다기 보다는 그 외의 권한이나 흐름을 제어하는 DCL, TCL으로 나눌 수 있을 것 같다.
TCL에 대해 이해하려면 "ALL OR NOTHING"으로 설명되는 트랜잭션에 대해 이해해야하는데, DB는 트랜잭션이라는 하나의 사이클에서 수행된 SQL들이 모두 성공적으로 작동한다면 모든 COMMIT하여 DB에 반영하고, 하나라도 실패한다면 모든 내용을 ROLLBACK하여 DB를 트랜잭션 이전의 상태로 되돌린다. 본인은 트랜잭션을 이렇게 이해하고 있다.
✅ COMMIT
COMMIT은 위해서 설명한 바와 같이 지금까지 작성한 모든 SQL을 DB에 반영하는 문법이다.
COMMIT;
✅ ROLLBACK
ROLLBACK또한, 위에서 설명한 바와 같이 마지막 COMMIT 이후의 지금까지 작성한 SQL을 초기화하고 마지막 COMMIT으로 DB의 상태로 되돌리는 문법이다.
ROLLBACK;
[ 참고자료 ]