JUST GO

[구조] 테이블과 열 본문

DBMS/학습내용

[구조] 테이블과 열

root_go 2022. 10. 5. 09:24

테이블과 열

  • 테이블(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씩 증가시킨 값을 대신 대입하기 위해 사용한다.

'DBMS > 학습내용' 카테고리의 다른 글

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