JUST GO
[구조] 테이블과 열 본문
테이블과 열
- 테이블(Table)은 반드시 스키마에 소속되어있어야 한다.
- 테이블(Table)의 이름은 복수형으로 짓는 것을 원칙으로 한다. 가령, 쿠팡이라는 서비스의 회원 정보를 담는 테이블은 coupang_member 스키마 내에 users 라는 이름으로 존재한다.
- 테이블은 실제 데이터(레코드)를 담기 위한 용도로 사용된다.
- C : 만들기
· 새로운 테이블을 만들기 위해 아래 구문을 사용한다.
-- ↓ 소속 스키마 ↓ 새로 만들 테이블 이름
CREATE TABLE `some_schema`.`some_table`
(
[열 구조,...],
[제약 조건,...]?
);
CREATE TABLE `some_schema`.`people`
(
`name` VARCHAR(3),
`age` TINYINT,
`gender` VARCHAR(1)
);
- 제약 조건
· 기본 키(Primary Key, PK) : 해당 테이블에 축(기준)이 되는 열을 지정한다.
· 해당 열 값은 중복될 수 없다.
· 인덱싱(Indexing)을 통해 테이블 조회 속도를 빠르게 할 수 있다.
· 대부분의 테이블이 기본 키를 가진다.
· 기본 키는 한 테이블에 한 개 이하만 있을 수 있다.
· 테이블 생성시 아래와 같이 어떠한 열에 대해 기본 키 제약 조건을 추가할 수 있다.
CREATE TABLE ...
(
...
CONSTRAINT PRIMARY KEY (`열 이름`, ...)
...
)
- 외래 키(Foreign Key, FK) : 해당 열의 값을 다른 테이블에 있는 특정 열의 값으로 제한한다.
· 외래 키는 개수 제한 없이 명시할 수 있다.
· 단, 우리 열과 참고할 열의 개수와 구조가 같아야 한다. 추가로, 참고할 열은 기본 키이거나 유니크(Unique)여야 함.
· 테이블 생성시 아래와 같이 어떠한 열에 대해 외래 키 제약 조건을 추가할 수 있다.
CREATE TABLE ...
(
...
CONSTRAINT FOREIGN KEY (`열 이름`, ...) REFERENCES `참고할 스키마`.`참고할 테이블` (`참고할 열`,...)
[ON DELETE CASCADE]?
[ON UPDATE CASCADE]?
...
)
· ON DELETE CASCADE : 해당 테이블이 외래키로 참고하고 있는 피참조자가 삭제되면 참조자도 삭제하겠다는 의미.
· ON UPDATE CASCADE : 해당 테이블이 외래키로 참고하고 있는 피참조자가 수정되면 참조자도 수정하겠다는 의미.
- 유니크(Unique, UQ) : 해당 열(들)이 중복될 수 없음을 의미한다.
· 유니크는 개수 제한 없이 명시할 수 있다.
· 테이블 생성시 아래와 같이 어떠한 열에 대해 유니크 제약 조건을 추가할 수 있다.
CREATE TABLE ...
(
...
CONSTRAINT UNIQUE (`열 이름`,...)
...
)
- R : 특정 스키마 안에 있는 테이블 조회하기
· 어떤 스키마 안에 존재하는 테이블의 목록을 조회하기 위해 아래 구문을 사용한다.
-- ↓ 스키마 이름
SHOW TABLES IN `information_schema`;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| ALL_PLUGINS |
| APPLICABLE_ROLES |
| CHARACTER_SETS |
| CHECK_CONSTRAINTS |
| COLLATIONS |
...
| THREAD_POOL_STATS |
+---------------------------------------+
79 rows in set (0.000 sec)
...
- R : 해당 테이블의 정보 조회하기
· 해당 테이블이 가지고 있는 열들의 정보를 조회하기 위해 아래 구문을 사용한다.
-- ↓ 소속 스키마 이름
DESC `some_schema`.`some_table`;
-- ↑ 조회할 테이블 이름
MariaDB [(none)]> DESC `study`.`cities`;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| code | varchar(3) | NO | | NULL | |
| name | varchar(2) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.011 sec)
· DESC 는 'Describe'의 줄임말로 '설명하다'의 의미를 가지고 있음.
- U : 테이블 이름 변경하기
· 스키마와 달리 테이블의 이름은 변경이 가능하다.
-- ↓ 스키마 이름 ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` RENAME TO 'some_schema'.'target_table';
-- ↑ 테이블 이름 ↑ 변경할 테이블 이름
RENAME TO 키워드 뒤의 스키마 이름을 달리하여 테이블이 소속한 스키마를 변경하는 것도 가능하다.
-- ↓ 스키마 이름 ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` RENAME TO 'other_schema'.'target_table';
-- ↑ 테이블 이름 ↑ 변경할 테이블 이름
- U : 열 추가하기
· 존재하는 테이블에 새로운 열을 추가하기 위해 아래 구문을 사용한다. 단, 해당 테이블 내에서 이미 사용 중인 열 이름은 다시 사용할 수 없음으로 유의한다.
-- ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` [ADD COLUMN 열 구조,...];
-- ↑ 테이블 이름
가령, a 스키마의 t 테이블에, 정수인 ca, cb, cc 열 총 세 개를 추가하려면 아래와 같이 한다.
-- ↓ 스키마.테이블
ALTER TABLE `a`.`t` ADD COLUMN `ca` INT UNSIGNED NOT NULL,
ADD COLUMN `cb` INT UNSIGNED NOT NULL,
ADD COLUMN `cc` INT UNSIGNED NOT NULL;
· 열 추가 시 순서를 명시하지 않으면 테이블의 열 가장 끝에 추가된다. 기존의 특정 열 뒤에 추가하고 싶다면 아래와 같이 명령한다.
-- ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` [ADD COLUMN 열 구조 AFTER `대상 열 이름`,...];
-- ↑ 테이블 이름
· BEFORE 라는 키워드는 없으며 테이블의 열 구조상 가장 앞에(첫 번째에) 열을 추가하고자 한다면 아래와 같이 FIRST 키워드를 이용한다.
-- ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` [ADD COLUMN 열 구조 FIRST,...];
-- ↑ 테이블 이름
- U : 존재하는 열 삭제하기
· 존재하는 테이블에 존재하는 열을 삭제하기 위해 아래 구문을 사용한다.
-- ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` [DROP COLUMN 열 이름,...];
-- ↑ 테이블 이름
가령, a 스키마의 t 테이블에서 ca, cb, cc 열을 삭제하기 위해 아래와 같이 명령한다.
-- ↓ 스키마.테이블
ALTER TABLE `a`,`t` DROP COLUMN `ca`,
DROP COLUMN `cb`,
DROP COLUMN `cc`;
- U : 존재하는 열 수정하기
· 존재하는 열의 이름을 수정하기 위해 아래와 같이 명령한다.
-- ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` [RENAME COLUMN `대상 열 이름` TO `새로운 열 이름`,...];
-- ↑ 테이블 이름
· 어떤 테이블에 이미 존재하는 열의 타입이나 순서를 변경하기 위해 아래와 같이 명령한다.
-- ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` [MODIFY COLUMN `대상 열 이름` [새로운 열 구조] [FIRST|AFTER x]?,...];
-- ↑ 테이블 이름
· 존재하는 열의 이름과 타입, 순서를 동시에 변경( RENAME + MODIFY )하기 위해 아래와 같이 명령한다.
-- ↓ 스키마 이름
ALTER TABLE `some_schema`.`some_table` [CAHNGE COLUMN `대상 열 이름` `새로운 이름` [새로운 열 구조] [FRIST|AFTER x]?,...];
-- ↑ 테이블 이름
- U : 복합 수정
· 열을 추가하거나, 삭제, 수정하는 등의 명령은 ALTER TABLE 하나의 구문으로 처리할 수 있다.
· 가령, a 스키마의 t 테이블에 대해 ca 라는 열을 추가하고, cb 열을 삭제하며, cc 열을 cd 뒤로 옮기는 명령은 아래와 같다.
ALTER TABLE `a`.`t` ADD COLUMN `ca` INT,
DROP COLUMN `cb`,
MODIFY COLUMN `cc` INT AFTER `cd`;
- D : 삭제하기
· 존재하는 테이블을 삭제하기 위해 아래 구문을 사용한다.
-- ↓ 소속 스키마 이름
DROP TABLE `some_schema`.`some_table`;
-- ↑ 삭제할 테이블 이름
· 삭제하고자 하는 테이블이 존재하지 않을 때 오류가 발생하는 것을 막기 위해 아래와 같은 구문을 사용한다
-- ↓ 소속 스키마 이름
DROP TABLE IF EXISTS `some_schema`.`some_table`;
-- ↑ 삭제할 테이블 이름
· 삭제하는 테이블 및 이가 가지고 있는 레코드는 복구할 수 없음으로 유의한다.
열
- 열(Column)은 테이블에 들어가게 되는 데이터의 타입이나 개수 등의 형태를 지정하기위해 사용한다. 테이블은 반드시 한 개 이상의 열을 가지고 있어야 한다.
- 열 구조
· 테이블 생성시 열 구조를 명시해야하며 열은 쉼표(,)로 구분하여 여러개 작성 가능하다. 기본적인 열 구조는 아래와 같다.
`열 이름` [데이터 타입] [NULL|NOT NULL]? [DEFAULT x]? [AUTO_INCREMENT]?
- 데이터 타입
· 숫자형
· 모든 숫자형 타입은 매개변수(아래에서 n)를 통해 그 자리수를 제한할 수 있다.
· 모든 숫자형 타입은 그 타입 뒤에 UNSIGNED 키워드를 붙여 음수부를 양수부로 전환, 양수부에서 약 두배 의 범위를 이용할 수 있다. 가령, TINYINT UNSIGNED 타입은 0부터 255까지의 수를 이용할 수 있다. 여기서 UNSIGNED는 '부호가 없는' 이라는 뜻이다.
· TINYINT 혹은 TYNYINT(n) : (1 Byte)-128부터 127까지의 정수. 단, 값 n을 명시할 경우 그 자리수를 제한한다.
· SMALLINT 혹은 SMALLINT(n) : (2 Bytes) -32,768부터 32,767까지의 정수.
· MEDIUMINT 혹은 MEDIUMINT(n) : (3 Bytes) -8,388,608부터 8,388,607 까지의 정수.
· INT 혹은 INT(n) : (4 Bytes) -2,147,483,648 부터 2,147,483,647 까지의 정수.
· BIGINT 혹은 BIGINT(n) : (8 Bytes) 사실상 무제한 수.
· 실수형
· FLOAT : (4 Bytes) 소수를 담을 수 있다. 계산 방식에 의해 소숫점 끝 연산에 오류나 누락이 발생할 수 있음으로 사용하지 않는다.
· DOUBLE : (8 Bytes) 소수를 담을 수 있다. DOUBLE 타입도 연산 방식에 의해 극도로 높은 수준의 연산에서 오류나 누락이 발생할 수 있음으로 데이터가 정확하고 한치의 오차도 허용하지 않는 환경이라면 사용하지 않는다.
· DECIMAL(t, n) : ( t + 1 Bytes ) 전체 길이가 t, 소수부 길이가 n인 실수를 담을 수 있다. 단, 소수부를 포함한 전체 길이가 t임에 유의해야 한다.
· 문자형
· VARCHAR(n) : (n Byte 혹은 2n Byte) 최대 길이가 n자인 문자를 담을 수 있다. 이 때 n은 최대 65,535이다.
· TINYTEXT : (최대 255 Bytes) 문자를 담을 수 있다.
· TEXT : (최대 65,535 Bytes) 문자를 담을 수 있다.
· MEDIUMTEXT : (최대 16,777,215 Bytes) 문자를 담을 수 있다.
· LONGTEXT : (최대 4,294,967,295 Bytes) 문자를 담을 수 있다.
· VARCHAR 타입의 경우 하나의 테이블 내에 VARCHAR 열들이 가지는 길이의 총 합이 65,535를 넘을 수 없다.
· VARCHAR 타입은 인덱스에 캐싱되어 속도가 빠르지만(쉽게 얘기하면 메모리에 임시 저장됨), TEXT 타입은 캐싱되지 않고 항시 드라이브에서 읽어와야 함으로 비교적 속도가 느리다.
· 날짜와 시간
· DATE : (3 Bytes) 년, 월, 일을 포함하는 날짜를 받을 수 있다. 시간을 담을 수 없음에 유의한다.
· TIME 혹은 TIME(n) : (3 Bytes) 시, 분, 초를 포함하는 시간을 받을 수 있다. 날짜를 담을 수 없음에 유의한다. 이 때 n은 밀리초의 길이를 의미한다. 명시하지 않으면 밀리초는 없는 것으로 한다.
· DATETIME 혹은 DATETIME(n) : (8 Bytes) 년, 월, 일의 날짜와 시, 분, 초의 시간을 함께 받는다. 이 때 n은 밀리초의 길이를 의미한다. 명시하지 않으면 밀리초는 없는 것으로 한다.
· TIMESTAMP : 생략
· 기타
· BOOLEAN : (1 Byte) 참 혹은 거짓의 논리 값을 받을 수 있다. 사실은 TINYINT(1) 이며 0을 제외한 모든 값을 참으로, 0을 거짓으로 인식한다.
- 빈 값(NULL | NOT NULL)
· NULL : 해당 열의 값이 비어있을 수 있음.(기본 값)
· NOT NULL : 해당 열의 값이 비어있을 수 없음.
- 기본값(DEFAULT x)
· 해당 열에 빈 값(NULL)을 삽입(INSERT) 할 때 대신 사용할 기본 값이다.
- 자동증가(AUTO_INCREMENT)
· 자동 증가는 해당 열이 기본키(PRIMARY KEY)이고, 정수 타입일 때 값 생략시 1부터 시작하여 1씩 증가시킨 값을 대신 대입하기 위해 사용한다.
· 자동 증가는 해당 열이 기본키(PRIMARY KEY)이고, 정수 타입일 때 값 생략시 1부터 시작하여 1씩 증가시킨 값을 대신 대입하기 위해 사용한다.