
현재 MySQL 서버에 존재하는 데이터베이스 목록을 확인할 때 사용한다.
-- 현재 서버에 존재하는 데이터베이스 목록 확인
SHOW DATABASES;
출력 예시:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
새로운 데이터베이스를 만들 때는 CREATE DATABASE를 사용한다.
-- ai라는 이름의 데이터베이스 생성
CREATE DATABASE ai;
-- ai 데이터베이스가 없을 때만 생성
CREATE DATABASE IF NOT EXISTS ai;
테이블을 만들거나 데이터를 조작하려면 먼저 사용할 데이터베이스를 선택해야 한다.
-- ai 데이터베이스 사용
USE ai;
이후 실행하는 CREATE TABLE, INSERT, SELECT 등의 명령은 기본적으로 ai 데이터베이스 안에서 실행된다.
테이블은 데이터를 행과 열로 저장하는 구조이다.
엑셀 표처럼 생각하면 이해하기 쉽다.
| 용어 | 의미 |
|---|---|
| 테이블 | 데이터를 저장하는 표 |
| 행, Row, Record | 실제 데이터 한 줄 |
| 열, Column, Field | 데이터의 항목 |
| 스키마 | 테이블의 구조와 제약조건 |
예를 들어 회원 정보를 저장하는 member 테이블은 다음과 같은 구조를 가질 수 있다.
| idx | userid | userpw | name | hp | |
|---|---|---|---|---|---|
| 1 | apple | 1234 | 김사과 | 010-1111-1111 | apple@example.com |
| 2 | banana | 1234 | 반하나 | 010-2222-2222 | banana@example.com |
테이블은 CREATE TABLE 명령어로 만든다.
기본 형식:
CREATE TABLE 테이블명 (
컬럼명1 데이터타입 제약조건,
컬럼명2 데이터타입 제약조건,
컬럼명3 데이터타입 제약조건
);
예:
CREATE TABLE member (
idx INT AUTO_INCREMENT PRIMARY KEY,
userid VARCHAR(20) UNIQUE NOT NULL,
userpw VARCHAR(20) NOT NULL
);
위 예시는 member라는 테이블을 만들고, idx, userid, userpw 컬럼을 생성한다.
스키마는 데이터베이스나 테이블의 구조와 제약조건을 정의한 명세이다.
쉽게 말해, 테이블이 어떤 모양으로 데이터를 저장할지 정해놓은 설계도이다.
스키마에 포함되는 내용:
데이터 타입은 컬럼에 어떤 종류의 값을 저장할지 정하는 규칙이다.
정수 데이터를 저장할 때 사용한다.
| 타입 | 설명 |
|---|---|
INT | 일반적인 정수 |
BIGINT | 더 큰 범위의 정수 |
예:
point INT DEFAULT 1000
point 컬럼은 정수를 저장한다.1000이 들어간다.소수점이 있는 숫자를 저장할 때 사용한다.
| 타입 | 설명 |
|---|---|
FLOAT | 실수 |
DOUBLE | 더 정밀한 실수 |
DECIMAL | 정확한 소수 계산에 사용 |
예:
price DECIMAL(10, 2)
FLOAT보다 DECIMAL이 더 적합하다.문자 데이터를 저장할 때 사용한다.
| 타입 | 설명 |
|---|---|
CHAR(n) | 고정 길이 문자열 |
VARCHAR(n) | 가변 길이 문자열 |
TEXT | 긴 문자열 |
BINARY | 고정 길이 바이너리 데이터 |
VARBINARY | 가변 길이 바이너리 데이터 |
예:
userid VARCHAR(20) UNIQUE NOT NULL
ssn1 CHAR(6) NOT NULL
userid는 최대 20글자까지 저장할 수 있다.ssn1은 주민등록번호 앞자리처럼 길이가 정해진 값에 적합하다.CHAR는 고정 길이, VARCHAR는 가변 길이다.날짜와 시간을 저장할 때 사용한다.
| 타입 | 설명 |
|---|---|
DATE | 날짜 |
TIME | 시간 |
DATETIME | 날짜와 시간 |
TIMESTAMP | 시간 흐름 기준의 날짜/시간 |
예:
regdate DATETIME DEFAULT NOW()
regdate는 회원 가입일 같은 날짜와 시간을 저장한다.제약조건은 데이터의 무결성을 지키기 위해 데이터를 입력하거나 수정할 때 검사하는 규칙이다.
무결성이란 데이터가 정확하고 일관된 상태를 유지하는 것을 의미한다.
NOT NULLNULL 값을 허용하지 않는다.
name VARCHAR(20) NOT NULL
name 컬럼에는 반드시 값이 들어가야 한다.UNIQUE중복 값을 허용하지 않는다.
userid VARCHAR(20) UNIQUE NOT NULL
UNIQUE는 중복은 막지만, 일반적으로 NULL은 허용될 수 있다.NOT NULL도 함께 사용한다.DEFAULT값을 입력하지 않았을 때 기본으로 들어갈 값을 설정한다.
point INT DEFAULT 1000
point 값을 직접 넣지 않으면 자동으로 1000이 들어간다.PRIMARY KEY테이블에서 각 행을 구분하는 대표 컬럼이다.
idx INT AUTO_INCREMENT PRIMARY KEY
특징:
NULL 값을 허용하지 않는다.idx는 회원 한 명을 구분하기 위한 고유 번호이다.FOREIGN KEY다른 테이블의 기본키를 참조하는 키이다.
기본 형식:
FOREIGN KEY (컬럼명) REFERENCES 참조테이블명(참조컬럼명)
예:
FOREIGN KEY (member_idx) REFERENCES member(idx)
FOREIGN KEY는 테이블 간 관계를 만들 때 중요하다.AUTO_INCREMENT숫자 값을 자동으로 증가시킨다.
idx INT AUTO_INCREMENT PRIMARY KEY
idx 값을 직접 넣지 않아도 자동으로 1, 2, 3처럼 증가한다.아래 SQL은 회원 정보를 저장하는 member 테이블을 생성한다.
CREATE TABLE member (
idx INT AUTO_INCREMENT PRIMARY KEY,
userid VARCHAR(20) UNIQUE NOT NULL,
userpw VARCHAR(20) NOT NULL,
name VARCHAR(20) NOT NULL,
hp VARCHAR(20) NOT NULL,
email VARCHAR(50) NOT NULL,
ssn1 CHAR(6) NOT NULL,
ssn2 CHAR(7) NOT NULL,
zipcode VARCHAR(5),
address1 VARCHAR(100),
address2 VARCHAR(100),
address3 VARCHAR(100),
regdate DATETIME DEFAULT NOW(),
point INT DEFAULT 1000
);
| 컬럼명 | 데이터 타입 | 제약조건 | 설명 |
|---|---|---|---|
idx | INT | AUTO_INCREMENT, PRIMARY KEY | 회원 고유 번호 |
userid | VARCHAR(20) | UNIQUE, NOT NULL | 회원 아이디 |
userpw | VARCHAR(20) | NOT NULL | 비밀번호 |
name | VARCHAR(20) | NOT NULL | 이름 |
hp | VARCHAR(20) | NOT NULL | 휴대폰 번호 |
email | VARCHAR(50) | NOT NULL | 이메일 |
ssn1 | CHAR(6) | NOT NULL | 주민등록번호 앞자리 |
ssn2 | CHAR(7) | NOT NULL | 주민등록번호 뒷자리 |
zipcode | VARCHAR(5) | 없음 | 우편번호 |
address1 | VARCHAR(100) | 없음 | 주소 |
address2 | VARCHAR(100) | 없음 | 상세주소 |
address3 | VARCHAR(100) | 없음 | 참고주소 |
regdate | DATETIME | DEFAULT NOW() | 가입일 |
point | INT | DEFAULT 1000 | 기본 포인트 |
테이블이 어떤 컬럼과 타입으로 구성되어 있는지 확인할 때 DESC를 사용한다.
-- member 테이블 구조 확인
DESC member;
출력 예:
+----------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+-------------------+----------------+
| idx | int | NO | PRI | NULL | auto_increment |
| userid | varchar(20) | NO | UNI | NULL | |
| userpw | varchar(20) | NO | | NULL | |
| name | varchar(20) | NO | | NULL | |
| point | int | YES | | 1000 | |
+----------+--------------+------+-----+-------------------+----------------+
테이블 자체를 완전히 삭제할 때는 DROP TABLE을 사용한다.
-- member 테이블 삭제
DROP TABLE member;
기존 테이블에서 특정 컬럼을 삭제할 때는 ALTER TABLE ... DROP을 사용한다.
-- member 테이블에서 point 컬럼 삭제
ALTER TABLE member DROP point;
member 테이블 구조에서 point 컬럼이 제거된다.기존 테이블에 새 컬럼을 추가할 때는 ALTER TABLE ... ADD를 사용한다.
-- member 테이블에 point 컬럼 추가
ALTER TABLE member ADD point INT DEFAULT 1000;
point라는 정수형 컬럼을 추가한다.1000이 들어간다.기존 컬럼의 데이터 타입이나 기본값을 수정할 때는 ALTER TABLE ... MODIFY COLUMN을 사용한다.
-- point 컬럼의 기본값을 100으로 수정
ALTER TABLE member MODIFY COLUMN point INT DEFAULT 100;
point 컬럼의 구조를 수정한다.1000을 100으로 바꾼다.DDL은 Database Definition Language의 약자로, 데이터베이스 객체의 구조를 정의하는 명령어이다.
즉, 데이터베이스나 테이블을 만들고, 수정하고, 삭제할 때 사용한다.
| 명령어 | 의미 | 예시 |
|---|---|---|
CREATE | 데이터베이스, 테이블, 뷰 등을 생성 | CREATE TABLE member (...); |
ALTER | 기존 객체의 구조 변경 | ALTER TABLE member ADD point INT; |
DROP | 객체를 완전히 삭제 | DROP TABLE member; |
TRUNCATE | 테이블의 모든 데이터 삭제, 구조는 유지 | TRUNCATE TABLE member; |
TRUNCATE 주의점TRUNCATE TABLE member;
DML은 Data Manipulation Language의 약자로, 테이블 안의 데이터를 조작하는 명령어이다.
| 명령어 | 의미 | 예시 |
|---|---|---|
SELECT | 데이터 조회 | SELECT * FROM member; |
INSERT | 데이터 삽입 | INSERT INTO member (...) VALUES (...); |
UPDATE | 데이터 수정 | UPDATE member SET point = 2000 WHERE idx = 1; |
DELETE | 데이터 삭제 | DELETE FROM member WHERE idx = 1; |
영어 단어와 한글 뜻을 저장하는 voca 테이블을 만든다.
CREATE TABLE voca (
eng VARCHAR(50) PRIMARY KEY,
kor VARCHAR(50) NOT NULL,
lev INT DEFAULT 1,
regdate DATETIME DEFAULT NOW()
);
| 컬럼명 | 데이터 타입 | 제약조건 | 설명 |
|---|---|---|---|
eng | VARCHAR(50) | PRIMARY KEY | 영어 단어 |
kor | VARCHAR(50) | NOT NULL | 한글 뜻 |
lev | INT | DEFAULT 1 | 단어 난이도 |
regdate | DATETIME | DEFAULT NOW() | 등록일 |
eng VARCHAR(50) PRIMARY KEY
PRIMARY KEY이므로 NULL도 허용되지 않는다.kor VARCHAR(50) NOT NULL
lev INT DEFAULT 1
1이 들어간다.regdate DATETIME DEFAULT NOW()
처음부터 테이블을 만드는 흐름은 다음과 같다.
-- 1. 데이터베이스 목록 확인
SHOW DATABASES;
-- 2. 데이터베이스 생성
CREATE DATABASE ai;
-- 3. 사용할 데이터베이스 선택
USE ai;
-- 4. 테이블 생성
CREATE TABLE member (
idx INT AUTO_INCREMENT PRIMARY KEY,
userid VARCHAR(20) UNIQUE NOT NULL,
userpw VARCHAR(20) NOT NULL,
name VARCHAR(20) NOT NULL,
hp VARCHAR(20) NOT NULL,
email VARCHAR(50) NOT NULL,
ssn1 CHAR(6) NOT NULL,
ssn2 CHAR(7) NOT NULL,
zipcode VARCHAR(5),
address1 VARCHAR(100),
address2 VARCHAR(100),
address3 VARCHAR(100),
regdate DATETIME DEFAULT NOW(),
point INT DEFAULT 1000
);
-- 5. 테이블 구조 확인
DESC member;
SHOW DATABASES;CREATE DATABASE 데이터베이스명;USE 데이터베이스명;CREATE TABLE 테이블명 (...);DESC 테이블명;DROP TABLE 테이블명;ALTER TABLE 테이블명 ADD 컬럼명 데이터타입;ALTER TABLE 테이블명 DROP 컬럼명;ALTER TABLE 테이블명 MODIFY COLUMN 컬럼명 데이터타입;| 구분 | 목적 | 대표 명령어 |
|---|---|---|
| DDL | 구조 정의 | CREATE, ALTER, DROP, TRUNCATE |
| DML | 데이터 조작 | SELECT, INSERT, UPDATE, DELETE |
쉽게 말하면:
CREATE DATABASE 후에는 반드시 USE 데이터베이스명;을 실행한다.DROP TABLE은 테이블과 데이터를 모두 삭제하므로 조심한다.NULL을 허용하지 않는다.AUTO_INCREMENT는 보통 숫자 기본키와 함께 사용한다.VARCHAR는 길이가 변하는 문자열에 사용한다.CHAR는 주민등록번호 앞자리처럼 길이가 고정된 값에 사용한다.DEFAULT NOW()를 사용하면 현재 시간이 자동으로 들어간다.ALTER TABLE은 기존 테이블 구조를 바꿀 때 사용한다.