Post

🐘 PostgreSQL κΈ°λ³Έ β…£ - 데이터 νƒ€μž… 이해

🐘 PostgreSQL κΈ°λ³Έ β…£ - 데이터 νƒ€μž… 이해

πŸ“™ γ€Žμ‹€μš© SQL』을 읽고 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

κ°œμš”

  • μ•žμœΌλ‘œ 많이 보게 될 데이터 νƒ€μž…μ€ λ‹€μŒκ³Ό κ°™λ‹€.
  1. 문자: κΈ€μžμ™€ 기호
  2. 숫자: μ •μˆ˜μ™€ μ†Œμˆ˜λ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  수
  3. λ‚ μ§œμ™€ μ‹œκ°„: μ‹œκ°„ 정보

λ¬Έμžν˜• 데이터 νƒ€μž… μ΄ν•΄ν•˜κΈ°

  • λ¬Έμžν˜• 데이터 νƒ€μž…μ€ 문자, 숫자, 기호의 쑰합에 μ‚¬μš©ν•˜κΈ° μ ν•©ν•œ 일반적인 νƒ€μž…μ΄λ‹€.
  • λ¬Έμžν˜• 데이터 νƒ€μž…μ€ λ‹€μŒκ³Ό κ°™λ‹€.
  1. char(n)
    • μž…λ ₯ν•œ n에 따라 길이가 κ³ μ •λœ 열이 μ •μ˜λœλ‹€.
    • κ°€λ Ή char(20)으둜 μ„€μ •λœλ‹€λ©΄ κΈ€μžλ₯Ό 아무리 많이 μ‚½μž…ν•˜λ”λΌλ„ 각 행에 20자만 λ³΄κ΄€λœλ‹€.
    • λ§Œμ•½ 20μžλ³΄λ‹€ 적게 μž…λ ₯ν•˜λ©΄ PostgreSQL이 λ‚˜λ¨Έμ§€ 곡간을 곡백으둜 μ±„μš΄λ‹€.
    • character(n)으둜 μ •μ˜ν•  μˆ˜λ„ 있으며, μš”μ¦˜μ—” 거의 쓰이지 μ•ŠλŠ”λ‹€.
    • ν‘œμ€€ SQL에 ν¬ν•¨λœλ‹€.
  2. varchar(n)
    • μ΅œλŒ€ 길이가 n으둜 μ •μ˜λ˜λŠ” κ°€λ³€ 길이 데이터 νƒ€μž…μ΄λ‹€.
    • μ΅œλŒ€μΉ˜λ³΄λ‹€ 적은 수의 κΈ€μžλ₯Ό μž…λ ₯ν•˜λ”λΌλ„ PostgreSQL은 곡백을 μΆ”κ°€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 데이터 곡간을 μ ˆμ•½ν•  수 μžˆλ‹€.
    • character varying(n)으둜 μ •μ˜ν•  μˆ˜λ„ μžˆλ‹€.
    • ν‘œμ€€ SQL에 ν¬ν•¨λœλ‹€.
  3. text
    • 길이 μ œν•œμ΄ μ—†λŠ” κ°€λ³€ 길이 데이터 νƒ€μž…μ΄λ‹€.
    • κ°€μž₯ 길게 담을 수 μžˆλŠ” 데이터 ν¬κΈ°λŠ” 1GB이닀.
    • ν‘œμ€€ SQL에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€.

문자 νƒ€μž… 열에 μ €μž₯된 μˆ«μžμ—λŠ” μˆ˜ν•™ 연산을 μˆ˜ν–‰ν•  수 μ—†λ‹€. 문자 νƒ€μž… μ—΄μ—λŠ” 우편번호 같은 일련번호λ₯Ό μ €μž₯ν•  λ•Œλ§Œ 숫자λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE char_data_types (
	char_column char(10),
	varchar_column varchar(10),
	text_column text
);
  
INSERT INTO char_data_types
VALUES
	('abc', 'abc', 'abc'),
	('defghi', 'defghi', 'defghi');

COPY char_data_types TO 'C:\YourDirectory\typetest.txt'
WITH (FORMAT CSV, HEADER, DELIMITER '|');
  • 문자 데이터 νƒ€μž…μ΄ 각각 μ–΄λ–»κ²Œ μ €μž₯λ˜λŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•œ 예제 μ½”λ“œμ΄λ‹€.
  • COPY table_name FROM은 κ°€μ Έμ˜€κΈ° κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λ©°, TO pathλŠ” 내보내기 κΈ°λŠ₯을 μˆ˜ν–‰ν•œλ‹€.
  • WITH ν‚€μ›Œλ“œ μ˜΅μ…˜μ„ μ‚¬μš©ν•΄ 파일 μ•ˆ λ°μ΄ν„°μ˜ 각 열을 νŒŒμ΄ν”„ 문자둜 κ΅¬λΆ„ν•œ ν˜•μ‹μœΌλ‘œ λ³€κ²½ν•œ 것이닀.
