CREATE SCHEMA `study1`;
스키마 study1 을 만들어준다 .
↓ 스키마 이름 ↓ 테이블 이름
CREATE TABLE `study1`.`table1`();
테이블 이름은 복수형으로 짖는다.
테이블을 만들 때 ( );안에 안에 것을 같이 써줘야한다.
age는 숫자이니 숫자타입으로 명시해줘야한다.
타입을 명시할 때는 열의 타입에 대해서 적어줘야 하는데 그 전에 데이터타입에 대해서 알고 있어야 한다.
부호가 없는 정수는 뒤에 UNSIGNED를 붙인다.
: 1 byte, -128 ~ 127
- TINYINT UNSIGNED : 1byte, 0 ~ 255 (부호 없으니 255까지 적을 수 있다.)
: 2 Bytes, -32768 ~ 32767, 부호 없을 시 0 ~ 65536
: 3 Bytes, -8388608 ~ 8388607, 부호 없을 시 0 ~ 16777215
: 4 Bytes, -2147483648 ~ 2147483647, 부호 없을 시 0 ~ 4294967295
: 8 Bytes,
92233720036854775808 ~ 92233720036854775807 (992경),
부호 없을 시 0~18446744073709551615 (1844경)
타입 뒤에 (n)을 붙여 자리수 제한 가능. 가령 TINYINT(1)은 -9~9까지 표현 가능
용량이 크면 클 수록 데이터가 느려진다. (하드의 용량을 차지한다.)
속도면에서는 BIGINT가 유리하다.
4byte = 32bit
8byte = 64bit
-> CPU가 한번에 데이터를 처리하는 단위이다.
: 8 Bytes, 1.7976931348623157E+308 ~ 1.7976931348623157E+308
- 특성상 연산 오류가 발생하여 소숫점 뒷자리가 버려지거나 연산상 오류가 발생할 수 있음
- float(4byte)도 존재하는데 오류가 심각해서 크게 사용하지 않는다.
특유의 계산방법때문에 연산 오류가 발생하게 된다.
BIGINT가 8byte이고 DOUBLE도 8byte인데 DOUBLE이 범위가 훨씬 크다. 그렇기에 오류가 발생하기도 해서 논리적으로 계산이 필요할 때 DOUBLE과 FLOAT를 사용하지 않는다.
: ( a + 1 ) Bytes, a는 전체 자리 길이, b는 소수점 자리 길이
- 정수 한 자리, 소숫점 두 자리를 원한다면, DECIMAL(3,2)가 맞음.
- 용량이 큰 대신, FLOAT이나 DOUBLE이 가지는 한계인 연산 오류가 없음.
- 가령, DECIMAL(5, 2) 는 -999.99 부터 999.99이다.
- UNSIGNED 된다.
: 3 Bytes, 년 / 월 / 일
: 3 Bytes, 시 / 분 / 초
: 8 Bytes, 년 / 월 / 일 시 : 분 : 초
- 0000-01-01 00:00:00 ~ 0000-12-31 23:59:59
- (n) 부여시 n자리 만큼 소숫점도 가진다.
- 가령 DATATIME(3)은 000-00-00 00:00:00'000 형식
TIME 타입과 DATETIME 타입은 뒤에 (n)을 붙여 밀리초를 포함할 수 있다.
가령 DATETIME(3) 타입은 yyyy-MM-dd HH:mm:ss'SSS
까지 표현할 수 있다.
: 4Bytes, 년 / 월 / 일 시 : 분 : 초
- 1970-01-01 00:00:00 ~ 2038-01-19 03:14:07
- UNIX 시간을 가진다.
- UNIX 시간 저장 : 1970년 1월 1일 0시 0분 0초 부터 지금 까지 지난 시간 초로 나타낸 값.
- UNIX 시간이 2147483647을 넘으면 오버플로우(overflow)가 발생해 0으로 돌아간다. 이 일시가 2030-01-19 03:14:07이고 이런 문제를 2038문제라고 한다.
- 시스템 시간이 변경될 때 함께 변경된다.
: 1 Bytes, 년
=> TIMSTAMP는 UNIX 시간으로 돌아간다.
TIMESTAMP를 사용하는 이유
< example >
dt1
DATATIME 2000-01-01 00:00:00
dt2
TIMESTAMP 2001-01-01 00:00:00 가 있다고 하자.
내가 시스템에서 현재 시간을 밀면 TIMESTAMP 은 그만큼 같이 밀린다.
- '2038년 문제' 검색 해보기.Year 2038 Problem
: 1Byte, 참(Ture) / 거짓(False) 값만 가진다.
- 실제로는 TINYINT(1)로 작동하며 0은 거짓, 1은 참으로 작동함.
: 2n Bytes, 최대 65535 Bytes, n개의 문자를 담는다.
- 한 테이블 내에 존재하는 모든 VARCHAR 길이의 합이 65535를 초과하면 안된다.
- 바이트 단위가 아니다. 글자수 단위로 사용한다.
ex > VARCHAR(10) : 언어 구분 없이 10자- 빈 공간을 차지하지 않는다.
: n Bytes, 최대 65535 Bytes, 이때 n은 최대 255.
: n Bytes, 최대 65535 Bytes, 문자를 담는다.
: n Bytes, 최대 16777125 Bytes, 문자를 담는다.
: n Bytes, 최대 4292967295 Bytes, 문자를 담는다.
< example >
t1
VARCHAR(65535) 'a'
=> 1Byte만 사용한다.
t1
TEXT(65535) 'a'
=> 65535Byte 다 사용한다.
모든 VARCHAR의 합이 65535를 초과할 때는 VARCHAR를 사용하지 못하기 경우도 생기기 때문이다.
:업로드 한 데이터를 데이블에 담고자 할 때 사용. ( 첨부파일, 사용자 프로필 사진 등 )
65535 Bytes = 거의 60KB
: n Bytes, 최대 255 Bytes, 이진(Binary) 데이터를 담는다.
: n Bytes, 최대 65536 Bytes, 이진(Binary) 데이터를 담는다.
: n Bytes, 최대 16777215 Bytes, 이진(Binary) 데이터를 담는다.
: n Bytes, 최대 4294967295 Bytes, 이진(Binary) 데이터를 담는다.
: 해당 열 값이 비어있을 수 없음을 의미
: 해당 열 값이 명시되지 않은 경우
- (NOT NULL 여부와 무관하게) 기본 값으로 x 사용
: 해당 열 값에 대해 명시되지 않은 경우 1부터 시작하여 자동 증가한 값을 사용
- 해당 열이 기본키(Primary Key)일 때에만 작동
타입을 이렇게 사용 할 수 있다!
↓ 스키마 이름 ↓ 테이블 이름(복수형)
CREATE TABLE `study1`.`table1` (
↓ 열 이름
`age` TINYINT UNSIGNED NOT NULL DEFAULT 1,
↑ 타입 ↑ 속성
`name` VARCHAR(5)
);