so woon!

[구조] 테이블과 열 본문

DBMS/개념정리

[구조] 테이블과 열

xowoony 2022. 9. 29. 17:36

학습일 : 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씩 증가시킨 값을 대신 대입하기 위해 사용한다.

 

'DBMS > 개념정리' 카테고리의 다른 글

[공통] 연산자와 함수  (0) 2022.09.29
[구조] 레코드  (1) 2022.09.29
[구조] 스키마  (0) 2022.09.29
[구조] 사용자  (0) 2022.09.29
[공통] DBMS  (0) 2022.09.27
Comments