1
2
3
char_column|varchar_column|text_column
abc       |abc|abc
defghi    |defghi|defghi
  • μœ„ νŒŒμΌμ„ 보면 charν˜•μ˜ 경우 곡백을 μ±„μ›Œ 맀번 10자λ₯Ό 좜λ ₯ν•˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.
  • μ§€κΈˆμ€ 각 μ—΄μ—μ„œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” 곡간듀이 λ¬΄μ‹œν•΄λ„ 될 μ •λ„λ‘œ μž‘κ²Œ λŠκ»΄μ§€μ§€λ§Œ, ν”„λ‘œμ νŠΈκ°€ 컀져 μˆ˜μ‹­ 개의 ν…Œμ΄λΈ”μ— μžˆλŠ” 수백만 개의 행을 λ‹€λ£¨κ²Œ 될 λ•ŒλŠ” 더 효율적인 곡간 관리가 ν•„μš”ν•΄μ§ˆ 것이닀.
  • 문자λ₯Ό μ €μž₯ν•  λ•ŒλŠ” text νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.
  • μ΅œλŒ€ 길이λ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ•„λ„ 되기 λ•Œλ¬Έμ— μΆ”ν›„ 문자 νƒ€μž… 열에 λŒ€ν•œ μš”κ΅¬ 사항이 λ³€κ²½λ˜λ”λΌλ„ ν…Œμ΄λΈ”μ„ μˆ˜μ •ν•  ν•„μš”κ°€ μ—†λ‹€.

μˆ«μžν˜• 데이터 νƒ€μž… μ΄ν•΄ν•˜κΈ°

  • 연산을 ν•˜κ±°λ‚˜ 번호 순으둜 λ‚˜μ—΄ν•΄μ•Ό ν•œλ‹€λ©΄ λ¬Έμžκ°€ μ•„λ‹Œ 숫자 νƒ€μž…μ„ ν™œμš©ν•΄μ•Ό ν•œλ‹€.
  • 숫자 데이터 νƒ€μž…μ€ λ‹€μŒκ³Ό κ°™λ‹€.
  1. μ •μˆ˜: μ–‘μˆ˜μ™€ 음수, 0
  2. κ³ μ • μ†Œμˆ˜μ κ³Ό 뢀동 μ†Œμˆ˜μ : μ‹€μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 두 κ°€μ§€ ν˜•νƒœ
μ •μˆ˜
  • ν‘œμ€€ SQL은 smallint, integer, bigintλΌλŠ” μ„Έ 개의 μ •μˆ˜λ₯Ό μ œκ³΅ν•œλ‹€.
  • μ„Έ νƒ€μž…μ˜ 차이점은 넣을 수 μžˆλŠ” 숫자의 μ΅œλŒ€ 크기닀.
데이터 νƒ€μž…μ €μž₯ ν¬κΈ°μ΅œμ†Œκ°’μ΅œλŒ€κ°’
smallint2λ°”μ΄νŠΈ-32,76832,767
integer4λ°”μ΄νŠΈ-2,147,483,6482,147,483,647
bigint8λ°”μ΄νŠΈ-9,223,372,036,854,775,8089,223,372,036,854,775,807
  • 데이터 μš©λŸ‰μ„ κ³ λ €ν•˜μ—¬ μ μ ˆν•œ 데이터 νƒ€μž…μ„ 선택해야 ν•˜μ§€λ§Œ, 데이터 νƒ€μž…μ„ λ²—μ–΄λ‚œ 숫자λ₯Ό 열에 μž…λ ₯ν•  경우, λ°μ΄ν„°λ² μ΄μŠ€λŠ” 싀행을 μ€‘μ§€ν•˜κ³  out of range 였λ₯˜λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • μ‹œλ¦¬μ–Ό νƒ€μž…κ³Ό 같은 μžλ™ 증가 μ •μˆ˜ 열을 λ§Œλ“€λ©΄ ν…Œμ΄λΈ”μ— 각 행에 κΈ°λ³Έ ν‚€λΌλŠ” κ³ μœ ν•œ ID 번호λ₯Ό 생성할 수 μžˆλ‹€.
  • PostgreSQLμ—μ„œ μžλ™ 증가 μ •μˆ˜ 열을 λ§Œλ“œλŠ” 방법은 두 κ°€μ§€κ°€ μžˆλ‹€.
  • ν•˜λ‚˜λŠ” μ‹œλ¦¬μ–Ό 데이터 νƒ€μž…μœΌλ‘œ, μ΄λŠ” ANSI SQL ν‘œμ€€μΈ μžλ™ 증가 μ •μˆ˜λ₯Ό PostgreSQLμ—μ„œ 고유 κ΅¬ν˜„ν•œ 데이터 νƒ€μž…μ΄λ‹€.
  • λ‹€λ₯Έ ν•˜λ‚˜λŠ” ANSI SQL ν‘œμ€€μΈ IDENTIIY ν‚€μ›Œλ“œμ΄λ‹€.
