✏️ 개프로 불공단 체험을 통해 학습한 기록을 작성하고 있습니다.
테이블을 만들 때 컬럼(열) 이름과 그 데이터 타입(Type)을 지정한다.
테이블의 각 컬럼에는 반드시 데이터 타입을 정해 둘 필요가 있다.
데이터 타입을 지정함으로써 해당 컬럼에 저장할 값의 포맷(Format)을 갖출 수 있고 값을 어떻게 취급할 것인지 결정해 둘 수 있다.
대체로 크게 분류해보자면,
- 숫자를 다루는 형태
- 문자열을 다루는 형태
- 날짜, 시간을 다루는 형태
예를 들어 금액을 저장하는 컬럼에 정수 타입을 지정한다면, 그 컬럼에는 반드시 정수 데이터밖에 저장할 수 없고 소수점 데이터나 문자 데이터를 저장할 수 없게 된다.
정수 타입으로 지정해 둠으로써 저장되어 있는 값을 숫자로 조회할 수 있음
타입에 따라 값을 취급하는 방법도 달라진다.
저장할 수 있는 값이 제한되고 취득할 때 취급하는 방법이 달라지기 때문에, 컬럼에 따라 적절한 데이터 타입을 지정해 두는 것이 필요하다.
실수로 숫자 이외의 문자열 등의 값이 저장되는 일은 발생되지 않는다.
- DECIMAL : 오차가 없는 정확한 소수를 저장할 수 있다.
- FLOAT : 소수 7자리 정도까지 정확한 소수를 저장할 수 있다.
- DOUBLE : 소수 15자리 정도까지 정확한 소수를 저장할 수 있다.
저장되는 값의 크기에 따라 적절한 데이터 타입을 선택하는 것이 좋다.
숫자 타입에 저장한 123과 문자열 '123'과는 다르다.'ABC'라는 값을 저장한다고 예시,
- CHAR : 지정된 길이가 되도록 오른쪽이 스페이스로 채워지고 일정한 길이로 데이터가 저장된다.
- VARCHAR : 그러한 것이 없다.
ex) 상품의 구입일자, 사용자의 로그인 일시, 생일, 스케줄 일시, 레코드의 입력일/갱신일 등
000일 이전, 000월 000일 이후 등 검색 조건 지정 가능
order by 를 사용하여 날짜순으로 레코드 정렬 가능
날짜만을 저장할 수 있는 것, 시간만을 저장할 수 있는 것, 날짜와 시간을 모두 저장할 수 있는 것| 구분 | 용도 |
|---|---|
| DATE | 날짜 |
| DATETIME | 날짜와 시간 |
| TIME | 시간 |
| YEAR | 년도 |
BOOLEAN : 데이터 타입 중에는 2종류의 값밖에는 취급할 수 없는 것도 있다.
참(TRUE)와 거짓(FALSE) 두 종류 뿐!
ex) 태스크 완료/미완료 , 이용중인 사용자/해약한 사용자, 미지불/지불 완료
ex) PostgreSQL 같은 경우에는 사전에 boolean 타입이 준비되어 있는데, MySQL에서는 없다.
그대신에 내부적으로는 TINYINT 타입을 사용해 BOOLEAN 타입과 같은 동작을 구현하고 있다.
테이블의 컬럼에 제약을 걸어서 저장할 수 있는 데이터에 제한을 두거나,
속성을 붙여 어떤 규칙으로 다듬어서 저장할 수 있다.
ex) NOT NULL, AUTO_INCREMENT 속성 등
- 데이터 입력 및 변경 시 컬럼의 제약에 위배되는 경우, 오류가 나서 처리가 되지 않는다.
적절한 제약을 걸어두면 불법적인 데이터가 입력되는 것을 막고, 데이터의 일관성이 깨지는 것을 대부분 막을 수 있다.
속성을 붙여서 일정한 룰(Rule)에 의해 데이터를 갖추어 둠으로써 데이터를 관리하기 쉬워지는 장점도 있다.
반드시 어떤 값이라도 들어가 있어야 한다. 컬럼 값을 중복시키지 않는 제약이다. 기본(default)값이 저장된다.컬럼에 자동으로 순번을 넣는 속성이다. ex) 상품 테이블의 재고 수 컬럼의 초깃값을 0으로 설정하는 경우,
- 사용자가 가지고 있는 쇼핑 포인트 입력 시 0
- 상품의 결제 상태를 미리 미지불 상태 0
CREATE TABLE 테이블명 (
name(컬럼값) VARCHAR(100), age(컬럼값) INTDEFAULT 10
);
NULL(널) : 아무것도 없다
원래 아무것도 들어 있지 않기 때문에 0 이나 ''(빈 문자열)과도 구별된다.
숫자도, 문자도 아니다.
또한 테이블의 컬럼에 초깃값이 설정되어 있지 않은 경우 초깃값은 NULL
NULL 함으로써 그 필드에는 아무것도 저장되어 있지 않다는 것을 명시적으로 나타낼 수 있다.
INSERT INTO 테이블명 age(컬럼명) VALUES ('홍길동');
-> 값을 지정하지 않은 age 필드는 null이 된다.
WEHERE age IS NULL과 같은 조건으로 조회하면 값이 null인 레코드의 검색이 가능하다. 데이터가 비어있는 상태를 방지한다.
컬럼에 NULL을 저장하지 못하도록 할 수 있다.
NOT NULL 제약이 걸린 컬럼은 반드시 어떤 값을 저장해야만 하는 컬럼으로 설정된다.
- DBMS에 따라서는 NOT NULL 제약이 붙어있는 컬럼에 아무런 값을 지정하지 않은 경우, 초깃값으로 NULL 이외의 값이 저장으로 사양으로 되어있는 것도 있다.
- 예를 들어 MySQL 에서는 숫자 타입 컬럼일 때는
0이 초깃값으로 자동 저장된다.
CREATE TABLE 테이블명(
name(컬럼명) VARCHAR(100),
age INTNOT NULL);
컬럼에 다른 레코드와 중복된 값을 저장하지 않도록 할 수 있다.
만약 UNIQUE 제약이 설정된 컬럼에 중복된 값을 저장하려 하면,
에러가 발생하여 입력할 수 없다.
ex) 상품코드나 사용자id 같이,
반드시 같은 값이 존재하지 않는 컬럼에 설정해두는 것
CREATE TABLE users(테이블명)(
id(컬럼명) INTUNIQUE,
name(컬럼명) VARCHAR(100)
);
컬럼에 자동적으로 연속된 번호를 저장할 수 있다.
예를 들어,
- 처음 레코드를 입력할 때 AUTO_INCREMENT를 설정한 컬럼에는 자동으로 1이 저장된다.
- 새로운 레코드를 입력하면 2가 저장되어 레코드를 입력할 때마다 1,2,3,4, ... 처럼 연속된 번호가 자동적으로 저장된다.
자동으로 각 레코드에 번호가 할당되므로 이런 것을 상품 또는 사용자를 식별하기 위한 번호로 취급하는데 도움이 된다.
CREATE TABLE users(테이블명) (
id(컬럼명) INT UNIQUE AUTO_INCREMENT,
name VARCHAR(100)
);

PRIMARY KEY를 설정한 컬럼의 값만 알게 되면,
한 개의 레코드를 알아낼 수 있기 때문에각 레코드를 식별하기 위한 컬럼으로 설정하면 좋다.
프라이머리 키, 주 키라고도 불린다. 
CREATE TABLE users(
id INT PRIMARY KEY,
name VARCHAR(100)
);

FOREIGN KEY(외부 키)를 설정하면 해당 컬럼에는 지정한 다른 테이블의 컬럼에 존재하는 값만 저장할 수 있게 된다. 다른 테이블의 값에 의존하는 컬럼을 만들어 테이블끼리 연결시킬 수 있다.
- 이렇게 설계하면, 테이블 결합을 통해 데이터를 추출하는 명령어가 가능하게 된다.

CREATE TABLE users(
name VARCHAR(100),
department_id INT,
FOREIGN KEY (department_id)
REFERENCE departments(id)
);
- 컬럼에 FOREIGN KEY를 설정하면 지정한 다른 테이블의 컬럼에 존재하는 값만 저장할 수 있다.
- 다른 테이블의 컬럼과 연결시키고 싶은 컬럼으로 설정한다.