일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 인접 형제 결합자
- RGBA
- Checked 의사 클래스
- css
- i 태그
- reveal in file explorer
- id 선택자
- 전체 선택자
- br 태그
- sup태그
- background-color 속성
- not 의사클래스
- tag html
- padding 속성
- iframe 태그
- RGB
- go live
- focus 의사클래스
- Live Server
- html 태그
- 임베디드
- 아두이노
- height속성
- html tag i
- iframe
- sub태그
- 일반 형제 결합자
- width속성
- html
- 자식결합자
- Today
- Total
so woon!
[구조] 테이블과 열 본문
학습일 : 2022. 09. 28
테이블
테이블
테이블(Table)은 반드시 스키마에 소속되어있어야 한다.
테이블의 이름은 복수형으로 짓는 것을 원칙으로 한다. 가령, 쿠팡이라는 서비스의 회원 정보를 담는 테이블은 `coupang_member`스키마 내에 `users`라는 이름으로 존재한다.
테이블은 실제 데이터(레코드)를 담기 위한 용도로 사용된다.
C : 만들기
새로운 테이블을 만들기 위해 아래 구문을 사용한다.
-- ↓ 소속 스키마 ↓ 새로 만들 테이블 이름
CREATE TABLE `some_schema`.`some_table`
(
[열 구조,...],
[제약 조건,...]?
);
제약 조건
기본 키(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 : 변경하다, 대체하다)
-- ↓ 스키마 이름 ↓ 스키마 이름
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` [CHANGE COLUMN `대상 열 이름` `새로운 이름` [새로운 열 구조] [FIRST|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]?
1. 데이터 타입
숫자형 |
모든 숫자형 타입은 매개변수(아래에서 `n`)를 통해 그 자리수를 제한할 수 있다. 모든 숫자형 타입은 그 타입 뒤에 `UNSIGNED` 키워드를 붙여 음수부를 양수부로 전환, 양수부에서 약 두 배의 범위를 이용할 수 있다. 가령, `TINYINT UNSIGNED` 타입은 0부터 255까지의 수를 이용할 수 있다. 여기서 `UNSIGNED`는 '부호가 없는'이라는 뜻이다. `TINYINT` 혹은 `TINYINT(n)` : (`1 Byte`) -128부터 127까지의 정수. `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`을 거짓으로 인식한다. |
2. 빈 값(`NULL|NOT NULL`)
- `NULL` : 해당 열의 값이 비어있을 수 있음. (기본 값)
- `NOT NULL` : 해당 열의 값이 비어있을 수 없음.
3. 기본값(`DEFAULT x`)
- 해당 열에 빈 값(`NULL`)을 삽입(`INSERT`)할 때 대신 사용할 기본 값이다.
- 자동 증가(`AUTO_INCREMENT`)
- 자동 증가는 해당 열이 기본키(`PRIMARY KEY`)이고, 정수 타입일 때 값 생략시 1부터 시작하여
1씩 증가시킨 값을 대신 대입하기 위해 사용한다.