μ‹œλ¦¬μ–Ό νƒ€μž…μ„ μ‚¬μš©ν•œ μžλ™ 증가
1
2
3
4
CREATE TABLE people (
	id serial,
	person_name varchar(100)
);
데이터 νƒ€μž…μ €μž₯ ν¬κΈ°μ΅œμ†Œκ°’μ΅œλŒ€κ°’
smallserial2λ°”μ΄νŠΈ132,767
serial4λ°”μ΄νŠΈ12,147,483,647
bigserial8λ°”μ΄νŠΈ19,223,372,036,854,775,807
IDENTITY ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œ μžλ™ 증가
1
2
3
4
CREATE TABLE people (
	id integer GENERATED ALWAYS AS IDENTITY,
	person_name varchar(100)
);
  • IDENTITY ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  경우 μ½”λ“œλŠ” 더 κΈΈμ§€λ§Œ μ‹œλ¦¬μ–Όλ³΄λ‹€ μ„ ν˜Έλœλ‹€.
  • μ΄λŠ” IDENTITY νƒ€μž…μ΄ λ‹€λ₯Έ λ°μ΄ν„°λ² μ΄μŠ€ μ‹œμŠ€ν…œκ³Ό ν˜Έν™˜λ˜λ©°, μ‚¬μš©μžκ°€ μ‹€μˆ˜λ‘œ ν•΄λ‹Ή 열에 값을 μ‚½μž…ν•˜μ§€ λͺ»ν•˜λ„둝 λ°©μ§€ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • μ‹œλ¦¬μ–Ό νƒ€μž…μ€ 데이터 μ‚½μž…μ„ λ°©μ§€ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • IDENTITY ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λ‹€μŒ 두 κ°€μ§€ 방법이 μžˆλ‹€.
  1. GENERATED ALWAYS AS IDENTITY
    • 항상 μžλ™ 증가 μ •μˆ˜ μ‚½μž…, μ‚¬μš©μž μž„μ˜ μ‚½μž… λΆˆκ°€
  2. GENERATED DEFAULT AS IDENTITY
    • μ‚¬μš©μžκ°€ μž„μ˜λ‘œ μ‚½μž…ν•˜μ§€ μ•ŠλŠ” 경우 μžλ™ 증가 μ •μˆ˜ μ‚½μž…
    • 이 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 값이 쀑볡될 수 μžˆμœΌλ―€λ‘œ ν‚€ μ—΄λ‘œ μ‚¬μš©ν•˜λ©΄ λ¬Έμ œκ°€ 될 수 있음

행이 좔가될 λ•Œλ§ˆλ‹€ μžλ™μœΌλ‘œ μ¦κ°€ν•˜λŠ” μ‹œλ¦¬μ–Ό νƒ€μž…μ΄ 적용된 열이더라도 μ–΄λ–€ κ²½μš°μ—λŠ” κ·Έ 값에 ν‹ˆμ΄ 생길 수 μžˆλ‹€. κ°€λ Ή ν•˜λ‚˜μ˜ 행이 μ‚­μ œλ  경우, κ·Έ 행에 ν• λ‹Ήλλ˜ 값은 λ‹€μ‹œ λŒ€μ²΄λ˜μ§€ μ•ŠλŠ”λ‹€. ν–‰ μ‚½μž…μ΄ μ·¨μ†Œλ˜λ”λΌλ„ ν•΄λ‹Ή μ—΄μ˜ μ‹œν€€μŠ€λŠ” κ³„μ†ν•΄μ„œ 이어진닀.

μ†Œμˆ˜
  • SQL λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ†Œμˆ˜λŠ” κ³ μ • μ†Œμˆ˜μ κ³Ό 뢀동 μ†Œμˆ˜μ  데이터 νƒ€μž…μœΌλ‘œ μ²˜λ¦¬ν•  수 μžˆλ‹€.
κ³ μ • μ†Œμˆ˜μ 
  • μž„μ˜ 정밀도 νƒ€μž…μœΌλ‘œλ„ λΆˆλ¦°λ‹€.
  • numeric(precision, scale) ν˜•νƒœλ‘œ μ„ μ–Έν•œλ‹€.
  • 인수인 precision은 μž…λ ₯될 숫자의 전체 자릿수λ₯Ό, scale은 μ†Œμˆ˜μ  μ•„λž˜ 자릿수λ₯Ό μ λŠ”λ‹€.
  • decimal(precision, scale)μœΌλ‘œλ„ κ³ μ • μ†Œμˆ˜μ  ν˜•μ‹μœΌλ‘œ μ§€μ •ν•  수 μžˆλ‹€.
  • 두 방식 λͺ¨λ‘ ANSI SQL ν‘œμ€€μ— ν¬ν•¨λ˜μ–΄ μžˆλ‹€.
  • precision 인수 값을 μƒλž΅ν•  경우 λ°μ΄ν„°λ² μ΄μŠ€μ˜ μ΅œλŒ€ ν•œλ„λ₯Ό κΈ°μ€€μœΌλ‘œ 숫자λ₯Ό μ €μž₯ν•œλ‹€.
  • scale 인수 값을 μƒλž΅ν•  경우 0 값을 κ°€μ§€λ©°, μ΄λŠ” μ •μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€.
뢀동 μ†Œμˆ˜μ 
  • 뢀동 μ†Œμˆ˜μ  νƒ€μž…μœΌλ‘œλŠ” real, double precision이 μžˆλ‹€.
  • 이 λ‘˜μ˜ 차이점은 담을 수 μžˆλŠ” 데이터 크기이닀.
  • real νƒ€μž…μ€ μ†Œμˆ˜μ  μ΄ν•˜ 6μžλ¦¬κΉŒμ§€ 정밀도λ₯Ό ν—ˆμš©ν•˜λ©°, double precision은 μ†Œμˆ˜μ  μ•„λž˜ 15μžλ¦¬κΉŒμ§€ 정밀도λ₯Ό ν—ˆμš©ν•œλ‹€.
  • 이 뢀동 μ†Œμˆ˜μ  νƒ€μž…μ€ κ°€λ³€ 정밀도 νƒ€μž…μ΄λΌκ³ λ„ ν•œλ‹€.
  • λ°μ΄ν„°λ² μ΄μŠ€λŠ” μž…λ ₯된 값을 유효 μˆ«μžμ™€ 10의 μ§€μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 숫자(μ†Œμˆ˜μ μ˜ μœ„μΉ˜)둜 λ‚˜λˆ„μ–΄ λ³΄κ΄€ν•œλ‹€.
  • κ·ΈλŸ¬λ―€λ‘œ 열에 적힌 μ†Œμˆ˜μ μ˜ μœ„μΉ˜λŠ” μˆ«μžμ— 따라 움직일 수 있게 λœλ‹€.
