데이터 정의 언어 (DDL)
종류 | 설명 |
CREATE | 데이터베이스 혹은 데이터베이스 객체 생성 |
ALTER | 데이터베이스 객체 갱신 예) 테이블 필드 및 제약 조건을 추가/삭제 |
DROP | 데이터베이스 객체 삭제 예) 데이블이나 데이터베이스를 삭제 |
TRUNCATE | 테이블 구조를 유지한 채 모든 레코드 삭제 |
CREATE
데이터베이스를 생성하는 명령
CREATE DATABASE 데이터베이스_이름;
CREATE DATABASE mydb;
SQL문에서는 끝을 표기하기 위해 세미콜론 기호를 사용한다.
데이터베이스 조회 및 사용
SHOW DATABASES
이렇게 되면 성공이다. 입니다
create table 문을 이용한 테이블 생성은 아래와 같이 작성한다
CREATE TABLE 테이블이름 (
컬럼이름1 데이터타입 제약조건,
컬럼이름2 데이터타입 제약조건,
...
PRIMARY KEY (기본키컬럼)
);
유의할 점은 데이터 타입 우측 혹은 create table 하단에 아래와 같은 키워드를 명시함으로써 특정 필드가 지켜야할 제약 조건을 명시할 수 있다는 점이다.
키워드 | 제약 조건 |
PRIMARY KEY | 특정 필드를 기본키로 지정 |
UNIQUE | 특정 필드가 고유한 값을 갖도록 설정 |
FOREIGN KEY | 특정 필드를 외래 키로 지정 |
DEFAULT 기본값 | 기본값 지정 |
NULL/ NOT NULL | 특정 필드에 NULL 값을 허용/허용하지않음 |
예제
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY, -- 기본키, 자동 증가
username VARCHAR(50) NOT NULL, -- 유저 이름 (50자 제한, 필수)
email VARCHAR(100) UNIQUE, -- 이메일 (100자 제한, 중복 불가)
password VARCHAR(255) NOT NULL, -- 비밀번호 (암호화 저장해야 함)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 가입 날짜 (자동 입력)
);
- id -> 고유한 회원 번호(자동 증가)
- username -> 회원이름 (50자 제한, 필수)
- email -> 회원 이메일( 100자 제한, 중복 불가)
- password -> 비밀번호 (255자, 암호화 저장, 필수)
- created_at -> 가입 날짜 (자동입력)
CREATE TABLE posts (
post_id INT AUTO_INCREMENT PRIMARY KEY, -- 게시글 ID (기본키, 자동 증가)
user_id INT, -- 작성자 ID (users 테이블 참조)
title VARCHAR(255) NOT NULL, -- 게시글 제목
content TEXT NOT NULL, -- 게시글 내용
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 작성 시간 자동 입력
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE -- 외래키 설정 (회원 삭제 시 게시글도 삭제)
);
ON DELETE CASCADE -> 만약 해당 유저가 탈퇴하면 그 사람이 쓴 게시글도 자동으로 삭제한다.
그림과 글에 작성한 테이블 내용이 좀 다를 수 있지만 대충 저렇게 참조한다는 뜻
PRIMARY KEY, UNIQUE, FOREIGN KEY 제약 조건은 CREATE TABLE문 하단에 추가될 수도 있고, 선택적으로 제약 조건에 이름을 붙일 수도 있다.
예제
CREATE TABLE users (
id INT AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT pk_users PRIMARY KEY (id), -- 기본 키 (PK)
CONSTRAINT uq_users_username UNIQUE (username), -- 고유 키 (UNIQUE)
CONSTRAINT uq_users_email UNIQUE (email) -- 고유 키 (UNIQUE)
);
ALTER
CREATE TABLE문을 통해 생성된 테이블에 새로운 필드를 추가하거나 기존의 필드를 수정/삭제 할 수 있고 제약 조건 또한 새롭게 추가하거나 수정/삭제할 수 있다.
새로운 필드 추가
-- ALTER TABLE 테이블_이름 ADD COLUMN 필드_이름 필드_타입 [제약 조건];
ALTER TABLE users ADD COLUMN phone_number VARCHAR(20) NOT NULL;
기존 필드 수정
-- ALTER TABLE 테이블_이름 MODIFY 필드_이름 필드_타입 [제약 조건];
ALTER TABLE users MODIFY COLUMN username VARCHAR(100) NOT NULL;
-- ALTER TABLE 테이블_이름 CHANGE COLUMN 기존_필드 새_필드 필드_타입 [제약 조건];
ALTER TABLE users CHANGE COLUMN username user_name VARCHAR(100) NOT NULL;
기존 필드 삭제
-- ALTER TABLE 테이블_이름 DROP COLUMN 필드_이름;
ALTER TABLE users DROP COLUMN phone_number;
외래 키 제약 조건 추가
-- ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약_조건_이름 FOREIGN KEY (필드_이름) REFERENCES 참조_테이블(참조_필드);
ALTER TABLE posts ADD CONSTRAINT fk_posts_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE;
UNIQUE 제약 조건 추가
-- ALTER TABLE 테이블_이름 ADD CONSTRAINT 제약_조건_이름 UNIQUE (필드_이름);
ALTER TABLE users ADD CONSTRAINT uq_users_email UNIQUE (email);
NOT NULL 제약 조건 추가
-- ALTER TABLE 테이블_이름 MODIFY 필드_이름 필드_타입 NOT NULL;
ALTER TABLE users MODIFY email VARCHAR(100) NOT NULL;
기본 키 추가 (PRIMARY KEY)
-- ALTER TABLE 테이블_이름 ADD PRIMARY KEY (필드_이름);
ALTER TABLE posts ADD PRIMARY KEY (post_id);
제약 조건 제거
-- 기본 키 삭제
ALTER TABLE users DROP PRIMARY KEY;
-- 외래 키 삭제
ALTER TABLE posts DROP FOREIGN KEY fk_posts_user;
-- UNIQUE 삭제
ALTER TABLE users DROP INDEX uq_users_email;
DROP
테이블이나 데이터베이스를 삭제할 수 있는 명령어
DROP DATABASE 데이터베이스_이름;
DROP TABLE 테이블_이름;
지워졌다!
TRUNCATE
테이블의 구조를 유지한 채로 테이블의 모든 레코드를 삭제하는 명령어
TRUNCATE TABLE 테이블_이름;
테이블 조작 언어 (DML)
종류 | 설명 |
SELETE | 테이블의 레코드 조회 |
INSERT | 테이블에 레코드 삽입 |
UPDATE | 테이블의 레코드 수정 |
DELETE | 테이블의 레코드 삭제 |
INSERT
테이블에 레코드를 삽입하는 명령어
테이블_이름 이라는 테이블에 필드에 맞는 값들을 삽입하느 ㄴ명령어다.
INSERT INTO 테이블_이름(필드1, 필드2) VALUES (값1, 값2)
여러 레코드를 한번에 삽입하고 싶을떄
INSERT INTO 테이블_이름(필드1,필드2,필드3) VALUES (
(값1,값2,값3),
(값1,값2,값3),
(값1,값2,값3);
);
예제
-- INSERT INTO 테이블_이름 (필드1, 필드2, ...) VALUES (값1, 값2, ...);
INSERT INTO users (username, email, password)
VALUES ('john_doe', 'john@example.com', 'hashed_password123');
INSERT INTO users (username, email, password)
VALUES
('alice', 'alice@example.com', 'password1'),
('bob', 'bob@example.com', 'password2'),
('charlie', 'charlie@example.com', 'password3');
- SELETE * FROM users: users 테이블(FROM users)의 모든 레코드(*)조회하겠다. 라는 뜻
레코드 삽입시 유의할 점: 무결성 제약 조건을 지켜야한다.
존재하지 않는 레코드를 참조하는 경우에는 무결성 제약 조건에 위배되어 INSERT문의 실행이 거부된다.
예제
존재하지 않는 외래 키 값 삽입 시 오류 발생
INSERT INTO posts (user_id, title, content, created_at)
VALUES (99, '존재하지 않는 유저의 게시글', '이 내용은 저장되지 않습니다.', NOW());
오류발생
Cannot add or update a child row: a foreign key constraint fails
(user_id = 99는 users 테이블에 존재하지 않기 때문)
UPDATE와 DELETE
각각 레코드를 수정하고 삭제하는 명령어
UPDATE 데이블_이름
SET 필드1 = 값1, 필드2 = 값2 ...
WHERE = 조건식
- 테이름_이름은 갱신하고자하는 테이블의 이름을 나타내고
- 필드1 = 값1, 필드2 = 값2는 각 필드에 대한 대입 연산이다.
where 조건식은 생략이 가능하지만 일반덕으로 대부분의 update 문에서 사용된다
특정 조건에 부합하는 레코드만 선별하기 위한 일종의 필터임
set에 명시되는 '=' 대입 연산자이지만 where절에 명시되는 '='는 비교연산자임
예제
-- 특정 사용자의 이메일 주소 변경
UPDATE users
SET email = 'new_email@example.com'
WHERE id = 1;
아이디가 1인 사용자의 email을 new_eamil 어쩌고로 변경
여러 필드 동시에 업데이트
-- 특정 사용자의 이름과 비밀번호 변경
UPDATE users
SET username = 'new_username', password = 'new_hashed_password'
WHERE id = 2;
아이디 2인 사용자의 username과 password를 동시에 변경
DELETE문도 UPDATE문과 비슷함.
WHERE절을 통해 삭제하고자 하는 레코드를 식별할 수 있음
WHERE절을 명시하지 않을 경우 테이블의 모든데이터를 삭제하는 명령어가 됨
DELETE FROM posts
WHERE title = 'hi';
SELECT
삽입된 레코드를 조회하는 명령어
테이블 내 레코드를 다양하게 정렬하거나 필터링하여 조회도 가능
SELECT 필드1, 필드2, ...
FROM 테이블_이름
WHERE 조건식
GROUP BY 그룹화할_필드
HAVING 필터_조건
ORDER BY 정렬할_필드
LIMIT 레코드_제한;
SELECT 뒤에는 하나 이상의 필드 이름이 명시 될 슁ㅆ음 FROM 절에는 조회하고자 하는 테이블 이름을 명시
-- students 테이블 생성
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
age INT,
major VARCHAR(50),
gpa DECIMAL(3, 2),
enrollment_date DATE
);
-- 데이터 삽입
INSERT INTO students (first_name, last_name, age, major, gpa, enrollment_date) VALUES
('Alice', 'Johnson', 20, 'Computer Science', 3.8, '2022-09-01'),
('Bob', 'Smith', 22, 'Mathematics', 3.5, '2020-09-01'),
('Charlie', 'Brown', 21, 'Physics', 3.9, '2021-09-01'),
('David', 'Williams', 23, 'Chemistry', 3.2, '2019-09-01'),
('Eve', 'Davis', 19, 'Biology', 3.6, '2023-09-01');
조건 추가
SELECT * FROM students WHERE age >= 21;
GROUP BY
특정 필드를 기준으로 필드를 그룹화
연산/집계 함수와 함께 사용되는 경우가 많음
SELECT major, COUNT(*)
FROM students
GROUP BY major;
전공별 학생 수 조회
HAVING
그룹화된 결과에 조건을 적용하기 위해 사용
WHERE절에 명시되는 조건식이 그룹화 되기 전 개별 레코드에 대한 조건식이라면
HAVING절에 명시되는 조건식은 그룹화된 레코드에 대한 조건식이라는 점.
-- HAVING 절을 사용하여 평균 GPA가 3.6 이상인 전공 조회
SELECT major, AVG(gpa)
FROM students
GROUP BY major
HAVING AVG(gpa) >= 3.6;
ORDER BY
특정 필드를 기준으로 데이터를 정렬하는 데 사용
-- 내림차순
SELECT first_name, last_name, gpa
FROM students
ORDER BY gpa DESC;
-- 오름차순
SELECT first_name, last_name, gpa
FROM students
ORDER BY gpa ASC;
LIMIT
조회할 레코드 수를 제한하기 위해 사용
SELECT * FROM students ORDER BY enrollment_date DESC LIMIT 3;
가장 최근 입학한 3명의 학생 조회
SELECT문이 작성 순서와 실제 실행 순서에 차이가 있다.
SELECT문은 순차적으로 실행되지 않고
- FROM
- WHERE
- GROUP BY
- HAVING
- SELECT
- ORDER BY
- LIMIT
순으로 실행된다.
트랜잭션 제어 언어 (TCL)
종류 | 설명 |
COMMIT | 데이터베이스에 작업 반영 |
ROLLBACK | 작업 이전 상태로 되돌림 |
SAVEPOINT | 롤백의 기준점 설정 |
CREATE TABLE accounts (
account_id INT PRIMARY KEY,
account_name VARCHAR(50),
balance INT
);
INSERT INTO accounts (account_id, account_name, balance) VALUES (1, 'Kim', 1000);
INSERT INTO accounts (account_id, account_name, balance) VALUES (2, 'Lee', 500);
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
두개의 UPDATE문이 반드시 함께 실행되어야 할 경우 두 UPDATE문을 하나의 트랜잭션으로 구성될 수 있다
여러 작업을 포함하는 트랜잭션을 나타낼 때는 START TRANSACTION 혹은 BEGIN 명령을 사용하여 트랜잭션이 시작됨을 알리는 명령이라고 볼 수 잇음
START TRANSACTION
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
- COMMIT: 트랜잭션이 성공적으로 완료되어 트랜잭션에서 수행된 모든 변경 사항을 데이터베이스에 영구적으로 반영한다는 의미
- ROLLBACK: 트랜잭션에서 수행된 변경 사항을 취소하고, 데이터베이스를 트랜잭션 시작 이전의 상태로 되돌리겠다는 의미
ROLLBACK
트랜잭션 이후에
- 업데이트문을 한 번 실행했고
- 커밋하지 않고 롤백을 했을 경우
- 의 accounts 테이블은 업데이트가 이루어지기전 1번과 같아진다
COMMIT
트랜잭션 이후에
- 두개의 업데이트문이 실행되고
- 커밋을 통해 작업을 데이터베이스에 영구적으로 반영
- 의 accounts 테이블은 시점 2와 같아짐
SAVEPOINT
ROLLBACK으로 되돌아갈 시점을 지정하는 기능
-- 되돌아갈 시점 지정
SAVEPOINT 세이브포인트_이름
-- 세이브포인트_이름으로 되돌아가는 명령
ROLLBACK TO SAVEPOINT 세이브포인트_이름
예제
START TRANSACTION;
-- 세이브포인트 생성 ①
SAVEPOINT sp1;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 세이브포인트 생성 ②
SAVEPOINT sp2;
UPDATE accounts SET account_name = 'new_Kim' WHERE account_id = 1;
UPDATE accounts SET account_name = 'new_Lee' WHERE account_id = 2;
-- 세이브포인트 생성 ③
SAVEPOINT sp3;
SELECT * FROM accounts;
-- 특정 세이브포인트로 롤백
ROLLBACK TO SAVEPOINT sp2;
ROLLBACK TO SAVEPOINT sp1;
추가!!! 데이터 제어언어 ~
DCL 대표적인 명령어에는 GRANT와 REVOKE가 있다.
종류 | 설명 |
GRANT | 사용자에게 권한 부여 |
REVOKE | 사용자로부터 권한 회수 |
두개 다 사용자와 관련된 명령어이다.
RDBMS에서도 접속 가능한 사용자 계정을 생성하거나 삭제할 수 있고, 사용자마다 사용가능한 SQL 명령을 제한하는 등 권한 관리을 관리할 수 있다.
'cs' 카테고리의 다른 글
01-2. 프로그래밍 패러다임 (1) | 2025.04.22 |
---|---|
01. 디자인 패턴 (0) | 2025.04.22 |
02. RDBMS의 기본 (0) | 2025.04.04 |
01. 데이터베이스 (0) | 2025.04.04 |
04. 전송계층 - TCP와 UDP (0) | 2025.03.19 |