
본 시리즈에서는 데이터베이스의 개념을 정리하고 필요시 실습을 진행합니다.
Ubuntu-24.04)10.11.8-MariaDB)2024.2.2)correto-21)Ultimate Edition)world database
SQL(Structured Query Language)는 관계형 데이터베이스(RDBMS)에서 데이터를 정의하고 조작하기 위한 언어입니다.
JOIN 연산을 통해 여러 테이블을 조합하여 원하는 데이터를 추출할 수 있습니다.SQL 명령어는 용도에 따라 크게 다음과 같은 네 가지로 분류됩니다.
CREATE, ALTER, DROP과 같은 명령어가 포함됩니다.SELECT, INSERT, UPDATE, DELETE 명령어가 포함됩니다.GRANT, REVOKE 명령어가 포함됩니다.COMMIT, ROLLBACK, SAVEPOINT 명령어가 포함됩니다.SQL은 이러한 다양한 기능을 통해 데이터베이스의 구조를 정의하고 데이터를 조작하며, 데이터 무결성과 보안을 유지할 수 있는 강력한 도구입니다.
DDL(Data Definition Language)은 데이터베이스와 그 안의 객체(테이블, 인덱스 등)의 구조를 정의하고 관리하는 명령어들로 구성된 언어입니다.
CREATE 명령어는 새로운 데이터베이스, 테이블, 인덱스 등을 생성할 때 사용됩니다.
CREATE 명령어를 사용할 수 있습니다.-- 데이터베이스 생성
CREATE DATABASE my_database;
-- 테이블 생성
CREATE TABLE users (
user_id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 사용자 계정 생성 (서버)
CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password';
ALTER 명령어는 기존의 테이블이나 데이터베이스 객체를 수정할 때 사용됩니다.
-- 테이블에 열 추가
ALTER TABLE users ADD COLUMN age INT;
-- 열의 데이터 타입 변경
ALTER TABLE users MODIFY COLUMN name VARCHAR(100);
-- 열 삭제
ALTER TABLE users DROP COLUMN age;
-- 열 이름 변경
ALTER TABLE users2 RENAME TO users1;
DROP 명령어는 데이터베이스, 테이블, 인덱스 등의 객체를 삭제할 때 사용됩니다.
-- 데이터베이스 삭제
DROP DATABASE my_database;
-- 테이블 삭제
DROP TABLE users;
-- 사용자 계정 삭제
DROP USER 'new_user'@'localhost';
TRUNCATE 명령어는 테이블의 모든 데이터를 일괄 삭제할 때 사용됩니다.
DELETE 명령어와 달리 로그를 기록하지 않아 빠르게 대량의 데이터를 삭제할 수 있습니다.-- 테이블의 모든 데이터 삭제 (테이블 구조는 유지)
TRUNCATE TABLE users;
RENAME 명령어는 테이블의 이름을 변경할 때 사용됩니다.
-- 테이블 이름 변경
RENAME TABLE old_table_name TO new_table_name;
-- 여러 테이블 이름 변경
RENAME TABLE old_table_name1 TO new_table_name1,
old_table_name2 TO new_table_name2;
| 명령어 | 설명 |
|---|---|
| CREATE | 새로운 데이터베이스나 테이블, 인덱스, 사용자 계정을 생성 |
| ALTER | 기존의 테이블이나 데이터베이스 객체를 수정 |
| DROP | 데이터베이스, 테이블, 인덱스, 사용자 계정을 삭제 |
| TRUNCATE | 테이블의 모든 데이터를 일괄 삭제 |
| RENAME | 테이블의 이름을 변경 |
DDL 명령어는 데이터베이스 구조와 객체를 정의하고 수정할 때 중요한 역할을 하며, 데이터베이스 설계의 기본이 되는 명령어들로 구성되어 있습니다.
제약조건(Constraints)은 데이터베이스에서 테이블에 저장되는 데이터의 무결성과 일관성을 유지하기 위해 적용하는 규칙입니다.
PRIMARY KEY는 테이블 내에서 각 행을 고유하게 식별할 수 있는 열(Column)이나 열의 조합입니다.
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
AUTO_INCREMENT는 숫자 데이터 타입의 열에 적용하여 자동으로 고유한 값을 생성하는 데 사용됩니다.
PRIMARY KEY와 함께 사용하여 각 행의 고유 ID를 자동으로 증가시키며, 값이 자동으로 지정되므로 수동으로 입력할 필요가 없습니다.AUTO_INCREMENT는 정수 데이터 타입 열에서만 사용할 수 있습니다.CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
price DECIMAL(10, 2)
);
NOT NULL 제약조건은 열에 NULL 값이 저장되는 것을 허용하지 않도록 설정합니다.
CREATE TABLE orders (
order_id INT PRIMARY KEY,
order_date DATE NOT NULL,
customer_id INT NOT NULL
);
UNIQUE 제약조건은 특정 열이 고유한 값만 가질 수 있도록 설정합니다.
PRIMARY KEY와 달리 테이블에 여러 개의 UNIQUE 제약조건을 설정할 수 있습니다.CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100) UNIQUE
);
FOREIGN KEY는 다른 테이블의 PRIMARY KEY나 UNIQUE 열을 참조하여 테이블 간의 관계를 정의합니다.
FOREIGN KEY 제약조건을 사용하여 데이터베이스 내에서 데이터 무결성을 유지하고, 참조 무결성 제약을 통해 삭제와 업데이트의 제약을 설정할 수 있습니다.CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CHECK 제약조건은 열에 입력되는 데이터가 특정 조건을 만족해야만 저장되도록 설정합니다.
CHECK 제약조건을 사용하여 값의 범위나 조건을 설정하여 유효성을 검사할 수 있습니다.MySQL은 CHECK 제약조건을 제한적으로 지원하므로 MariaDB와 호환되는 환경에서 사용할 때 주의가 필요합니다.CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
CHECK (age >= 18)
);
| 제약조건 | 설명 |
|---|---|
| PRIMARY KEY | 각 행을 고유하게 식별하는 열, NULL과 중복 값 허용 안 됨 |
| AUTO_INCREMENT | 숫자 타입 열에서 자동으로 고유 값을 생성, 주로 PRIMARY KEY와 함께 사용 |
| NOT NULL | 열에 NULL 값을 허용하지 않음, 필수 입력 필드 설정 |
| UNIQUE | 열에 고유한 값만 허용, 중복 값 허용 안 됨 |
| FOREIGN KEY | 다른 테이블의 PRIMARY KEY를 참조하여 테이블 간 관계 설정 |
| CHECK | 열에 입력되는 데이터가 특정 조건을 만족해야 함 |
제약조건(Constraints)은 데이터베이스의 데이터 무결성과 정확성을 유지하는 중요한 요소입니다. 이러한 제약조건을 적절히 설정함으로써 데이터베이스의 일관성을 보장하고, 데이터의 유효성을 검증할 수 있습니다.
DCL(Data Control Language)과 TCL(Transaction Control Language)은 데이터베이스의 접근 권한과 트랜잭션을 제어하는 데 사용되는 SQL 명령어들입니다.
DCL은 데이터베이스 사용자에 대한 권한을 제어하는 언어로, 특정 사용자에게 데이터베이스 접근 권한을 부여하거나 회수할 수 있습니다.
특정 사용자에게 데이터베이스, 테이블, 열 등에 대한 접근 권한을 부여합니다.
SELECT, INSERT, UPDATE, DELETE와 같은 기본적인 데이터 조작 권한뿐만 아니라 CREATE, DROP과 같은 데이터 정의 권한도 포함됩니다.-- 사용자에게 테이블에 대한 SELECT 권한 부여
GRANT SELECT ON my_database.my_table TO 'user_name'@'localhost';
-- 사용자에게 모든 권한 부여
GRANT ALL PRIVILEGES ON my_database.* TO 'user_name'@'localhost';
특정 사용자에게 부여된 권한을 회수합니다.
-- 사용자에게서 SELECT 권한 회수
REVOKE SELECT ON my_database.my_table FROM 'user_name'@'localhost';
-- 사용자에게서 모든 권한 회수
REVOKE ALL PRIVILEGES ON my_database.* FROM 'user_name'@'localhost';
참고: 권한 부여와 회수는 데이터베이스 보안을 강화하는 중요한 방법으로, 특히 다수의 사용자가 접근하는 환경에서 필수적입니다.
TCL은 데이터베이스에서 트랜잭션(Transaction)을 제어하는 언어로, 데이터의 일관성을 유지하고 여러 작업을 하나의 논리적 단위로 묶어 관리할 수 있게 합니다.
BEGIN;
INSERT INTO accounts (user_id, balance) VALUES (1, 1000);
COMMIT;
COMMIT되지 않은 상태에서 ROLLBACK을 수행하면, 모든 작업이 취소됩니다.BEGIN;
UPDATE accounts SET balance = balance - 500 WHERE user_id = 1;
-- 오류가 발생했을 경우
ROLLBACK;
ROLLBACK할 수 있게 합니다.SAVEPOINT를 사용하여 트랜잭션 내에서 여러 지점을 저장하고, 필요에 따라 특정 SAVEPOINT로 돌아가 수정할 수 있습니다.BEGIN;
INSERT INTO orders (order_id, amount) VALUES (1, 100);
SAVEPOINT savepoint1;
INSERT INTO orders (order_id, amount) VALUES (2, 200);
-- 특정 지점으로 되돌아감
ROLLBACK TO savepoint1;
COMMIT;
참고: 트랜잭션 관리는 데이터베이스의 일관성과 무결성을 보장하는 중요한 기능입니다. 특히 여러 명령어를 하나의 논리적 작업으로 묶어서 처리할 때 유용합니다.
| 명령어 | 설명 |
|---|---|
| GRANT | 사용자에게 데이터베이스 접근 권한을 부여 |
| REVOKE | 사용자에게 부여된 접근 권한을 회수 |
| COMMIT | 트랜잭션을 성공적으로 완료하고 변경 사항을 영구적으로 저장 |
| ROLLBACK | 트랜잭션 중 오류가 발생하거나 취소할 때, 모든 변경 사항을 원래 상태로 되돌림 |
| SAVEPOINT | 트랜잭션 내에서 특정 지점을 저장하여 부분적으로 ROLLBACK 가능 |
DCL은 데이터베이스의 보안과 접근 제어를 담당하며, TCL은 데이터베이스의 일관성과 무결성을 유지하기 위한 트랜잭션 제어를 담당합니다. 이 두 언어는 데이터베이스의 안정성과 보안을 보장하는 데 필수적입니다.
이번 포스팅에서는 SQL의 개요와 주요 명령어 분류, DDL(Data Definition Language), 제약조건(Constraints), DCL(Data Control Language) 및 TCL(Transaction Control Language)에 대해 다루어 보았습니다.
| 명령어 | 설명 |
|---|---|
| CREATE | 새로운 데이터베이스나 테이블, 인덱스, 사용자 계정을 생성 |
| ALTER | 기존의 테이블이나 데이터베이스 객체를 수정 |
| DROP | 데이터베이스, 테이블, 인덱스, 사용자 계정을 삭제 |
| TRUNCATE | 테이블의 모든 데이터를 일괄 삭제 |
| RENAME | 테이블의 이름을 변경 |
| 제약조건 | 설명 |
|---|---|
| PRIMARY KEY | 각 행을 고유하게 식별하는 열, NULL과 중복 값 허용 안 됨 |
| AUTO_INCREMENT | 숫자 타입 열에서 자동으로 고유 값을 생성, 주로 PRIMARY KEY와 함께 사용 |
| NOT NULL | 열에 NULL 값을 허용하지 않음, 필수 입력 필드 설정 |
| UNIQUE | 열에 고유한 값만 허용, 중복 값 허용 안 됨 |
| FOREIGN KEY | 다른 테이블의 PRIMARY KEY를 참조하여 테이블 간 관계 설정 |
| CHECK | 열에 입력되는 데이터가 특정 조건을 만족해야 함 |
| 명령어 | 설명 |
|---|---|
| GRANT | 사용자에게 데이터베이스 접근 권한을 부여 |
| REVOKE | 사용자에게 부여된 접근 권한을 회수 |
| COMMIT | 트랜잭션을 성공적으로 완료하고 변경 사항을 영구적으로 저장 |
| ROLLBACK | 트랜잭션 중 오류가 발생하거나 취소할 때, 모든 변경 사항을 원래 상태로 되돌림 |
| SAVEPOINT | 트랜잭션 내에서 특정 지점을 저장하여 부분적으로 ROLLBACK 가능 |
다음 포스팅에서는 이러한 RDBMS에서 데이터를 조회, 삽입, 수정, 삭제하는 DML(Data Manipulation Language) 명령어를 다룰 예정입니다.