RDBMS(Relational Database Management System, 관계형 데이터베이스 관리 시스템) 의 데이터를 관리하기 위해 설계된 언어이다.
많은 RDBMS가 SQL 표준을 준수하고 있어 RDBMS마다 약간의 차이가 있을 뿐, 언어의 구조는 비슷하다.
SQL 명령어 안에서도 역할에 따라 크게 5가지로 분류하는데, 아래와 같다.
DDL, DQL, DML, DCL, TCL
이들의 역할과 예시를 하나씩 알아보자. 아래 사이트의 내용을 참고했다.
SQL | DDL, DQL, DML, DCL and TCL Commands - GeeksforGeeks
Unlock the power of SQL commands: DDL, DML, DCL, TCL, DQL with syntax. Explore this comprehensive guide to become proficient in SQL commands.
www.geeksforgeeks.org
데이터의 형태, 즉 스키마와 테이블 정보를 관리하는 명령어이다. ORM으로 마이그레이션 스크립트를 생성하면 볼 수 있던 명령어이다.
CREATE | Database, table, index 등 자주 다루는 개념을 비롯, views, store procedure, triggers 등의 객체를 만드는데 사용되는 명령어이다. 뒤의 4개는 처음 들어봤는데, 추후에 다루도록 하겠다. |
DROP | Database, table 등을 없애는 데 사용한다. |
ALTER | Database, table 구조를 변경할 때 쓰이는 명령어이다. 필자도 database를 변경할때 써본적은 없고, 보통 migration 스크립트로 생성된 table 구조 변경 명령어로 확인했었다. ALTER TABLE {table_name} MODIFY {column_name} {column_type} 이런 식으로 썼었다. |
TRUNCATE | DROP 과 비슷하게 database, table 값을 삭제하지만 가장 큰 차이점은 데이터만 삭제하고, 구조는 남긴다는 것이다. |
COMMENT | 데이터베이스, 테이블 등에 설명을 남겨놓는 명령어이다. ALTER TABLE 등과 같이 사용하는 듯 하다. |
RENAME | 테이블 이름을 변경할 때 사용하며, 다른 데이터베이스로 이동하는 기능도 있다고 한다. (출처) 직접 실험해보니, mysql 8.0.34 기준으로 작동한다! 데이터가 많이 있을 때도 가능한지는 따로 실험해봐야 할 것 같다. |
말 그대로 데이터를 관리하기 위한 명령어 모음이다. DDL로 정해진 테이블의 규격에 따라 CREATE, UPDATE, DELETE 등 실제로 데이터를 쓰는 역할이다.
INSERT | 테이블에 데이터를 삽입하는데 사용한다. |
UPDATE | 테이블 내의 기존 데이터를 업데이트하는 데 사용한다. |
DELETE | 데이터베이스 테이블에서 레코드를 삭제하는 데 사용한다. |
LOCK | 익히 알고있는 공유 락, 베타 락 등 트랜젝션 과정에서 시스템이 걸어버리는 락이 아니라, 내가 직접 락을 걸어버릴 수 있는 것 같다. 따로 알아보자. |
CALL | PL/SQL 또는 JAVA 하위 프로그램을 호출한다고 한다. 신기한데... 쓸 일이 있으려나...? |
EXPLAIN PLAN | 찾아보니 해당 명령어와 DESC 등의 명령어들을 통해서 작성한 쿼리가 어떤 깊이를 가지는지, 어떤 테이블을 조회하는지 등의 정보를 미리 제공해준다고 한다. 이 방법을 이용하면 개발 서버에 부하를 주기 전에 쿼리의 성능을 판별할 수 있을 것 같다. 따로 알아보도록 하자. |
우리가 SQL 명령어로 가장 많이 사용하는 SELECT 가 여기에 속한다. 추가적으로 찾아보니, 하나의 명령어만 있기 때문에 편의상 DML로 분류시키는 것 같다. 하지만 Data를 편집하는 명령어와 단순히 읽어오는 명령어의 역할을 구분하는 것이 개념을 정리하기에 더 좋은 것 같아 분류했다.
SELECT로 시작하는 쿼리문의 자세한 동작 과정, 상세 문법 등은 따로 다루기로 하고, 여기서는 아주 간단한 예시로만 설명하려 한다.
SELECT {table name}.{column name}
FROM {table name}
WHERE {table name}.{column name} > 10
DB를 다룰 수 있는 권한을 부여하거나, 제거하는데 쓰이는 명령어이다.
GRANT | 특정 데이터베이스, 테이블 등에 사용자의 권한을 부여한다. |
REVOKE | GRANT의 정반대. 특정 데이터베이스 ,테이블 등에 걸려있는 사용자의 권한을 없앤다. |
GRANT|REVOKE {previlidges}, ... ON {table name} TO {user name 1}, {user name 2} ...
정보 변경 ACID 원칙까지 있을 정도로 중요한 트랜젝션, 그 트랜젝션을 직접 설정할 수 있는 명령어이다.
COMMIT | 트랜잭션을 커밋한다. |
ROLLBACK | 오류가 발생할 경우 트랜잭션을 롤백한다. |
SAVEPOINT | 트랜잭션 내의 저장 지점을 설정한다. |
DML 의 CREATE, UPDATE, DELETE 등과 같이 사용하는 듯 하다.
ORM 의 query runner 기능의 transaction commit 기능을 이용해서 데이터 변경 API를 작성하고, logging = true 옵션을 넣어 실제 요청하는 쿼리를 살펴보면 COMMIT; ROLLBACK; 등의 명령어가 같이 포함되어있는 것을 확인할 수 있다.
자주 사용하거나 접한 명령어도 있고 (SELECT, ALTER, CREATE, UPDATE), 사이드 프로젝트할 때나 한번씩 썼던 명령어(GRANT, REVOKE)도 있었다. 사용할 수 있는 명령어가 역할에 따라 구분되어있어 개념을 쉽게 정리할 수 있었던 것 같다. LOCK 이나 EXPLAIN PLAN 등의 명령어는 생산성을 높이는 명령어가 될 수 있을 듯 해 추가적으로 알아보려고 한다.
[NestJS] class-validator, class-transformer로 API parameter 제어하기 (2) | 2024.04.19 |
---|---|
[MySQL] SQL Query 문법과 실제 실행 순서 (0) | 2024.02.26 |
비밀번호 없이 SSH 접속? pem 키로 간편화해보자 (1) | 2023.11.13 |
Github 레포를 코드 에디터처럼 조회하기 (0) | 2023.09.07 |
SSH 원격 접속, VSCode Extension: Remote SSH (0) | 2023.08.29 |