ꡬ뢄데이터 νƒ€μž…ν¬κΈ°μ €μž₯ λ°©μ‹λ²”μœ„
κ³ μ • μ†Œμˆ˜μ numeric(precision, scale), decimal(precision, scale)κ°€λ³€ κΈΈμ΄λ‚΄λΆ€μ μœΌλ‘œ κ°€λ³€ 길이 2μ§„μˆ˜λ‘œ μ €μž₯, μ •ν™•ν•œ 10μ§„μˆ˜ ν‘œν˜„ κ°€λŠ₯-10^131072 ~ +10^131072 (μ†Œμˆ˜ 자릿수 μ΅œλŒ€ 16383 자리)
뢀동 μ†Œμˆ˜μ real4λ°”μ΄νŠΈIEEE 754 단정도(32λΉ„νŠΈ) 뢀동 μ†Œμˆ˜μ μ•½ Β±1.18E-38 ~ Β±3.40E38, μ†Œμˆ˜μ  μ•½ 6자리 정밀도
뢀동 μ†Œμˆ˜μ double precision8λ°”μ΄νŠΈIEEE 754 배정도(64λΉ„νŠΈ) 뢀동 μ†Œμˆ˜μ μ•½ Β±2.23E-308 ~ Β±1.80E308, μ†Œμˆ˜μ  μ•½ 15자리 정밀도
뢀동 μ†Œμˆ˜μ float(p)4~8λ°”μ΄νŠΈp ≀ 24 β†’ real, p > 24 β†’ double precisionp 값에 따라 real λ˜λŠ” double precision의 λ²”μœ„μ™€ 정밀도 적용
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE number_data_types (
	numeric_column numeric(20,5),
	real_column real,
	double_column double precision
);

INSERT INTO number_data_types
VALUES
	(.7, .7, .7),
	(2.13579, 2.13579, 2.13579),
	(2.1357987654, 2.1357987654, 2.1357987654);

SELECT * FROM number_data_types;
  • numeric, real, double precision μ„Έ 개의 데이터 νƒ€μž…μ΄ μ–΄λ–»κ²Œ λ‹€λ₯Έμ§€ μ‚΄νŽ΄ 보기 μœ„ν•œ μ˜ˆμ œμ΄λ‹€.
numeric_columnreal_columndouble_column
0.70.70.7
2.135792.135792.13579
2.13582.13579872.1357987654
  • numeric νƒ€μž…μ€ λ‹€μ„― μžλ¦¬λ³΄λ‹€ 많이 μž…λ ₯ν•  경우 반올림 μ²˜λ¦¬ν•œλ‹€.
  • real νƒ€μž…μ€ ν΄λΌμ΄μ–ΈνŠΈ λ³„λ‘œ μ†Œμˆ˜μ  μ•„λž˜ 6 ~ 7μžλ¦¬κΉŒμ§€ μ •ν™•ν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€.
  • double precision νƒ€μž…μ€ μ†Œμˆ˜μ  μ•„λž˜ 15μžλ¦¬κΉŒμ§€ μ •ν™•ν•œ κ²°κ³Όλ₯Ό 좜λ ₯ν•œλ‹€.
  • 컴퓨터가 뢀동 μ†Œμˆ˜μ μ„ λ³΄κ΄€ν•˜λŠ” 방식 λ•Œλ¬Έμ— μ˜λ„μΉ˜ μ•Šμ€ μˆ˜ν•™μ  였λ₯˜λ‘œ μ΄μ–΄μ§ˆ μˆ˜λ„ μžˆλ‹€.
1
2
3
4
5
SELECT
numeric_column * 10000000 AS fixed,
real_column * 10000000 AS floating
FROM number_data_types
WHERE numeric_column = .7;
fixedfloating
7,000,0006,999,999.88079071
  • μ•žμ„œ λ§Œλ“  ν…Œμ΄λΈ”μ—μ„œ, 천 λ§Œμ„ κ³±ν•œ λ’€ 0.7 값이 λ“€μ–΄μžˆλ˜ 첫 번째 μ€„λ§Œ ν•„ν„°λ§ν–ˆλŠ”λ°, 쿼리의 리턴 값이 λ‹€λ₯΄λ‹€.
  • 뢀동 μ†Œμˆ˜μ μ΄ μ΄λŸ¬ν•œ 였λ₯˜λ₯Ό λ±‰λŠ” μ΄μœ λŠ” 컴퓨터가 μœ ν•œν•œ μˆ«μžλ“€ μ•ˆμ— λŒ€λŸ‰μ˜ 정보λ₯Ό μ§‘μ–΄ λ„£μœΌλ €κ³  ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • 숫자 데이터 νƒ€μž…μ— ν•„μš”ν•œ μ €μž₯ 곡간은 μ†Œμˆ˜μ  μ•žλ’€ μžλ¦Ώμˆ˜μ— 따라 달라진닀.
  • λ•Œμ— 따라 numeric νƒ€μž…μ΄ 뢀동 μ†Œμˆ˜μ  νƒ€μž…λ³΄λ‹€ 더 λ§Žμ€ 곡간을 μ°¨μ§€ν•  μˆ˜λ„ μžˆλ‹€.
  • λ§Œμ•½ λͺ‡ μ‹­λ§Œ 개의 행을 λ‹€λ£¨λŠ” μž‘μ—…μ„ ν•˜κ³  μžˆλ‹€λ©΄, 비ꡐ적 λΆ€μ •ν™•ν•œ 뢀동 μ†Œμˆ˜μ  계산 없이 μ²˜λ¦¬ν•  수 μžˆλŠ”μ§€ κ³ λ €ν•΄λ³΄λŠ” 것이 μ’‹λ‹€.
