DDL : DB/테이블 을 생성하거나, 수정, 삭제 등 데이터베이스의 구조를 정의하는 문법
DROP DATABASE test_db;
-- test_db 라는 이름의 데이터베이스를 삭제하지만, 만약 db가 존재하지 않는다면 에러가 발생한다.
DROP DATABASE IF EXISTS test_db
--IF EXISTS 조건을 통해 test_db가 존재하는 경우에만 삭제하기 때문에 위에서 말한 에러가 발생하지 않는다.
CREATE DATABASE test_db;
-- test_db 라는 이름의 데이터베이스를 생성한다.
USE test_db;
-- 앞에서 만든 test_db 를 사용하도록 설정한다.
-- 이 쿼리를 실행하지 않고 데이터를 조작하게 되면 어떤 DB를 사용해야 할지 모르므로 오류가 발생한다.
CREATE TABLE test_table (
table_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
email VARCHAR(128) NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP()
);
-- test_table 이라는 이름의 테이블을 생성한다.
-- table_id 라는 이름으로 PK를 만들고, AUTO_INCREMNT 를 설정해 자동으로 값이 증가하게 하였다.
-- 만약 현재 마지막 데이터의 id가 2라면, 그 다음에 추가되는 데이터의 id는 자동으로 3이 된다.
ALTER TABLE test_table ADD COLUMN age INT NOT NULL DEFAULT 0;
-- ALTER : 테이블을 수정하는 문법이다.
-- ADD COLUMN : 새로운 컬럼을 추가한다.
ALTER TABLE test_table MODIFY COLUMN name VARCHAR(30) NOT NULL;
-- MODIFY COLUMN : 기존에 존재하는 컬럼을 수정한다.
-- 수정 시 수정할 부분 뿐만 아니라 컬럼명, 타입, 제약조건까지 다 적어줘야 한다.
ALTER TABLE test_table CHANGE COLUMN email user_email VARCHAR(128) NOT NULL;
-- CHANGE COLUMN : MODIFY의 기능과 더불어 기존 컬럼의 이름까지 변경 할 수 있다.
ALTER TABLE test_table DROP COLUMN age;
-- 테이블에 존재하는 특정 컬럼을 아예 삭제한다.
DROP TABLE test_table;
-- test_table 이라는 이름의 테이블을 삭제한다.
-- 데이터베이스와 동일하게 IF EXISTS 조건을 넣을 수 있다.
TRUNCATE TABLE test_table;
-- test_table 이라는 이름의 테이블은 그대로 두고, 테이블 안의 데이터들만 삭제한다.
-- DELETE FROM test_table 과 동작은 같지만, 아래와 같은 차이가 있다.
-- DELETE FROM test_table은 한 행씩 지우면서 기록을 남긴다.
-- 반면 TRUNCATE는 그냥 테이블을 다 비우기만 하면 되서 조금 더 빠르고 간단하다.
-- TRUNCATE 는 PK의 자동 증가 값도 초기화 한다.
-- 만약 현재 가장 큰 id가 100 이라고 해도 TRUNCATE를 하게 된다면 0으로 초기화 된다.
-- 보통은 테이블은 남기고 내부 데이터는 전부 지우고 싶다면 TRUNCATE가 유용하다.
-- 만약 특정 조건을 가진 행만 삭제한다면 DELETE를 사용해야 한다.
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(10) NOT NULL,
email VARCHAR(128) NOT NULL UNIQUE
);
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(),
user_id INT NOT NULL,
CONSTRAINT fk_orders_users FOREIGN KEY user_id REFERENCES users(user_id)
);
-- 이런식으로 NOT NULL, NULL, UNIQUE, FOREIGN KEY 등 다양한 제약을 설정할 수 있다.
-- NOT NULL / NULL : NULL을 허용하거나 허용하지 않을 수 있다.
-- NOT NULL 이라면 기본값이 없을 때 데이터 삽입 시 해당 컬럼의 값을 포함하지 않는다면 오류가 날 수 있다.
-- UNIQUE : 해당 컬럼을 테이블의 유일한 값으로 관리되도록 할 수 있다.
-- UNIQUE 이 정의된 컬럼은 해당 컬럼이 존재하는 테이블 안에서는 중복될 수 없다.
-- 만약 중복된다면 오류가 발생하며, 이런 제약은 데이터 무결성을 지킬 수 있다.
-- CONSTRAINT uc_abc UNIQUE (first, second) 처럼 여러 컬럼의 조합으로도 유일값을 만들 수 있다.
-- 이 경우 삽입하려는 데이터의 first 컬럼 값이 존재하고, second 컬럼 값도 존재한다면 오류가 발생한다.
-- 만약 first 컬럼 값은 존재하지만 second 컬럼 값은 존재하지 않는다면 해당 데이터는 정상적으로 삽입된다.
-- 반대도 마찬가지며, 한마디로 first + second 조합으로 비교해 완전히 똑같다면 유일한 것으로 판단한다.
-- FOREIGN KEY : 두 테이블의 관계를 이어주는 외래키를 설정한다.
-- 외래키가 존재하는 테이블은 보통 자식 테이블이라고 하며, 나머지를 부모 테이블이라고 한다.
-- 자식 테이블에 부모 테이블의 PK를 저장하므로써 두 테이블이 논리적으로 연관되어 있도록 만든다.
-- 만약 부모 테이블에 존재하지 않는 id를 FK에 저장한다면 오류가 발생한다.
-- FK는 JOIN에서 가장 의미있게 사용될 수 있는데, 자식과 부모를 JOIN 으로 붙여서 더 많은 정보를 조회 할 수 있다.