✏️ 개프로 불공단 체험을 통해 학습한 기록을 작성하고 있습니다.
테이블을 만들 때 컬럼(열) 이름과 그 데이터 타입(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를 설정하면 지정한 다른 테이블의 컬럼에 존재하는 값만 저장할 수 있다.
- 다른 테이블의 컬럼과 연결시키고 싶은 컬럼으로 설정한다.