ν•„μš”ν•œ 숫자 데이터 νƒ€μž…μ„ μ„ νƒν•˜λŠ” 법
  • κ°€λŠ₯ν•œ μ •μˆ˜ νƒ€μž…μ„ μ„ νƒν•˜μž.
  • μ†Œμˆ˜μ  데이터λ₯Ό λ‹€λ£¨λŠ”λ° 계산이 μ •ν™•ν•΄μ•Ό ν•œλ‹€λ©΄ numeric, decimal νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•˜μž.
  • 뢀동 μ†Œμˆ˜μ  νƒ€μž…μ€ 곡간을 μ ˆμ•½ν•  수 μžˆμ§€λ§Œ κ³„μ‚°μ˜ 정확도가 λ–¨μ–΄μ§€λ―€λ‘œ κ³„μ‚°μ˜ 정확도가 μ€‘μš”ν•˜μ§€ μ•Šμ„ λ•Œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • μΆ©λΆ„νžˆ 큰 숫자 νƒ€μž…μ„ μ„ νƒν•˜μž.
  • κ°€λ Ή numeric, decimal을 μ‚¬μš©ν•  땐 precision을 μΆ©λΆ„νžˆ 크게 ν•˜μ—¬ μ†Œμˆ˜μ  μœ„λ‚˜ μ•„λž˜λ‘œ μžλ¦Ώμˆ˜κ°€ λ‹€ λ‹΄κΈΈ 수 μžˆλ„λ‘ ν™•λ³΄ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.
  • μ •μˆ˜λ₯Ό λ‹€λ£° λ•ŒλŠ” bigintλ₯Ό μ‚¬μš©ν•˜λ˜, 확신이 λ“ λ‹€λ©΄ integerλ‚˜ smallintλ₯Ό ν™œμš©ν•΄λ„ μ’‹λ‹€.

λ‚ μ§œμ™€ μ‹œκ°„ νƒ€μž… μ΄ν•΄ν•˜κΈ°

데이터 νƒ€μž…ν¬κΈ°μ„€λͺ…λ²”μœ„
date4λ°”μ΄νŠΈλ‚ μ§œ(μ—°-μ›”-일)만 μ €μž₯기원전 4713-01-01 bc ~ 5874897-12-31 ad
time(precision)8λ°”μ΄νŠΈν•˜λ£¨ 쀑 μ‹œκ°„(μ‹œ:λΆ„:초.μ†Œμˆ˜μ΄ˆ)만 μ €μž₯, νƒ€μž„μ‘΄ 정보 μ—†μŒ00:00:00 ~ 24:00:00 (μ†Œμˆ˜ 초 정밀도 μ΅œλŒ€ 6자리)
time(precision) with time zone12λ°”μ΄νŠΈν•˜λ£¨ 쀑 μ‹œκ°„ + νƒ€μž„μ‘΄ μ €μž₯00:00:00+1459 ~ 24:00:00-1459
timestamp(precision)8λ°”μ΄νŠΈλ‚ μ§œ + μ‹œκ°„ μ €μž₯, νƒ€μž„μ‘΄ 정보 μ—†μŒ4713 bc ~ 294276 ad (μ†Œμˆ˜ 초 정밀도 μ΅œλŒ€ 6자리)
timestamp(precision) with time zone8λ°”μ΄νŠΈλ‚ μ§œ + μ‹œκ°„ + utc κΈ°μ€€ νƒ€μž„μ‘΄ 보정 정보 μ €μž₯4713 bc ~ 294276 ad (μ†Œμˆ˜ 초 정밀도 μ΅œλŒ€ 6자리)
interval [fields] (precision)16λ°”μ΄νŠΈμ‹œκ°„ 간격(λ…„, μ›”, 일, μ‹œ, λΆ„, 초) μ €μž₯μ•½ Β±178000000λ…„ (μ†Œμˆ˜ 초 정밀도 μ΅œλŒ€ 6자리)
  • μ–Έμ œ μ–΄λ–€ 일이 λ°œμƒν–ˆλŠ”μ§€μ— λŒ€ν•œ λ¬Έμ œλŠ” 일반적으둜 λˆ„κ°€, 무엇을, μ–Όλ§ˆλ‚˜ λ§Žμ€ μ‚¬λžŒμ΄ μ°Έμ—¬ν–ˆλŠ”μ§€ λ§ŒνΌμ΄λ‚˜ κ°€μΉ˜ μžˆλŠ” 문제기 λ•Œλ¬Έμ— 데이터λ₯Ό μ‚¬μš©ν•œ μŠ€ν† λ¦¬ν…”λ§μ— ν•„μˆ˜μ μ΄λ‹€.
