DDL(Data Definition Language / 데이터 정의어)
- 오브젝트의 구조를 다루는 문법 종류
- CREATE : 새로운 오브젝트를 정의하는 문법
- ALTER : 기존 오브젝트의 구조를 변형하는 문법
- DROP : 기존 오브젝트의 구조를 삭제하는 문법
데이터베이스의 오브젝트 종류
테이블 | 데이터베이스의 데이터 저장의 기본 단위. 행으로 구성되어 있다. |
뷰 | 테이블의 논리적인 부분 집합의 구조. 가상의 테이블의 오브젝트 |
인덱스 | 일부 쿼리의 성능을 올려주는 오브젝트 |
테이블(CREATE TABLE)
- 데이터를 저장하는데 필요한 속성, 형식, 제약등을 정의하는 문법
문법
CREATE TABLE 테이블명 ( 컬럼명1 데이터타입(크기) [컬럼레벨 제약조건] [, 컬럼명2 데이터타입(크기), ...] [테이블레벨 제약조건] ); |
실습 데이터베이스 생성
CREATE DATABASE test; |
- 생성 후 데이터베이스 목록에서 새로고침 후 선택
CREATE TABLE test1 ( NUM INT, NAME VARCHAR(30), SALARY INT, BIRTHDATE DATE ); |
DESC test1; |
SELECT * FROM test1; |
NUM|NAME|SALARY|BIRTHDATE|
---+----+------+---------+
INSERT INTO test1 (NUM, NAME, SALARY, BIRTHDATE) VALUES (1, 'Burger', 100, '2023-08-09'); |
SELECT * FROM test1; |
Q. test2 테이블을 생성
- 테이블명 : orders컬럼 구성
컬럼명 | 데이터타입 | 크기 |
order_id | int | |
customer_id | int | |
product_id | int | |
quantity | int | |
price | DECIMAL | (10,2) |
order_date | DATE |
CREATE TABLE test2( order_id INT, customer_id INT, product_id INT, quantity INT, price DECIMAL(10, 2), order_date DATE ); |
Field |Type |Null|Key|Default|Extra|
-----------+-------------+----+---+-------+-----+
order_id |int |YES | | | |
customer_id|int |YES | | | |
product_id |int |YES | | | |
quantity |int |YES | | | |
price |decimal(10,2)|YES | | | |
order_date |date |YES | | | |
옵션 DEFAULT 값
- 데이터 입력 시 특정 컬럼의 값을 입력하지 않은 경우 NULL값 대신 입력될 기본값을 설정하는 옵션
- DEFAULT 값 설정 시 설정이 적용될 컬럼과 동일한 데이터타입의 리터럴값 또는 함수를 작성해준다
- hire_date 컬럼에는 옵션으로 기본값을 NOW() 함수의 결과를 설정하였음
CREATE TABLE testdefault ( emp_id INT, hire_date DATETIME DEFAULT NOW() ); |
DESC testdefault; |

- hire_date 컬럼에 대한 입력값을 생략했으나 hire_date 컬럼에 적용된 default 값이 동작하여 NOW()함수의 결과가 대신 입력된 것을 볼 수 있다.
INSERT INTO testdefault (emp_id) VALUES (1); |

- hire_date 컬럼에 대해서 명시적으로 NULL값을 입력하게 되면 DEFAULT 설정이 동작하지 않는다.
INSERT INTO testdefault (emp_id, hire_date) VALUES (2, NULL); |
SELECT * FROM testdefault; |

제약조건(CONSTRAINT)
- 데이터의 무결성 유지를 위해 테이블에 적용되는 데이터에 대한 제약 설정
NOT NULL
- 해당 제약조건이 적용된 컬럼에 NULL값을 허용하지 않는 제약
- 값의 입력이 필수인 컬럼에 설정
- NOT NULL 제약조건의 작성 위치는 제약조건이 적용 될 컬럼의 기본 정의 이후에 작성을 한다.
CREATE TABLE testnn ( name VARCHAR(30) NOT NULL, age INT ); |
DESC testnn; |
암시적 NULL 데이터 입력
- name 컬럼에 대한 입력값을 작성하지 않은 상태에서 컬럼에 기본적으로 null값 대신 입력 될 기본값(DEFAULT) 설정도 존재하지 않는 경우 NULL에 대한 대체값이 없게되므로 에러가 발생한다.
INSERT INTO testnn (age) VALUES (10); |
SQL Error [1364] [HY000]: Field 'name' doesn't have a default value
명시적 NULL 데이터 입력
- name 컬럼에 명시적으로 NULL값을 입력하려는 경우 DEFAULT 설정도 적용되지 않기 때문에 NULL값을 피할 수단이 없으므로 NOT NULL제약조건에 의해서 입력이 바로 차단되어 버린다.
INSERT INTO testnn (name, age) VALUES (NULL, 10); |
SQL Error [1048] [23000]: Column 'name' cannot be null
UNIQUE - 고유한 값만 입력
- UNIQUE 제약조건이 적용된 컬럼에는 중복값을 입력할 수 없도록 제약이 걸리게 된다.
- NULL 값은 비교 불가능 데이터이므로 UNIQUE로도 중복값으로 걸러 낼 수 없다.
CREATE TABLE testuk ( id INT UNIQUE ); |
INSERT INTO testuk VALUES (1); |
SELECT * FROM testuk; |
id|
--+
1|
INSERT INTO testuk VALUES (NULL); |
SELECT * FROM testuk; |

PRIMARY KEY - 테이블의 대표 컬럼 지정
- NOT NULL + UNIQUE 의 기능을 가진다.
- 테이블의 행 데이터들을 개개별로 구분 할 수 있는 의미의 컬럼에 적용하는 제약조건이다.
- 테이블 당 한번만 사용가능하다.
CREATE TABLE testpk ( id INT PRIMARY KEY, ci_id INT NOT NULL UNIQUE, name varchar(10) ); DESK testpk; |
DROP TABLE (테이블 삭제)
- 기존 테이블의 구조를 삭제하는 문법
- 테이블을 삭제하면 테이블의 모든 데이터도 함께 삭제된다.
문법
DROP TABLE 테이블명; |
SHOW tables; |
Tables_in_test|
--------------+
test1 |
test2 |
- 테이블 중 test2 테이블을 삭제한다.
DROP TABLE test2; |
Tables_in_test|
--------------+
test1 |
DESC test2; |
SQL Error [1146] [42S02]: Table 'test.test2' doesn't exist
SELECT * FROM test2; |
SQL Error [1146] [42S02]: Table 'test.test2' doesn't exist
'⛏️ > Mysql | Oracle' 카테고리의 다른 글
[SQL] 11. 숫자 함수 (0) | 2023.08.23 |
---|---|
[SQL] 10. 문자 함수 (0) | 2023.08.09 |
[SQL] 8. DML (0) | 2023.08.09 |
[SQL] 7. JOIN (0) | 2023.08.09 |
[SQL] 6. ORDER BY (0) | 2023.08.09 |