Infra & Security Eng/Database Engineering

DDL 개념과 종류, 테이블 생성, 생성규칙, 명령어, 삭제, 복구, 컬럼의 데이터 타입

엔지니어 E 2026. 2. 9. 13:00
반응형

 

DDL 개념과 종류

DDL 개념
데이터베이스에서 DDL은 '데이터 정의어'라고 부른다.  데이터를 담는 '표(Table)'라는 틀 자체를 만들거나 바꾸거나 없애는 명령어들이다

DDL 종류
1. CREATE(생성): 새로운 테이블(표)를 처음으로 만드는 것 
* 테이블(표)의 이름을 무엇으로 할지, 컬럼은 몇 개로 할지 등 정해서 아예없던 상태에서 표를 새로 만든다

2. ALTER(수정): 이미 만들어진 표의 구조를 바꾸는 것 
* 테이블(표)에 새로운 칸을 추가, 필요 없는 칸을 삭제 하는 등에 사용 

3. DROP(삭제): 테이블(표)을 통째로 없애버리는 것 
* 표 안에 들어있던 모든 데이터와, 표의 틀(구조)까지 완전히 삭제함

4. RENAME(이름 변경): 테이블(표)의 이름을 바꾸는 것
 
5. TRUNCATE(비우기): 표의 틀을 남겨두고 내용물(데이터)만 싹 다 지우는 것

 

테이블 생성과 삭제

테이블 생성
CREATE TABLE 테이블 (              
컬럼 컬럼의 데이터_타입 [DEFAULT 값] [컬럼 레벨 제약조건],
......
[테이블 레벨 제약조건],
.....
);

테이블 삭제
DROP TABLE 테이블 
[CASCADE CONSTRAINT];

* 회사에서 운영하고 있는 데이터베이스에서 테이블을 삭제하지는 않음

테이블을 삭제한 휴지통을 비우는 명령어 
PURGE RECYCLEBIN;

 

테이블 생성 규칙 

1. 문자로 시작함
2. 30자 이내 
3. 영문, 숫자, _, $, #을 사용 
* 한글 사용은 가능하지만 되도록 사용하지 않는 것이 좋음 

4. 테이블의 이름은 동일한 유저 안에서 유일해야 함
5. 예약어는 사용이 불가능함 ---> EX. 예약어:select , from, where

6. 대소문자 구별하지 않음 
* 생성할 때 사용한 문자와 관계없이 모든 이름은 대문자로 정의됨 

 

컬럼의 데이터 타입 (컬럼에 어떤 데이터 타입을 저장할 수 있는지)

가장 많이 사용하는 데이터 타입 

1. VARCHAR2(n): 가변 길이 문자 타입(1 < n < 4000 byte)
- VARCHAR2(n)에서 n은 글자 수가 아니라, 그 안에 들어갈 글자들의 '무게 합계(바이트)'가 최대 n만큼이다
- 최대 저장할 수 있는게 1바이트 이상 ~ 4000바이트까지 저장 가능

ex. varchar2(10), char(10)
vachar2는 5바이트를 사용하면 5바이트만 사용되지만 char는 5바이트를 사용해도 10바이트가 사용된다 



2. NUMBER(n,p)
- 숫자 타입, n은 전체 자리수이고 p는 소수점 이하 자리수 이다
- 전체 자리수를 초과할 경우 입력 거부되지만 소수점 이하 자리수가 초과되면 반올림되어 입력 된다 
* n:정수만 입력하고 p는 입력 안해도 됨

3. DATE
- 날짜 타입, 출력이나 입력 형식과 무관하게 YYYY/MM/DD:HH24:MI:SS 형태로 저장됨 
* 기원전 4712년 1월 1일 - 서기 9999년 12월 31일까지만 사용 가능

 

테이블 생성 관련 명령어

테이블 목록 확인 하는 명령어 


SQL> SELECT * FROM tab; ---> 현재 접속한 계정이 가지고 있는 테이블 목록을 한눈에 확인할 때 사용




SELECT table_name FROM user_tables; ---> 내가 만든 테이블들의 공식 명부(user_tables)에서 이름(table_name)만 쏙쏙 뽑아서 보여줘 라는 뜻

테이블 컬럼의 구성 확인하는 명령어 

1.

SET LINESIZE 200
COLUMN Name FORMAT A20
COLUMN Null? FORMAT A10
COLUMN Type FORMAT A20

DESC EMP;


2. 


2. 
COLUMN TABLE_NAME FORMAT A15
COLUMN COLUMN_NAME FORMAT A15
COLUMN DATA_TYPE FORMAT A10
SET LINESIZE 200


SQL> SELECT table_name, column_name, data_type, data_length

 FROM user_tab_columns
3  
[WHERE table_name = 'EMP'];

 

