> For the complete documentation index, see [llms.txt](https://leeans-dev-book.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://leeans-dev-book.gitbook.io/docs/lecture/database/table.md).

# Table 만들기

이번 시간은 테이블 만드는 법 & 데이터 타입을 알아봅시다.

여러분이 마트에서 일하는 개발자라 생각하고

마트 상품데이터를 db에 저장해봅시다.

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FbiT6yW50WwGsFV1gE9kL%2FScreenshot_1.png?alt=media&amp;token=071bb054-307b-4c12-9a04-6ddd57856d14" alt=""><figcaption></figcaption></figure>

하나의 databse 가 폴더 table은 파일이라고 인식하면 편할듯.

database는 서비스당 하나 (항상 그런건 아님)를 만들고 그안에 테이블을 여러개 두는식으로 하면된다.

우리는 scott 라는 데이터 베이스를 만들었고&#x20;

테이블 우클릭 후 Create New Table 클릭&#x20;

우측 상단에서 접속한 Connection 과 스키마 확인!

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2F68DxtvVcBXO8SkPA7HqS%2FScreenshot_6.png?alt=media&amp;token=b95f1e2e-2afb-4357-8370-986ac426f94b" alt=""><figcaption></figcaption></figure>

테이블이 만들어 졌으면 이름을 product로 지정하고

컬럼탭에서 우클릭 후 Create New Column 클릭 하면 컬럼 만들 수 있음

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FxvXoJA7G0yJS1ZW5Z61m%2FScreenshot_3.png?alt=media&amp;token=0062df5b-328d-4217-9d80-9a16df59bc4e" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FxuRNiBVrDE0hgLG3AnSO%2FScreenshot_4.png?alt=media&amp;token=9f294c6f-2c22-41ff-9bdf-5c4baebfa26e" alt=""><figcaption></figcaption></figure>

마트에 파는 상품이 이런 데이터를 가졌다고 가정하면 총 4개의 컬럼을 만들어주면 될듯?

아래처럼 4개의 컬럼을 만들고 타입을 지정하고 저장하면&#x20;

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FounZJqmbpOuuxINL6V2f%2FScreenshot_7.png?alt=media&amp;token=8e01df02-6ae2-4fc1-92c0-26ec0a06a788" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FAc2iyFdJKoUI7meG6YDm%2FScreenshot_8.png?alt=media&amp;token=2faf0351-eed2-4898-bdcf-947371050f88" alt=""><figcaption></figcaption></figure>

이러한 창이 뜨고 persist 클릭하면 테이블이 생성된다.

column을 만들 때 data type을 명시하게 되어있는데&#x20;

**data type은 데이터의 종류**라는 뜻입니다.&#x20;

문자, 숫자, 소수, 시간, 참거짓여부 등 여러 종류가 있습니다.&#x20;

### 문자 Data Type

|                                             |            |                        |
| ------------------------------------------- | ---------- | ---------------------- |
| **data type**                               | **저장가능한양** | **특징**                 |
| CHAR                                        | 0\~255자    | CHAR(숫자)로 최대용량 지정가능    |
| <mark style="color:red;">**VARCHAR**</mark> | 0\~65535자  | VARCHAR(숫자)로 최대용량 지정가능 |
| TEXT                                        | 0\~65535자  |                        |
| TINYTEXT                                    | 0\~255자    |                        |
| MEDIUMTEXT                                  | 0\~1600만자  |                        |
| LONGTEXT                                    | 0\~42억자    |                        |

문자를 저장하고 싶으면 이것 중에 고르면 됩니다.

VARCHAR를 가장 많이 쓰니까 문자 저장하고 싶으면 대충 그거 선택해서 쓰면 됩니다.

가끔 블로그 글이라든지 긴 글을 저장하고 싶으면 MEDIUMTEXT 이런거 쓰는 경우가 있습니다.  (BLOB 형태로 저장됩니다)

&#x20;

(참고1)

VARCHAR(300) 이렇게 해놓고 나중에 10자만 저장한다고 해도 300자만큼 하드용량을 차지하는게 아닙니다.

실제 넣은 10자 + 1byte 만큼 용량을 차지합니다.&#x20;

(글자가 256자 이상이면 + 1byte 말고 + 2byte 입니다)

&#x20;

(참고2)

CHAR(10) 이렇게 해놓으면 나중에 10자만 저장하면 딱 10자만큼 용량을 차지합니다.&#x20;

다만 5자만 저장해도 10자만큼 용량을 차지합니다.&#x20;

항상 고정된 크기의 글자가 필요한 경우 CHAR쓰는게 성능상 이점이 있을 수 있습니다.

근데 그런 경우는 매우 드물고 체감도 별로 되진 않습니다.&#x20;

### 숫자 Data Type

| **data type** | **저장가능한양**          | **특징**                      |
| ------------- | ------------------- | --------------------------- |
| SMALLINT      | -32768 \~ 32767     |                             |
| MEDIUMINT     | -838만 \~ 838만       |                             |
| **INT**       | -21억 \~ 21억         |                             |
| **BIGINT**    | -900경 \~ 900경       |                             |
| FLOAT         | -10^38 \~ 10^38     | 소수점 7자리까지 저장가능 (약간의 오차발생함)  |
| DOUBLE        | -10^308 \~ 10^308   | 소수점 14자리까지 저장가능 (약간의 오차발생함) |
| **DECIMAL**   | 소수점 30자리 포함 최대 65자리 | 오차없이 소수점 저장가능               |

숫자를 저장하고 싶으면 이것 중에 고르면 됩니다.

언제나 예상하는 숫자보다 더 큰 숫자가 들어올 수 있으니 잘 생각해서 고릅시다.&#x20;

FLOAT, DOUBLE, DECIMAL은 소수점이 들어있는 숫자를 저장가능합니다.

다만 FLOAT, DOUBLE은 성능은 괜찮으나 정확도가 낮을 수 있습니다.&#x20;

&#x20;

&#x20;

(참고1) ORACLE에서는 INTEGER 저장 시 자동으로 NUMBER 형식으로 변환해준다.

NUMBER(p, s)&#x20;

p : precision, 여기서는 최대 유효숫자 자릿수를 의미한다.&#x20;

s : scale, 소수점 기준 자릿수를 의미한다.

&#x20;기본값이 NUMBER(38,0) => 38자릿수의 정수

(참고2) 넣는 숫자가 커진다고 DB용량을 더 차지하고 그런거 아닙니다.&#x20;

INT로 만들어놨으면 데이터 1개 당 무조건 4byte를 차지합니다.

SMALLINT는 2byte, BIGINT는 8byte임&#x20;

### 날짜 Data Type

| **data type** | **저장가능한양**     | **특징**                                               |
| ------------- | -------------- | ---------------------------------------------------- |
| DATE          | 1000년 \~ 9999년 | YYYY-MM-DD 형식으로 날짜저장가능                               |
| TIME          | -839 \~ +838시간 | HH:MM:SS 형식으로 시간의 양 저장가능                             |
| TIMESTAMP     | 1970년 \~ 2038년 | <p>YYYY-MM-DD HH:MM:SS.FF4 </p><p>(소숫점 4자리까지 표현)</p> |

이거 말고도 영상, 사진같은 바이너리 데이터는 BLOB,

JSON 형식은 JSON,&#x20;

참거짓 여부는 BOOLEAN 이런거 사용합니다.

자주 안쓰니 이런 것들이 있다고만 알아둡시다.&#x20;

&#x20;

&#x20;

Oracle, MySQL,  Postgresql 등 DBMS 종류마다 저장할 수 있는 타입이 다릅니다.

예를 들면 Postgresql은 확장기능 설치하면 유저 GPS 좌표정보도 저장가능합니다.&#x20;

그래서 당근마켓 이런데서 이용하고 있습니다.&#x20;

물론 다른 DB에서도 대충 숫자나 문자로 바꾸면 저장가능