timestamp
  • 좔적할 수 μžˆλŠ” λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μœ μš©ν•œ λ‚ μ§œμ™€ μ‹œκ°„μ„ κΈ°λ‘ν•œλ‹€.
  • μ—¬κ°κΈ°μ˜ 좜발, νƒ€μž„λΌμΈμ— λ‹€λ₯Έ 사건 정리 λ“± 이벀트 μ‹œκ°„ 기둝에 ν•΄λ‹Ή μ΄λ²€νŠΈκ°€ λ°œμƒν•œ μ‹œκ°„λŒ€κ°€ ν¬ν•¨λ˜λ„λ‘ ν‚€μ›Œλ“œλ₯Ό μΆ”κ°€ν•˜λŠ” 것이 μ’‹λ‹€.
  • κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ μ „ 세계 μ—¬λŸ¬ κ³³μ—μ„œ 기둝된 μ‹œκ°„μ„ 비ꡐ할 수 μ—†λ‹€.
  • timestamp with time zone νƒ€μž…μ€ ν‘œμ€€ SQL의 μΌλΆ€λ‘œ PostgreSQLμ—μ„œλŠ” timestampzλ‘œλ„ 그와 λ™μΌν•œ 데이터 νƒ€μž…μ„ μ§€μ •ν•  수 μžˆλ‹€.
date
  • λ‚ μ§œλ§Œ κΈ°λ‘ν•˜λ©°, SQL ν‘œμ€€μ˜ 일뢀이닀.
time
  • μ‹œκ°„λ§Œ κΈ°λ‘ν•˜λ©°, SQL ν‘œμ€€μ˜ 일뢀이닀.
  • with time zone을 μΆ”κ°€ν•  수 μžˆμ§€λ§Œ, λ‚ μ§œκ°€ μ—†λ‹€λ©΄ λ¬΄μ˜λ―Έν•˜λ‹€.
interval
  • μˆ˜λŸ‰ λ‹¨μœ„ ν˜•μ‹μœΌλ‘œ ν‘œν˜„λœ μ‹œκ°„ λ‹¨μœ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 값을 λ³΄μœ ν•œλ‹€.
  • κΈ°κ°„μ˜ μ‹œμž‘ λ˜λŠ” 끝은 κΈ°λ‘ν•˜μ§€ μ•Šκ³ , 길이만 κΈ°λ‘ν•œλ‹€.
  • 일반적으둜 interval 데이터 νƒ€μž…μ€ λ‹€λ₯Έ λ‚ μ§œλ‚˜ μ‹œκ°„ μ—΄μ˜ 계산 λ˜λŠ” 필터링에 μ‚¬μš©λœλ‹€.
  • SQL ν‘œμ€€μ˜ μΌλΆ€μ§€λ§Œ PostgreSQL μ „μš© ꡬ문은 더 λ§Žμ€ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE date_time_types (
	timestamp_column timestamp with time zone,
	interval_column interval
);

INSERT INTO date_time_types
VALUES
	('2022-12-31 01:00 EST','2 days'),
	('2022-12-31 01:00 -8','1 month'),
	('2022-12-31 01:00 Australia/Melbourne','1 century'),
	(now(),'1 week');

SELECT * FROM date_time_types;
timestamp_columninterval_column
2022-12-31 15:00:00.000 +09002 days
2022-12-31 18:00:00.000 +09001 mon
2022-12-30 23:00:00.000 +0900100 years
2025-08-14 14:14:02.601 +09007 days
  • 두 νƒ€μž…μ— λŒ€ν•œ ν…Œμ΄λΈ”μ„ λ§Œλ“€κ³  ν–‰ 4개λ₯Ό μ‚½μž…ν–ˆλ‹€.
  • λ‚ μ§œμ™€ μ‹œκ°„ 정보λ₯Ό μ‚½μž…ν•  λ•Œ ISO ν˜•μ‹ YYYY-MM-DD HH:MM:SS에 λ§žλŠ” 값을 μž…λ ₯ν•˜μ˜€λ‹€.
  • SQL은 MM/DD/YYYY λ“± λ‹€μ–‘ν•œ λ‚ μ§œ ν˜•μ‹μ„ μ§€μ›ν•˜μ§€λ§Œ 세계적인 ν˜Έν™˜μ„±μ„ μœ„ν•΄ ISOλ₯Ό ꢌμž₯ν•œλ‹€.
  • 첫 번째 ν–‰μ—μ„œλŠ” λ―Έκ΅­ 동뢀 ν‘œμ€€μ‹œμ˜ 약어인 ESTλ₯Ό μ‚¬μš©ν•œλ‹€.
  • 두 번째 ν–‰μ—μ„œλŠ” μ‹œκ°„λŒ€λ₯Ό -8 κ°’μœΌλ‘œ μ„€μ •ν•˜μ—¬ UTC κΈ°μ€€ 8μ‹œκ°„ λŠ¦μ€ μ‹œκ°„λŒ€λ‘œ μ§€μ •ν•œλ‹€.
  • μ„Έ 번째 ν–‰μ—μ„œλŠ” Australia/Melbourne으둜 μ˜μ—­κ³Ό μœ„μΉ˜μ˜ 이름을 μ‚¬μš©ν•˜μ—¬ μ‹œκ°„λŒ€λ₯Ό μ§€μ •ν•œλ‹€.
  • λ„€ 번째 ν–‰μ—μ„œλŠ” λ‚ μ§œ, μ‹œκ°„ 및 μ‹œκ°„λŒ€λ₯Ό μ§€μ •ν•˜λŠ” λŒ€μ‹  ν•˜λ“œμ›¨μ–΄μ—μ„œ ν˜„μž¬ νŠΈλžœμž­μ…˜ μ‹œκ°„μ„ μΊ‘μ³ν•˜λŠ” now() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€.
  • 처음 μ„Έ ν–‰μ˜ timestamp_column 열에 λ™μΌν•œ λ‚ μ§œμ™€ μ‹œκ°„μ„ μ œκ³΅ν–ˆμŒμ—λ„ νƒ€μž„μ‘΄μ΄ λ‹€λ₯΄λ©΄ μ €μž₯λ˜λŠ” UTC와 좜λ ₯값은 λͺ¨λ‘ 달라진닀.
  • λ§ˆμ§€λ§‰μœΌλ‘œ PostgreSQL은 간격 ν‘œμ‹œμ— λŒ€ν•œ κΈ°λ³Έ μ„€μ •μœΌλ‘œ 1 centuryλ₯Ό 100 years둜, 1 week을 7 days둜 λ³€κ²½ν•œλ‹€.

