관계형 데이터베이스를 관리하기 위해 설계한 프로그래밍 언어이다.
데이터베이스 객체의 구조를 정의하거나 수정하는 데 사용되는 명령어다.
주요 명령어
데이터베이스 객체를 생성한다.
-- create database
CREATE DATABASE new_database;
-- create table
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
데이터베이스 객체를 삭제한다.
--데이터베이스 삭제
DROP DATABASE new_database;
--테이블 삭제
DROP TABLE IF EXISTS users;
--테이블의 열 삭제
ALTER TABLE users DROP COLUMN username ;
데이터베이스 구조를 수정한다.
1. 열 추가
-- 단일 열 추가
ALTER TABLE users ADD COLUMN age INT NOT NULL;
-- 동시에 여러 열 추가
ALTER TABLE users
ADD COLUMN phone_number VARCHAR(20),
ADD COLUMN address VARCHAR(255);
2. 열 수정
-- 열의 데이터 타입 수정
ALTER TABLE users MODIFY COLUMN age INT UNSIGNED;
-- 열 이름 변경
ALTER TABLE users CHANGE COLUMN phone_number contact_number VARCHAR(20);
-- 열 길이 수정
ALTER TABLE users MODIFY COLUMN name VARCHAR(255);
3. 열 삭제
-- "address" 열 삭제
ALTER TABLE users DROP COLUMN address;
4. 기본 값 추가 및 변경
-- 기본값 추가
ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active';
-- 기본값 삭제
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;
5. 키 추가 및 삭제
-- PRIMARY KEY 추가
ALTER TABLE users ADD PRIMARY KEY (id);
-- PRIMARY KEY 삭제
ALTER TABLE users DROP PRIMARY KEY;
-- 외래 키 추가
ALTER TABLE users ADD CONSTRAINT fk_department
FOREIGN KEY (department_id) REFERENCES departments(id);
-- 외래 키 삭제
ALTER TABLE users DROP FOREIGN KEY fk_department;
6. 열 순서 변경
-- "nickname" 열을 "body" 열 뒤로 이동
ALTER TABLE users MODIFY COLUMN nickname VARCHAR(50) AFTER body;
-- 열을 맨 앞으로 이동
ALTER TABLE users MODIFY COLUMN age INT FIRST;
7. 테이블 이름 변경
-- 테이블 이름 변경
ALTER TABLE users RENAME TO customers;
8. AUTO_INCREMENT 추가 및 변경
-- AUTO_INCREMENT 설정
ALTER TABLE users MODIFY COLUMN id INT AUTO_INCREMENT;
-- AUTO_INCREMENT 초기값 설정
ALTER TABLE users AUTO_INCREMENT = 10;
9. NOT NULL 설정
-- NOT NULL 제약 추가
ALTER TABLE users MODIFY COLUMN nickname VARCHAR(50) NOT NULL;
-- NOT NULL 제약 삭제
ALTER TABLE users MODIFY COLUMN nickname VARCHAR(50) NULL;
데이터베이스의 모든 데이터를 삭제한다. 그러나 구조는 유지된다.
1. 테이블 초기화
TRUNCATE TABLE logs;
데이터베이스의 데이터를 조작(검색, 삽입, 수정, 삭제)하는 명령어다.
주요 명령어
테이블에 새로운 데이터를 추가한다.
-- 단일 행 추가
INSERT INTO users (id, name, age) VALUES (1, '홍길동', 25);
-- 다중 행 추가
INSERT INTO users (id, name, age) VALUES
(2, '김철수', 30),
(3, '이영희', 22);
-- SELECT 결과를 기반으로 데이터 추가
INSERT INTO backup_users (id, name, age, backup_date)
SELECT
id,
name,
age,
CURRENT_TIMESTAMP
FROM users
WHERE age > 20;
데이터를 조회한다.
-- 기본 조회 (필요한 열만 선택)
SELECT id, name, age FROM users;
-- 조건부 조회 (인덱스 활용)
SELECT * FROM users
WHERE age > 25 AND status = 'ACTIVE';
-- 정렬 및 페이징
SELECT * FROM users
ORDER BY age DESC, name ASC
LIMIT 10 OFFSET 0;
-- 그룹화 및 HAVING 절 사용
SELECT
age,
COUNT(*) AS count,
AVG(salary) AS avg_salary
FROM users
GROUP BY age
HAVING COUNT(*) > 5;
-- 서브쿼리
SELECT * FROM users u
WHERE EXISTS (
SELECT 1 FROM backup_users bu
WHERE bu.id = u.id
);
테이블에 존재하는 데이터를 수정한다.
-- 데이터 업데이트
UPDATE users
SET
name = '김길동',
updated_at = CURRENT_TIMESTAMP
WHERE id = 1 AND status = 'ACTIVE';
-- 조건부 다중 열 업데이트
UPDATE users
SET
age = age + 1,
status = CASE
WHEN age >= 65 THEN 'SENIOR'
ELSE status
END
WHERE age < 70;
테이블에서 데이터를 삭제한다.
-- 조건부 삭제
DELETE FROM users
WHERE
age < 20 AND
status = 'INACTIVE' AND
last_login < DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR);
-- 다중 조건 삭제
DELETE FROM users
WHERE id IN (
SELECT id FROM backup_users
WHERE backup_date < DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH)
);
데이터베이스의 접근 권한과 관련된 명령어다.
주요 명령어
용자가 데이터베이스 객체에 대해 특정 작업을 수행할 수 있는 권한을 부여한다.
-- 특정 사용자에게 SELECT 권한 부여
GRANT SELECT ON database_name.table_name TO 'username'@'host';
-- 특정 사용자에게 SELECT, INSERT 권한 부여
GRANT SELECT, INSERT ON database_name.table_name TO 'username'@'host';
-- 특정 데이터베이스에 대한 모든 권한 부여
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'host';
-- 글로벌 권한 부여 (모든 데이터베이스 접근 가능)
GRANT ALL PRIVILEGES ON *.* TO 'username'@'host';
-- GRANT OPTION 포함 권한 부여 (사용자가 다른 사용자에게 권한을 부여할 수 있음)
GRANT ALL PRIVILEGES ON database_name.table_name TO 'username'@'host' WITH GRANT OPTION;
사용자에게 부여된 권한을 철회한다.
-- 특정 테이블에서 SELECT 권한 회수
REVOKE SELECT ON database_name.table_name FROM 'username'@'host';
-- 특정 사용자로부터 특정 권한 회수
REVOKE INSERT, UPDATE ON database_name.table_name FROM 'username'@'host';
-- 모든 권한 회수
REVOKE ALL PRIVILEGES ON database_name.* FROM 'username'@'host';
-- 글로벌 권한 회수
REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'host';
| 종류 | 연산자 | 설명 | 예시 |
|---|---|---|---|
| 비교 연산자 | = | 두 값이 같은지 비교 | SELECT * FROM users WHERE age = 25; |
!= / <> | 두 값이 다른지 비교 | SELECT * FROM products WHERE price != 100; | |
> | 첫 번째 값이 두 번째 값보다 큰지 비교 | SELECT * FROM orders WHERE total_amount > 500; | |
< | 첫 번째 값이 두 번째 값보다 작은지 비교 | SELECT * FROM employees WHERE salary < 3000; | |
>= | 첫 번째 값이 두 번째 값보다 크거나 같은지 비교 | SELECT * FROM customers WHERE points >= 1000; | |
<= | 첫 번째 값이 두 번째 값보다 작거나 같은지 비교 | SELECT * FROM inventory WHERE quantity <= 10; | |
| 논리 연산자 | AND | 두 조건이 모두 참일 때 참 | SELECT * FROM students WHERE age > 18 AND grade = 'A'; |
OR | 두 조건 중 하나라도 참일 때 참 | SELECT * FROM employees WHERE department = 'Sales' OR department = 'Marketing'; | |
NOT | 조건을 부정 | SELECT * FROM products WHERE NOT price < 50; | |
| 수학 연산자 | + | 두 값의 합을 구함 | SELECT price + tax FROM orders; |
- | 두 값의 차를 구함 | SELECT salary - deductions FROM employees; | |
* | 두 값의 곱을 구함 | SELECT quantity * unit_price FROM invoice; | |
/ | 두 값의 나눗셈을 구함 | SELECT total / 2 FROM sales; | |
% | 두 값의 나머지를 구함 | SELECT quantity % 2 FROM products; | |
| 문자열 연산자 | CONCAT() | 두 문자열을 결합 | SELECT CONCAT(first_name, ' ', last_name) FROM users; |
참고 자료