CKtrace's Devlog
[DB] - SQL의 데이터 정의 기능 본문
What is SQL?
SQL, Structured Query Language는 관계 DB를 위한 표준 질의어로 많이 사용되는 언어이고, 사용자가 처리를 원하는 데이터가 무엇인지만 제시하고 데이터 처리 과정에 대해서는 언급할 필요가 없기에 비절차적 데이터 언어의 특징을 띤다고 할 수 있습니다.
- DML (데이터 조작어) → 테이블에 새 데이터 삽입 OR 저장된 데이터 수정/삭제/검색하는 기능 제공
- DCL (데이터 제어어) → 보안을 위해 데이터에 대한 접근 및 사용 권한을 사용자별로 부여 OR 취소하는 기능
- DDL (데이터 정의어) → 테이블 생성 및 변경/제거하는 기능 제공
혹시나 DB에 대한 지식을 보충하고 싶으신 분들은 제가 작성해둔 DB 관련 글들을 보고 오시면 도움이 될 거라 생각이 듭니다!
이제 SQL을 이용한 데이터 정의문과 데이터 조작문에 대해서 자세히 알아보도록 하겠습니다~!
Data Definition Using SQL - ①
SQL의 데이터 정의 기능은 테이블 생성, 생성된 테이블 구조의 변경, 테이블 제거로 분류할 수 있습니다.
- CREATE TABLE → 테이블 생성
- ALTER TABLE → 테이블 변경
- DROP TABLE → 테이블 제거
CREATE TABLE test_table(
attribute_name data_type [NOT NULL] [DEFAULT default_value]
[PRIMARY KEY (attribute_list)]
[UNIQUE (attribute_list)]
[FOREIGN KEY (attribute_list) REFERENCES table_name(attribute_list)]
[ON DELETE option] [ON UPDATE option]
[CONSTRAINTS name] [CHECK(condition)]
);
테이블을 생성하는 문의 형태는 위와 같습니다.
또한 SQL문은 세미콜론으로 문장 끝을 표시하고 CREATE TABLE과 같은 키워드는 대소문자를 구분하지 않는다는 특징이 있습니다.
이제 테이블을 생성하는 문 안의 코드들의 한 줄, 한 줄에 대해 알아보도록 하겠습니다.
속성 정의
attribute_name data_type [NOT NULL] [DEFAULT default_value]
우선, 각 속성의 특성을 고려해 적절한 데이터 타입을 선택하여 정의합니다. 그 후에 속성의 널 값 허용 여부와 기본 값 필요 여부를 결정하는 방식으로 속성을 정의합니다.
Meaning | Data Type |
정수 | INT, INTEGER |
INT보다는 작은 정수 | SMALLINT |
고정 소수점 실수 x는 소수점 제외한 전체 숫자 길이 y는 소수점 이하 숫자 길이 |
NUMERIC(x, y), DECIMAL(x, y) |
길이가 n인 부동 소수점 실수 | FLOAT(n) |
부동 소수점 실수 | REAL |
최대 길이가 n인 가변 길이의 문자열 | CHAR(n), CHARACTER(n) |
길이가 n으로 고정된 문자열 | VARCHAR(n), CHARACTER VARYING(n) |
시/분/초로 표현되는 시간 | TIME |
연/월/일로 표현되는 날짜 | DATETIME, DATE |
실제 활용 예시
Cust_ID VARCHAR(5) NOT NULL
→ Cust_ID 속성을 길이가 최대 5인 가변 길이의 문자열 데이터로 구성하며, 널 값은 허용하지 않는다는 것입니다.
키의 정의
[PRIMARY KEY (attribute_list)]
테이블을 생성하는 SQL 문에서는 테이블을 정의할 때, 기본키, 대체 키, 외래키 지정이 가능합니다.
- PRIMARY KEY → 기본키 지정 키워드
- UNIQUE → 대체키 지정 키워드
- FOREIGN KEY → 외래키 지정 키워드
PRIMARY KEY 실제 활용 예시
PRIMARY KEY(cust_id)
UNIQUE 실제 활용 예시
UNIQUE(cust_nickname)
FOREIGN KEY를 정의하는 방법은 조금 더 복잡합니다.
왜냐하면 참조 무결성 제약 조건을 유지하기 위해 REFERENCES 키워드를 이용해 외래키가 어떤 테이블의 무슨 속성을 참조하는지 제시해야 하고, 참조되는 테이블에서 튜플을 삭제하거나 변경할 때 처리하는 방법을 다양하게 선택할 수 있기 때문입니다.
FOREIGN KEY 키워드로 외래키를 지정할 때 참조되는 테이블에서 튜플을 삭제하거나 변경하는 방법을 각각 4가지가 존재합니다.
형태는 비슷하니 사용하는데 큰 어려움은 없을 것입니다!
먼저 외래키를 지정할 때 참조되는 테이블에서 튜플을 삭제하는 네 가지 방법입니다.
참조되는 테이블에서 튜플을 삭제하는 방법
1) ON DELETE NO ACTION : 튜플을 삭제 불가능하게 설정
2) ON DELETE CASCADE : 관련 튜플을 함께 삭제
3) ON DELETE SET NULL : 관련 튜플의 외래키 값을 NULL 값으로 변경
4) ON DELETE SET DEFAULT : 관련 튜플의 외래키 값을 미리 지정한 기본 값으로 변경
다음으로는 외래키를 지정할 때 참조되는 테이블에서 튜플을 변경하는 네 가지 방법입니다.
참조되는 테이블에서 튜플을 변경하는 방법
1) ON UPDATE NO ACTION : 튜플을 변경 불가능하게 설정
2) ON UPDATE CASCADE : 관련 튜플에서 외래키 값을 함께 변경
3) ON UPDATE SET NULL : 관련 튜플의 외래키 값을 NULL 값으로 변경
4) ON UPDATE SET DEFAULT : 관련 튜플의 외래키 값을 미리 지정한 기본 값으로 변경
위의 8가지 방법 중 어느 하나로도 별도로 지정하지 않으면 ON DELETE NO ACTION이 기본으로 선택된다는 점 유의해주세요!
FOREIGN KEY 실제 활용 예시 ①
-- 삭제나 변경 관련 지정 X
FOREIGN KEY(소속팀) REFERENCES 소속국가(팀 번호)
FOREIGN KEY 실제 활용 예시 ②
-- 삭제나 변경 관련 지정 O
FOREIGN KEY(소속팀) REFERENCES 소속국가(팀 번호) ON DELETE CASCADE ON UPDATE CASCADE
이제 테이블을 만드는 방법들에 대해 자세히 알아보았으니 테이블 생성 예시들을 확인해보며 함께 알아보았던 내용들을 다져볼 수 있도록 하겠습니다!
Table 생성 예시
CREATE TABLE 제품(
제품_아이디 CHAR(10),
제품명 VARCHAR(15),
가격 INT,
제조국가 VARCHAR(15),
PRIMARY KEY(제품_아이디),
FOREIGN KEY(제품명) REFERENCES 제조회사(출시_제품명)
);
다음으로는 테이블 생성이 아닌 변경하는 방법과 테이블을 삭제하는 방법들에 대해 배워보도록 하겠습니다.
테이블을 변경하는 여러 가지 방법에는 아래와 같은 것들이 있습니다.
- 새로운 속성 추가
- 기존 속성 삭제
- 새로운 제약조건 추가
- 기존 제약조건 삭제
테이블을 삭제할 때는 DROP TABLE 명령어로 삭제를 하게 됩니다.
Data Definition Using SQL - ②
테이블 변경
① 새로운 속성 추가
ALTER TABLE table_name
ADD attribute_name data_type [NOT NULL] [DEFAULT default_value];
활용 예시
ALTER TABLE 제품 ADD 제품출시날짜 DATE;
② 기존 속성 삭제
ALTER TABLE table_name DROP COLUMN attribute_name;
활용 예시
ALTER TABLE 제품 DROP COLUMN 제품출시날짜;
③ 새로운 제약조건 추가
ALTER TABLE table_name ADD CONSTRAINT constraint_name constraint_content;
활용 예시
ALTER TABLE 제품 ADD CONSTRAINT CHK_DATE CHECK(제품출시날짜 >= 2022);
④ 기존 제약조건 삭제
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
활용 예시
ALTER TABLE 제품 DROP CONSTRAINT CHK_DATE;
테이블 삭제
DROP TABLE table_name;
활용 예시
DROP TABLE 제품;
단, 주의할 점은 다른 테이블이 삭제하려는 테이블을 참조하고 있는 경우 삭제가 수행되지 않는다는 점입니다!
이상으로 SQL의 데이터 정의 기능에 대한 글을 마치도록 하겠습니다.
다음에는 더 좋은 글로 찾아뵙도록 하겠습니다!
감사합니다.
'DB' 카테고리의 다른 글
[DB] - 뷰 (0) | 2022.06.27 |
---|---|
[DB] - SQL의 데이터 조작 기능 (0) | 2022.06.27 |
[DB] - 관계 데이터 연산 (0) | 2022.06.23 |
[DB] - 논리적 데이터 모델 / 관계 데이터 모델 (0) | 2022.06.23 |
[DB] - ERD (0) | 2022.06.22 |