interval 데이터 νƒ€μž…μ„ 톡해 λ‚ μ§œ κ³„μ‚°ν•˜κΈ°

  • interval 데이터 νƒ€μž…μ€ λ‚ μ§œ 및 μ‹œκ°„ 데이터와 κ΄€λ ¨λœ κ°„λ‹¨ν•œ 계산에 μœ μš©ν•˜λ‹€.
  • 예λ₯Ό λ“€μ–΄, 고객이 계약을 μ²΄κ²°ν•œ λ‚ μ§œλ₯Ό ν¬ν•¨ν•˜λŠ” 열이 μžˆλ‹€κ³  κ°€μ •ν•˜μž.
  • μ—¬κΈ°μ„œ interval 데이터 νƒ€μž…μ˜ λ°μ΄ν„°λ‘œ 각 계약 λ‚ μ§œμ— 90일을 μΆ”κ°€ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈ 후속 쑰치 μ‹œκΈ°λ₯Ό μ •ν•  수 μžˆλ‹€.
1
2
3
4
5
SELECT
	timestamp_column,
	interval_column,
	timestamp_column - interval_column AS new_date
FROM date_time_types;
timestamp_columninterval_columnnew_date
2022-12-31 15:00:00.000 +09002 days2022-12-29 15:00:00.000 +0900
2022-12-31 18:00:00.000 +09001 mon2022-11-30 18:00:00.000 +0900
2022-12-30 23:00:00.000 +0900100 years1922-12-30 23:00:00.000 +0900
2025-08-14 14:14:02.601 +09007 days2025-08-07 14:14:02.601 +0900
  • μ—¬κΈ°μ„œ timestamp_column - interval_column 결과인 new_date와 같이 κ³„μ‚°λœ 열을 ν‘œν˜„μ‹μ΄λΌκ³  ν•˜λ©°, 이 기법을 자주 μ‚¬μš©ν•œλ‹€.
  • new_date 열은 기본적으둜 timestamp with time zone νƒ€μž…μœΌλ‘œ ν¬λ§·λ˜μ–΄ μ‹œκ°„ 값을 ν‘œμ‹œν•˜λŠ”λ°, interval κ°’μ—μ„œ λ‚ μ§œκ°€ μ‚¬μš©λ˜λ©΄ λ‚ μ§œκΉŒμ§€ ν‘œμ‹œν•œλ‹€.

JSONκ³Ό JSONB μ΄ν•΄ν•˜κΈ°

1
2
3
4
5
6
7
8
9
10
11
{
	"business_name": "Old Ebbitt Grill",
	"business_type": "Restaurant",
	"employees": 300,
	"address": {
		"street": "675 15th St NW",
		"city": "Washington",
		"state": "DC",
		"zip_code": "20005"
	}
}
  • PostgreSQLμ—λŠ” JSON용 데이터 νƒ€μž…μ΄ 두 κ°€μ§€ μžˆλ‹€.
  1. json: JSON ν…μŠ€νŠΈλ₯Ό κ·ΈλŒ€λ‘œ μ €μž₯
  2. jsonb: JSON ν…μŠ€νŠΈλ₯Ό λ°”μ΄λ„ˆλ¦¬ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ μ €μž₯
  • PostgreSQL은 ν˜„μž¬ SQL ν‘œμ€€μ— μžˆλŠ” μ—¬λŸ¬ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜μ§€λ§Œ 자체적으둜 JSON κ΄€λ ¨ κΈ°λŠ₯κ³Ό μ—°μ‚°μžλ₯Ό μ œκ³΅ν•œλ‹€.
  • jsonκ³Ό λ‹€λ₯΄κ²Œ jsonbλŠ” 인덱싱을 μ§€μ›ν•˜λ―€λ‘œ 처리 속도가 λΉ λ₯΄λ‹€.

