/*
<테이블 및 열>
<테이블>
◎ 테이블(Table)은 실제 레코드(Record)를 담기 위해 사용된다.
◎ 테이블은 반드시 스키마에 종속되어있어야한다.
◎ 명명법 : 복수형 스네이크 케이스
[만들기]
- 테이블을 만들기 위해 아래와 같이 명령할 수 있다.
CREATE TABLE `소속 스키마 이름`.`테이블 이름` (
[열 구조,...],
[제약 조건 구조,...]
);
이미 존재하는 테이블일 경우 오류를 발생시키지 않게하기 위해 아래와 같이 명령한다.
CREATE TABLE IF NOT EXISTS `소속 스키마 이름`.`테이블 이름`(
[열 구조,...]
);
[테이블 조회하기]
- 어떠한 스키마에 종속된 테이블의 목록을 조회하기 위해 아래와 같이 명령할수 있다.
SHOW TABLES IN `스키마 이름`;
[테이블 구조 조회하기]
- 어떠한 테이블의 구조(열 구조)를 조회하기 위해 아래와 같이 명령할수 있다.
DESC `스키마 이름`.`테이블 이름`;
[테이블 수정하기]
- 테이블 수정과 관련된 쿼리는 콤마를 이용하여 여려 명령을 담을 수 있다. 가령 a 열을 추가하고 b 열을 삭제하는 쿼리를
아래와 같이 작성할 수 있다.
ALTER TABLE `some_schema`.`some_table`
ADD COLUMN `a` INT,
DROP COLUMN `b`;
<테이블 소속 스키마 및 이름 변경하기>
- 스키마와 달이 테이블의 이름을 변경할 수 있다.
- 혹은 테이블이 소속된 스키마를 변경할 수 있다.
ALTER TABLE `소속 스키마`.`대상 테이블` RENAME `새로운 소속 스키마`.`새로운 테이블 이름`;
<열 추가하기>
- 이미 존재하는 테이블에 열을 추가하기 위해 아래와 같이 명령한다.
ALTER TABLE `소속 스키마`.`테이블` ADD COLUMN [열 구조];
먄약 추가하는 열의 위치를 지정하고자 한다면 아래와 같이 명령한다. 위치를 명시하지 않을 경우 가장 마지막
자리에 만들어진다.
ALTER TABLE `소속 스키마`.`테이블` ADD COLUMN [열 구조] AFTER `기준 열`;
위 명령에서 새로운 열은 `기준 열` 뒤에 만들어 진다. 만약 열을 가장 앞에 만들고 싶다면 아래와 같이
FIRST 키워드를 사용한다.
ALTER TABLE `소속 스키마`.`테이블` ADD COLUMN [열 구조] FIRST;
BEFORE 키워드가 없음에 유의한다.
<열 삭제하기>
- 이미 존재하는 테이블에서 열을 삭제하기 위해 아래와 같이 명령한다.
ALTER TABLE `소속 스키마`.`테이블` DROP COLUMN `열 이름`;
<열 타입 수정하기>
- 이미 존재하는 열타입을 변경하기 위해 아래와 같이 명시한다.
ALTER TABLE `소속 스키마`.`테이블` MODIFY COLUMN `대상 열` [이름을 제외한 열 구조];
열의 순서를 변경하기 위해 아래 명령어를 이용할 수도 있다.
#기준열 뒤에 만들겠다
ALTER TABLE `소속 스키마`.`테이블` MODIFY COLUMN `대상 열` [이름을 제외한 열 구조] AFTER `기준 열`;
#순서를 가장 위에 두겠다.
ALTER TABLE `소속 스키마`.`테이블` MODIFY COLUMN `대상 열` [이름을 제외한 열 구조] FIRST;
<열 이름 및 타입 수정하기>
- 이미 존재하는 테이블의 열이름 및 타입을 변경하기 위해 아래와 같이 명령한다.
#열 이름 수정
ALTER TABLE `소속 스키마`.`테이블` CHANGE COLUMN `대상 열` `새로운 이름` [이름을 제외한 열 구조];
<열 이름 수정하기>
- 이미 존재하는 테이블의 열 이름을 변경하기 위해 아래와 같이 명령한다.
ALTER TABLE `소속 스키마`.`테이블` RENAME COLUMN `대상 열` TO [이름을 제외한 열 구조];
[테이블 삭제하기]
- 이미 존재하는 테이블을 삭제하기 위해 아래와 같이 명령한다.
DROP TABLE `소속 스키마 이름`.`테이블 이름`;
마찬가지로 테이블이 없을 경우 오류를 발생시키지 않게하기 위해 아래와 같이 추가할수 있다.
DROP TABLE IF EXISTS `소속 스키마 이름`.`테이블 이름`;
<열>
◎ 테이블에 삽입(Insert)될 레코드가 가지는 각 데이터의 타입 및 개수(구조)를 제한하기 위해 사용한다.
◎ 모든 테이블은 반드시 한 개 이상의 열(Column)을 가지고 있어야 한다.
◎ 명명법 : 단수형 스네이크 케이스
◎ 열 구조는 아래와 같이 명시할 수 있다.
`열 이름` [데이터 타입][NULL|NOT NULL]? [DEFAULT [기본 값]]? [AUTO_INCREMENT]?
- NULL
: 해당 열의 값이 NULL 일수 있다는 의미(기본 값)
- NOT NULL
: 해당 열의 값이 NULL 일수 없다는 의미
- DEFAULT
: 해당 열에 대해 값이 명시되지 않았을 떄 NULL 대신 사용할 기본 값을 명시
별도로 명시하지 않으면 DEFAULT NULL 이 생략된 것이라고 본다.
- AUTO_INCREMENT
: 해당 열이 숫자형이고 기본 키(Primary Key) 일때 삽입(Insert)시 값이 누락된 경우
1 (혹은 테이블이 기억하고 있는 최종 인덱스 값 + 1) 부터 시작하여 자동 증감 시키는
일종의 순번(완전한 순번은 아님) 열로 이용하겠다는 의미이다.
[데이터 타입]
- 어떠한 열이 가질 수 있는 데이터의 타입을 의미한다.
- 데이터 형, 자료 형, 자료 타입 등의 이름을 가진다.
- 정수형
-> TINYINT(n)
: -128 부터 127 까지의 정수를 가질수 있다. 이떄 n 은 자리수 제한이고 생략시 3이 사용된다.
ex) `age` TINYINT(2) : 2자리 이용가능
-> TINYINT(n) UNSIGNED
: 0부터 255까지의 정수를 가질 수 있다. 이때 n 은 자리수 제한이고 생략시 3이 이용된다.
ex) `age` TINYINT(n) UNSIGNED
-> SMALLINT(n)
: -32,768 부터 32,767 까지의 정수를 가질수 있다. 이때, n 은 자리수 제한이고 생략시 5가 사용된다.
-> MEDIUMINT(n)
: -8,388,608 부터 8,388,607 까지의 정수를 가질수 있다.
-> INT(n)
: -2,147,483,648 부터 2,147,483,647 까지의 정수를 가질 수 있다.
-> BIGINT(n)
: -9,223,372,036,854,775,808 부터 9,223,372,036,854,775,807 까지의 정수를 가질수 있다.
=> 위 정수형에서 n 은 길이 제한이고, 이를 생략할 경우 가질 수 있는 최대 길이를 사용한다.
=> 위 정수형 뒤에 UNSIGNED 를 붙이면 (가령 TINYINT UNSIGNED) 부호를 사용하지 않는 대신 음수(0미만)
에 해당하는 값 크기만큼 양수에서 추가로 이용할 수 있게 된다.
가령, TINYINT UNSIGNED 의 범위는 0 부터 255 까지 이다.
- 실수형
-> FLOAT(t, p)
: 부동소수인 실수 데이터를 담는다. -3.402823466E+38 부터 3.402823466E+38 까지를 담는다
자바와 동일하게 메모리에서 데이터를 담는 방식 때문에 소수점 끝자리 일부가손실될 수 있음으로 정밀한 데이터를
담아야하는 경우 사용하지 않는다. t 는 전체길이를, p 는 소수점 길이를제한하기 위해 사용한다.
t 및 p 를 생략할 경우 부동소수로, 생략하지 않을 경우 고정소수로 이용할수 있다.
-> DOUBLE(t, p)
: 부동소수인 실수 데이터를 담는다. -1.79769313486231517E 부터 1.797693134862315E 까지를 담는다
자바와 동일하게 메모리에서 데이터를 담는 방식 때문에 소수점 끝자리 일부가손실될 수 있음으로 정밀한 데이터를
담아야하는 경우 사용하지 않는다. t 는 전체길이를, p 는 소수점 길이를제한하기 위해 사용한다.
t 및 p 를 생략할 경우 부동소수로, 생략하지 않을 경우 고정소수로 이용할수 있다.
-> DECIMAL(t, p)
: 고정소수인 실수 데이터를 담는다. 데이터 손실이 없는 대신 용량인 t(전체길이) + 1 바이트로 매우 크다.
t 및 p 값을 생략할수 없다.
- 문자형
-> CHAR(n)
: 길이가 고정된 문자 데이터를 담기위해 사용한다. 고정길이 n 에 대해 알파뉴메릭(Alphanumeric)
255자까지 지원한다. 빈 공간을 채우기 때문에 제한된 글자 수 미만의 글자를 적어도 총 용량 n만큼 차지하게 된다.
-> VARCHAR(n)
: 길이가 가변적인 문자 데이터를 담기위해 사용한다. 최대 길이 n에 대해 65,535까지 지원한다.
빈 공간을 채우지 않기 때문에 입력된 글자 수 만큼만 용량을 차지한다.
-> TINYTEXT(n)
: 문자열을 담기 위해 사용한다. n 은 길이 제한이고 최대 255로 설정가능하다.
-> TEXT(n)
: 문자열을 담기 위해 사용한다. n 은 길이 제한이고 최대 65,535로 설정가능하다.
-> MEDIUMTEXT(n)
: 문자열을 담기 위해 사용한다. n 은 길이 제한이고 최대 16,777,215로 설정가능하다.
-> LONGTEXT(n)
: 문자열을 담기 위해 사용한다. n 은 길이 제한이고 최대 4,294,967,295로 설정가능하다.
=> 문자형에서 ~TEXT 타입은 VARCHAR 와 달리, 그 데이터를 테이블에 대한 파일에 직접 저장하는 것이 아닌
외부 파일에 별도로 저장해놓고 해당 파일을 참조하도록 되어있기 때문에 인덱싱(Indexing)이 불가능하고
이에 따라 속도가 느리다.
- 논리형
-> BOOLEAN
: 참(TRUE)과 거짓(FALSE)에 대한 값을 담기 위해 사용한다. 사실 BOOLEAN 은 가명이고 실제 타입은
TINYINT(1)로 처리된다. 각 참과 거짓은 숫자 1 과 0 에 매칭된다.
- 날짜 및 시간
-> DATE
: 년,월,일 값을 가지기 위한 타입
-> TIME(n)
: 시,분,초 값을 가지기 위한 타입. n 값은 밀리초를 담을 수 있는 길이를 의미하여 생략시 0 이다.
-> DATETIME(n)
: 년,월,일,시,분,초를 가지기 위한 타입. n 값은 밀리초를 담을 수 있는 길이를 의미하며 최대 6,
생략시 0 이다.
-> TIMESTAMP
: DATETIME(0) 과 동일하나, 내부적으로 유닉스 타임(Unix TimE,Epoch Time)을 그 값으로 가진다.
[장점] : 시스템 시간이 변하면 변한 만큼 같이 변한다.
[단점] : 일시에 제한이 있다.
<유닉스타임> : 1970-01-01 00:00:00 부터 지금까지 흐른 초(Second).
-기타
-> TINYBLOB(n)
: 이진데이터를 담기 위해 사용한다. n 은 길이 제한이고 최대 255로 설정가능하다. 생략시 최대 값을 이용한다.
-> BLOB(n)
: 이진데이터를 담기 위해 사용한다. n 은 길이 제한이고 최대 65,535로 설정가능하다. 생략시 최대 값을 이용한다.
-> MEDIUMBLOB(n)
: 이진데이터를 담기 위해 사용한다. n 은 길이 제한이고 최대 16,777,215로 설정가능하다. 생략시 최대 값을 이용한다.
-> LONGBLOB(n)
: 이진데이터를 담기 위해 사용한다. n 은 길이 제한이고 최대 4,294,967,295로 설정가능하다. 생략시 최대 값을 이용한다.
*/