테이블 만들어보기

화면 출력 설정
SET LINESIZE 200
COLUMN TABLE_NAME FORMAT A20;

명령어 
CREATE TABLE board (
  no NUMBER,
  name VARCHAR2(50),
  sub VARCHAR2(100),
  content VARCHAR2(4000),
  hdate DATE DEFAULT SYSDATE
);

SELECT * FROM tab;
SELECT table_name FROM user_tables WHERE table_name = 'BOARD';
DESC board;




SET LINESIZE 200; -- 화면 가로 길이를 늘려 출력 깨짐 방지
COLUMN table_name FORMAT A20; -- 테이블 이름 칸 너비를 20자로 고정

CREATE TABLE board ( -- 'board'라는 이름의 테이블 생성 시작
  no NUMBER, -- 'no' 칸을 숫자 타입으로 생성
  name VARCHAR2(50), -- 'name' 칸을 최대 50바이트 문자 타입으로 생성
  sub VARCHAR2(100), -- 'sub' 칸을 최대 100바이트 문자 타입으로 생성
  content VARCHAR2(4000), -- 'content' 칸을 최대 4000바이트 문자 타입으로 생성
  hdate DATE DEFAULT SYSDATE -- 'hdate' 칸을 날짜 타입으로 생성 (기본값은 행을 입력할때 현재 시간, 날짜가 자동으로 입력되도록 한다라는 뜻)
); -- 테이블 생성 종료


SELECT * FROM tab; -- 전체 목록에서 생성 여부 확인




SQL> SELECT table_name FROM user_tables

 WHERE table_name = 'BOARD'; -- 'BOARD' 이름만 정확히 조회

 

테이블 안의 행 입력하고 확인하기

화면 출력 
SET LINESIZE 150;
SET PAGESIZE 100;
COLUMN TABLE_NAME FORMAT A15;
COLUMN COLUMN_NAME FORMAT A15;
COLUMN DATA_TYPE FORMAT A15;
COLUMN NAME FORMAT A15;
COLUMN SUB FORMAT A20;
COLUMN CONTENT FORMAT A30;

명령어 
DESC board;

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns
WHERE table_name = 'BOARD';

INSERT INTO board (no) VALUES (1);

COMMIT;

SELECT * FROM board;

명령어 해석 
DESC board; -- board 테이블의 칸 이름과 데이터 타입을 간단히 확인

SELECT table_name, column_name, data_type, data_length
FROM user_tab_columns -- user_tab_columns 명부에서 board 테이블의 설계도(이름, 타입, 길이 등)를 상세히 조회
WHERE table_name = 'BOARD'; -- * 테이블 이름은 반드시 대문자 'BOARD'로 적어야 검색이 됨 

INSERT INTO board (no) VALUES (1); -- board 테이블의 'no' 칸에 숫자 1을 집어넣는다

COMMIT; -- 입력한 데이터(1번)를 데이터베이스에 영구적으로 저장(확정)함


SELECT * FROM board; -- board 테이블에 들어있는 모든 데이터(*)를 꺼내서 화면에 보여준다 

 

문자 타입 데이터 

문자와 숫자 구별 

문자
- 주민번호, 군번, 숫자만으로 구성된 학번: 문자
* 각각의 숫자가 각각 의미를 가진다면 문자라고 보면 됨 
* 연산 가능성이 없음 

숫자
- 금액
* 연산 가능성이 있음
* NULL에 주의

VACHAR, VARCHAR2
- 같은 데이터 타입 

CHAR, VARCHAR2
- 주로 VARCHAR2를 많이 쓴다 

 

CHAR, VARCHAR2의 비교

동일한 값이 입력된 두 컬럼이 데이터 타입에 따라 다르게 인식됨을 확인 한다 


명령어 
SQL> CREATE TABLE comp( 

 co1 CHAR(4),


 co2 VARCHAR2(4)
 );
SQL> INSERT INTO comp VALUES ('AA','AA'); 
A A
SQL> SELECT LENGTHB(co1), LENGTHB(co2) FROM comp;
SQL> SELECT * FROM comp WHERE co1='AA';
A A
SQL> SELECT * FROM comp WHERE co2='AA';
SQL> SELECT * FROM comp WHERE co1=co2; 
* 이 명령어는 찾을 수 없음, 왜냐하면 둘의 크기는 같지 않기 때문임

명령어 설명
CREATE TABLE comp( --- 1. 테이블 생성: 고정 길이(CHAR)와 가변 길이(VARCHAR2) 컬럼을 각각 만듦
    co1 CHAR(4),      -- 고정 길이: 무조건 4바이트 공간을 차지함
    co2 VARCHAR2(4)   -- 가변 길이: 입력한 데이터 크기만큼만 공간을 사용함
);