κ·Έ μ™Έ νƒ€μž…λ“€ μ‚¬μš©ν•˜κΈ°

  • PostgreSQLμ—λŠ” 문자, 숫자, λ‚ μ§œ 외에도 λ‹€μ–‘ν•œ νƒ€μž…λ“€μ΄ μžˆλ‹€.
  1. boolean νƒ€μž…: true, false
  2. geometric νƒ€μž…: 점, μ„ , 원 및 기타 2차원 개체λ₯Ό 포함
  3. text search νƒ€μž…: PostgreSQL μ „λ¬Έ 검색 μ—”μ§„μš© ν…μŠ€νŠΈ 검색 νƒ€μž…
  4. network address νƒ€μž…: IP λ˜λŠ” MAC μ£Όμ†Œ
  5. UUID νƒ€μž…
  6. range νƒ€μž…: μ •μˆ˜ λ˜λŠ” νƒ€μž„μŠ€νƒ¬ν”„ 같은 λ²”μœ„λ₯Ό μ§€μ •
  7. λ°”μ΄λ„ˆλ¦¬ 데이터λ₯Ό μ €μž₯ν•˜λŠ” νƒ€μž…
  8. κ΅¬μ‘°ν™”λœ ν˜•μ‹μœΌλ‘œ 정보λ₯Ό μ €μž₯ν•˜λŠ” XML 및 JSON νƒ€μž…

CASTλ₯Ό 톡해 데이터 νƒ€μž… λ³€ν™˜ν•˜κΈ°

1
2
3
4
5
6
7
8
9
10
SELECT timestamp_column, CAST(timestamp_column AS varchar(10))
FROM date_time_types;

SELECT numeric_column,
	   CAST(numeric_column AS integer),
	   CAST(numeric_column AS text)
FROM number_data_types;

-- 였λ₯˜ λ°œμƒ
SELECT CAST(char_column AS integer) FROM char_data_types;
  • μ’…μ’… μ–΄λ–€ κ°’μ˜ 데이터λ₯Ό 기쑴에 μ €μž₯된 것과 λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ μˆ«μžμ™€ 문자λ₯Ό κ²°ν•©ν•˜κΈ° μœ„ν•΄ 숫자λ₯Ό 문자 νƒ€μž…μœΌλ‘œ λ°˜ν™˜λ°›κ³  싢을 수 μžˆλ‹€.
  • 이처럼 μ§€μ •λœ 데이터 νƒ€μž…μ΄ μžˆλŠ” 값을 λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 일은 CAST() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μˆ˜ν–‰ν•  수 μžˆλ‹€.
  • CAST() ν•¨μˆ˜λŠ” λŒ€μƒ 데이터 νƒ€μž…μ΄ μ›λž˜ 값을 μˆ˜μš©ν•  수 μžˆμ„ λ•Œλ§Œ μ„±λ¦½ν•œλ‹€.
  • κ°€λ Ή λ¬Έμžλ‚˜ ν…μŠ€νŠΈ νƒ€μž…μ„ 숫자 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•  μˆ˜λŠ” μ—†λ‹€.
  • 첫 번째 μ˜ˆμ œλŠ” timestamp_column 값을 varchar νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•΄ μ•žμ—μ„œλΆ€ν„° 10자만 μœ μ§€ν•œλ‹€.
  • μ‹œκ°„ 뢀뢄을 μ œμ™Έν•˜κ³  λ‚ μ§œλ§Œ ν™•μΈν•˜κ³  싢을 λ•Œ μœ μš©ν•  것이닀.
  • 두 번째 μ˜ˆμ œλŠ” numeric_columnλ₯Ό λ‹€λ₯Έ ν˜•νƒœλ‘œ μ„Έ 번 λ°˜ν™˜ν•œλ‹€.
  • integer둜 λ³€ν™˜ν•  λ•Œ PostgreSQL은 값을 μ •μˆ˜λ‘œ λ°˜μ˜¬λ¦Όν•œλ‹€.
  • μ„Έ 번째 예제의 경우 잘λͺ»λœ νƒ€μž… λ³€ν™˜μ„ μˆ˜ν–‰ν•˜λ €κ³  μ‹œλ„ν•˜μ—¬ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
1
2
3
4
5
SELECT timestamp_column, CAST(timestamp_column AS varchar(10))
FROM date_time_types;

SELECT timestamp_column::varchar(10)
FROM date_time_types;
  • PostgreSQL은 CAST()보닀 곡간을 덜 μ°¨μ§€ν•˜κ³  λ”μš± λͺ…ν™•ν•œ 단좕 ν‘œκΈ°λ²•μ„ μ œκ³΅ν•œλ‹€.
  • 이쀑 콜둠 ::을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.
  • νŽΈν•œ 방식을 μ‚¬μš©ν•˜λ˜, ν•œ κ°€μ§€ μ£Όμ˜ν•  점은 이쀑 콜둠 방식은 PostgreSQL μ „μš©μ΄λ―€λ‘œ λ‹€λ₯Έ SQL λ²„μ „μœΌλ‘œλŠ” ν¬νŠΈκ°€ λΆˆκ°€λŠ₯ν•˜λ‹€.
This post is licensed under CC BY 4.0 by the author.