[SQL] DDL (Data Definition Language)
아래의 명령어들은 모두
Oracle의 SQL 명령어이다. (SQL Server 명령어의 경우 따로 표시)
👑 자료형
SQL에서 자료형은 벤더별로 다양한 형태를 보인다. 예를 들어 숫자타입의 경우 ANSO/ISO 기준에서
NUMERIC Type의 하위 개념으로 NUMERIC, DECIMAL, SMALLINT, INTEGER, INT 등 수많은
타입을 제공하는 반면, Oracle 은 숫자형 타입에 대해 NUMBER 한 가지만 제공한다.
즉, 벤더별로 꽤 많은 차이를 보이므로, 사용하는 DBMS 마다의 차이가 있다는 것을 인지해야 한다.
-
가변 길이인
VARCHAR의 경우 정의한 길이(s)와 실제 데이터 길이에 차이가 있는 경우 적합함. -
CHAR에서는 공백을 채워 비교하며,VARCHAR에서는 공백도 하나의 문자로 취급한다.e.g. CHAR : 'HELLO' = 'HELLO ' VARCHAR : 'HELLO' ≠ 'HELLO ' -
데이터들이 고정된 길이의 문자열을 가지지 않는다면
VARCHAR를 사용하는 것이 바람직하다.
👑 DDL (Data Definition Language)
테이블을 생성하고 테이블의 구조를 변경하는 명령어로 생성(CREATE), 수정(ALTER)
삭제(DROP), 이름 변경(RENAME) 등의 명령어들이 존재한다.
👑 CREATE TABLE
다음과 같은 구문을 통해 테이블을 생성할 수 있다.
CREATE TABLE TABLENAME (
ColumnName DataType [DEFAULT 형식],
ColumnName DataType [DEFAULT 형식],
ColumnName DataType [DEFAULT 형식]
);
테이블 생성 시에는 몇 가지 규칙들을 지켜야 한다.
-
테이블 이름은 다른 테이블 이름과 중복되면 안된다.
-
한 테이블 내에서 칼럼명은 중복될 수 없다.
-
각 칼럼들은
,로 구분되며, 테이블 생성문의 끝은;로 끝난다.
(마지막 칼럼은,를 사용하지 않는다.) -
칼럼의 자료형을 꼭 지정해야만 하며, 테이블명과 칼럼명은 문자로 시작해야 한다.
-
A-Z,a-z,0-9,_,$,#문자만 사용할 수 있다. -
한 테이블의 칼럼명은 다른 테이블의 칼럼명과는 같을 수 있다.
(외래 키 관계) -
일반적으로 테이블명과 칼럼명은 대/소문자 구분을 하지 않는다.
-
칼럼에 대한 제약조건은
CONSTRAINT를 사용하여 추가한다.제약조건은 칼럼 LEVEL 방식과 테이블 LEVEL 정의 방식이 있으며, 하나의 SQL 문장 내에서 혼용이 가능하다. (기능 또한 같음)
💡 CREATE TABLE 예시
다음은 Oracle 에서의 CREATE TABLE 구문이다.
TEAM 테이블은 5개의 COLUMN 을 가지며, 기본키는 TEAM_ID 이고, 외래키는 STADIUM_ID 이다.
CREATE TABLE TEAM (
TEAM_ID CHAR(3) NOT NULL, -- 데이터 유형 뒤에 정의한 칼럼 LEVEL 방식
TEAM_NAME VARCHAR2(30) NOT NULL,
REGION_NAME VARCHAR2(30) NOT NULL,
STADIUM_ID CHAR(3) NOT NULL,
FOUNDED_YEAR CHAR(4),
-- 테이블 생성 마지막에 모든 제약조건을 기술하는 테이블 LEVEL 정의 방식
CONSTRAINT TEAM_PK PRIMARY KEY (TEAM_ID),
CONSTRAINT TEAM_FK FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID)
);
💡 제약조건 (Constraint)
제약조건이란 데이터의 무결성을 유지하기 위해 특정 칼럼에 설정하는 제약이다.
테이블 생성 시에 적절한 제약조건을 기술하여 적절하게 정보를 관리해야 한다.
제약 조건의 종류
-
PRIMARY KEY
-
테이블에 저장된 튜플을 식별하기 위한 기본키이다.
-
하나의 테이블에는 하나의 기본키 제약만 정의 가능하다.
-
PRIMARY KEY로 정의한 경우DBMS가 자동으로UNIQUE 인덱스를 생성하여
기본키 칼럼에는NULL을 입력할 수 없게 된다. -
PRIMARY KEY=UNIQUE KEY+NOT NULL
-
-
UNIQUE KEY
-
테이블에 저장된 튜플을 식별하기 위한 고유키를 정의한다.
-
기본키와 달리
NULL값을 허용한다. -
테이블 당 여러 개의 고유키를 정의할 수 있다.
-
-
NOT NULL
NULL값의 입력을 금지한다. 즉, 값의 입력이 필수이다.
-
CHECK
-
입력할 수 있는 값의 범위를 제한한다.
-
TRUE or FALSE로 평가할 수 있는 논리식을 지정한다.
-
-
FOREIGN KEY
-
테이블 간 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사한다.
-
참조 무결성 제약 옵션을 선택할 수 있다.
-
💡 테이블 구조 확인
테이블 생성 후 테이블이 정상적으로 만들어졌는지 확인해야 한다.
Oracle 의 경우 DESCRIBE 를 통해 테이블의 정보를 확인할 수 있다.
DESCRIBE TEAM;
👑 ALTER TABLE
테이블을 사용하는 도중 요구 사항 등으로 인해 테이블 구조를 변경해야 할 상황이
발생할 수도 있다. 따라서 칼럼을 추가/삭제하거나, 제약조건을 추가/삭제하는
작업이 필요하게 되며, ALTER 를 통해 이를 해결할 수 있다.
💡 ADD COLUMN
-
테이블에 칼럼을 추가하는 명령어로는
ADD를 사용한다. -
추가된 칼럼은 테이블의 마지막에 추가되며, 추가될 위치를 지정할 수는 없다.
ALTER TABLE 테이블명
ADD 추가 칼럼명 자료형;
💡 DROP COLUMN
-
테이블에서 칼럼을 삭제하는 명령어로는
DROP을 사용한다. -
데이터의 유무에 상관없이 삭제가 가능하며, 한 번에 하나의 칼럼만 삭제 가능하다.
-
또한 칼럼 삭제 후에 최소 하나의 칼럼은 테이블에 남아 있어야 한다.
-
삭제된 칼럼의 복구는 불가능하다.
ALTER TABLE 테이블명
DROP COLUMN 삭제할 칼럼명;
💡 MODIFY COLUMN
-
칼럼의 자료형, 디폴트 값,
NOT NULL제약조건에 대한 변경을 할 수 있다. -
칼럼의 크기는 줄일 수는 없고, 늘릴 수는 있다.
-
하지만, 칼럼이
NULL값만 가지고 있거나 튜플이 아무것도 없다면, 칼럼의 크기를 줄일 수 있다. -
칼럼에
NULL값이 없을 경우에만NOT NULL제약조건을 추가할 수 있다.
ALTER TABLE 테이블명
MODIFY (칼럼명1 자료형 [DEFAULT] [NOT NULL],
칼럼명2 자료형 ...);
💡 RENAME COLUMN
- 칼럼명을 변경할 수 있는
RENAME구문이다.
ALTER TABLE 테이블명
RENAME COLUMN 변경 할 칼럼명 TO 새 칼럼명;
💡 DROP CONSTRAINT
- 테이블 생성 시에 부여했던 제약조건을 삭제하는 명령어이다.
ALTER TABLE 테이블명
DROP CONSTRAINT 제약조건명;
-- e.g.
ALTER TABLE TEAM
DROP CONSTRAINT TEAM_FK;
💡 ADD CONSTRAINT
- 테이블 생성 이후에 제약조건을 추가할 수 있는 명령어이다.
ALTER TABLE 테이블명
ADD CONSTRAINT 제약조건명 제약조건 (칼럼명);
-- e.g.
ALTER TABLE TEAM
ADD CONSTRAINT TEAM_FK
FOREIGN KEY (STADIUM_ID) REFERENCES STADIUM(STADIUM_ID);
👑 RENAME TABLE
- 테이블명을 변경하려면
RENAME명령어를 사용해야 한다.
RENAME 변경 할 테이블명 TO 새 테이블명;
👑 DROP TABLE
-
테이블을 삭제하려면
DROP TABLE을 사용한다. -
CASCADE CONSTRAINT옵션은 해당 테이블과의 관계에 대해서도 삭제한다는 의미이다.
(SQL Server에서는CASCADE옵션 존재 X → 테이블 삭제 이전에 제약 조건부터 삭제해야 함)
DROP TABLE 테이블명 [CASCADE CONSTRAINT];
👑 TRUNCATE TABLE
-
테이블 자체를 삭제하는 것이 아닌, 모든 튜플들을 제거하고, 저장 공간을 재사용 할 수 있도록 해제한다.
-
테이블을 완전히 삭제하려면
DROP TABLE을 사용한다. -
TRUNCATE는DML로 분류할 수도 있지만DDL로 분류하기도 한다. -
테이블에 있는 데이터를 삭제하는 다른 명령어로
DELETE가 있다. -
하지만, 둘은 처리 방식 자체가 다르고, 테이블의 전체 데이터를 삭제하는 경우 시스템 부하가 적은
TRUNCATE를 사용하는 것이 권고된다.
TRUNCATE TABLE 테이블명;
Leave a comment