INSERT INTO comp VALUES ('AA', 'AA');  --  2. 데이터 입력: 두 컬럼에 똑같이 'AA'라는 두 글자를 넣음
- INSERT INTO: 데이터를 집어넣겠다라는 선언임
- COMP: 데이터를 넣을 대상 테이블의 이름임
- VALUES: 실제로 들어갈 값들은 이것이라라고 알려주는 키워드

SELECT LENGTHB(co1), LENGTHB(co2) FROM comp; -- 3. 바이트 크기 확인: 실제 저장된 데이터의 크기를 숫자로 보여줌
-- 결과: co1은 4 (AA 뒤에 공백 2칸 추가됨), co2는 2 (AA만 저장됨)

4. 조건 검색 (개별): 각각 'AA'와 같은지 확인
SELECT * FROM comp WHERE co1='AA'; -- 결과 나옴 (오라클이 비교 시 공백을 무시함)
SELECT * FROM comp WHERE co2='AA'; -- 결과 나옴

5. 조건 검색 (컬럼끼리 비교): 두 컬럼의 값이 같은지 확인
SELECT * FROM comp WHERE co1=co2;
-- 결과: 데이터 없음 (공백이 포함된 'AA  '와 공백 없는 'AA'는 다른 값으로 취급함) 

 

날짜 타입 컬럼 검색 

명령어 
SQL> CREATE TABLE hd (
2
no NUMBER,
3
4
hdate DATE
);
SQL> INSERT INTO hd VALUES (1, sysdate);
SQL> SELECT * FROM hd;
SQL> SELECT * FROM hd WHERE hdate = '2021/10/02';
SQL> SELECT no, TO_CHAR(hdate,'YYYY/MM/DD:HH24:MI:SS') FROM hd;
SQL> SELECT * FROM hd
2
WHERE hdate BETWEEN '2021/10/02' AND '2021/10/03';

명령어 설명 
1. 테이블 생성
CREATE TABLE hd (
    no NUMBER,        -- 번호 저장
    hdate DATE        -- 날짜와 시간 저장
);

2. 데이터 입력 (현재 날짜와 시간 입력)
INSERT INTO hd VALUES (1, sysdate);
* 오라클에서 SYSDATE는 오늘이 아니라 지금 이순간(초 단위)을 저장하기 때문에, 날짜만 검색하면 시간이 달라서 안 찾아지는것임 
그래서 시간을 절삭해주는 TRUNC 함수를 써야함
1: no(번호) 의 숫자
sysdate: 날짜와시간

출력예시
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
no (번호) hdate (날짜와 시간)
1 2026/02/09 15:00:00
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

2-1 명령어 수정

INSERT INTO hd VALUES (1, TRUNC(sysdate));


3. 전체 조회 (기본 설정에 따라 시간은 안 보일 수 있음)
SELECT * FROM hd;

4. 특정 날짜 검색 
SELECT * FROM hd WHERE hdate = '2021/10/02'; -- '2021/10/02 00:00:00'인 데이터만 찾으라는 뜻

5. 시간 정보까지 상세 조회
SELECT no, TO_CHAR(hdate,'YYYY/MM/DD:HH24:MI:SS') FROM hd; -- 해석: hdate에 저장된 시, 분, 초까지 문자열로 바꿔서 눈으로 확인함

6. 범위 검색
SELECT * FROM hd
 WHERE hdate BETWEEN '2021/10/02' AND '2021/10/03'; -- 해석: 10월 2일 0시 0분 0초부터 10월 3일 0시 0분 0초 사이의 데이터를 찾음

* 4,5,6 번은 sysdate 로 명령어 입력 시 검색이 안될때 상세 데이터를 찾는 명령어임

 

한눈에 보는 비교 표

구분 명령어 저장되는 값 (예시) 날짜 검색(=) 가능 여부
안 썼을 때 sysdate 2026-02-09 14:30:05 불가능 (시간이 달라서)
썼을 때 TRUNC(sysdate) 2026-02-09 00:00:00 가능 (시간이 0으로 같아서)

 

삭제 테이블 복구 

1. 생성 및 확인: CREATE TABLE test (id NEMBER); 후 SELECT * FROM tab; 으로 확인 
2. 삭제: DROP TABLE test; 실행 (이후 tab 조회시 BIN$ 로 시작하는 쓰레기통 이름만 보임 
3. 휴지통 조회:
출력 설정: COL object_name FORMAT a3, COL original_name a20
* ORIGINAL_NAME (원래 이름:test) OBJECT_NAME (쓰레기통 이름:TESTBIN$j4u5lR7+S+...)
4. 복구: FLASHBACK TABLE test TO BEFORE DROP; 명렁어로 되살리기 
5. 최종 확인: SELECT * FROM tab; 으로 테이블이 돌아왔는지 확인