[1기] K-Digital Training: 데이터 분석 데브코스 - TIL_Day13

정연우·2023년 12월 6일
0

학습 주제

숫자, 문자, 이진 데이터 타입의 종류와 Array(배열)와 Key-value를 배우고 데이터 타입들을 다루는 방법을 배웠습니다.


주요 메모 사항 소개

숫자

BIT(M): 0과 1로만 구성

  • M에는 몇자리 비트를 사용할지 넣는다. 1이 기본값이고 1 ~ 64까지 올 수 있다.

TINYINT: 매우 작은 정수를 담을 때 사용 (8비트까지 사용가능, 2^8개의 숫자 표현가능)

  • Signed: -127 ~ 127, Unsigned: 0 ~ 255

  • 기존 INT 타입에 비해 훨씬 적은 저장공간을 차지한다.

BOOK, BOOLEAN

  • 참거짓 여부를 담기위해 사용

  • 0: False, 1: True (0만 아니면 참이다. 음수도 참이다.)

SMALLINT (16비트까지 사용가능, 2^16개의 숫자 표현가능)

  • 약 6만개의 정수를 표현할 수 있는 정수 타입

  • Signed: -32768 ~ 32767, Unsigned: 0 ~ 65535

  • MEDIUMINT (24비트까지 사용가능, 2^24개의 숫자 표현가능)

INT, INTEGER (32비트까지 사용가능, 2^32개의 숫자 표현가능)

  • 일반적으로 사용하는 정수 타입

BIGINT, SERIAL (64비트까지 사용가능, 2^64개의 숫자)

  • BIGINT는 INT 타입보다 2배 많은 비트수를 사용한다.

  • BIGINT중에서 부호가 없는 경우를 SERIAL이라고 부른다.

  • DECIMAL(M, D), DEC, FIXED

  • 고정소수점 타입

  • M: 숫자 전체 자리수의 길이, D: 소수점이하 자리수 (D가 0이면 소수점이하가 없다 → 정수)

  • 소수점이하 자리수를 미리 정한 후 고정된 자리수로만 표현한다.

FLOAT (32비트를 사용한다 = 4바이트)

  • 부동소수점 타입

DOUBLE (64비트를 사용한다. = 8바이트)

  • FLOAT보다 더 큰 부동소수점 타입

현업에서는 디테일하게 나눠 사용하진 않는다. (주로 BOOLEAN, INT, DOUBLE 등을 사용한다.)


문자

CHAR (길이: 0 ~ 255바이트)

  • 고정된 길이이므로 선언된 문자보다 짧은 문자열이 들어와도 빈 문자열로 남은 공간을 채운다. (SELECT문을 통해 값을 가져올 때 빈 문자열은 빼고 가져온다.)

  • 메모리를 사용해 쿼리 결과문 반환이 빠르다.

VARCHAR (길이: 0 ~ 65535바이트 - MySQL에서 한 행이 가질 수 있는 총 길이와 동일)

  • 변동 가능한 길이의 문자열 (기본값을 가질 수 있다. 지정된 길이보다 짧고 공백이 있으면 공백도 저장된다. → CHAR도 동일)

  • 한 행에 다른 커럼들의 데이터도 저장하려면 VARCHAR 컬럼 하나가 한 행이 쓸 수 있는 전체 공간을 쓰면 안되기 때문에 실제로는 65535바이트보다 짧은 문자열을 담아야 문제가 없다.

  • 메모리를 사용해 쿼리 결과문 반환이 빠르다.

TEXT (최대 65535바이트)

  • 문자열을 저장할 수 있는 타입. VARCHAR 타입과 다르게 길이(기본값) 지정이 불가능하다.

  • 최대길이만 넘지 않으면 문자열 덩어리를 길이에 상관없이 집어넣는 방식으로 사용

  • 현업에서는 VARCHAR 타입을 더 많이 사용한다. (예: 40개의 문자를 저장하는데 실수로 41개를 저장하려고하면 VARCHAR는 에러가 발생하지만 TEXT는 에러가 발생하지 않기 때문에 오류를 발견하기 어렵다.)

  • 메모리가 아니라 디스크를 사용한다. 따라서 쿼리 결과문 반환이 느리다.

TINYTEXT (최대 255 바이트)

  • 작은 TEXT

MEDIUMTEXT (최대 약 1670만 바이트)

  • 중간 크기 TEXT

LONGTEXT (최대 약 42.9억 바이트)

  • 큰 크기 TEXT

ENUM

  • 제한된 값 리스트를 미리 저장해두고 그 안에 있는 값만 삽입할 수 있도록하는 타입

  • 컬럼 타입을 지정할 때부터 들어갈 수 있는 값 리스트를 지정해준다. (만약 해당 리스트에 없는 값을 테이블에 INSERT하면 주로 에러가 발생 - 빈 문자열이 들어가는 경우도 있다.)

  • 훨씬 적은 저장소 용량으로 동일한 데이터를 저장할 수 있다.

  • 들어올 수 있는 값이 절대 바뀌지 않는다면 저장소 공간을 효율적으로 사용하는데 도움이 된다. (현업에서 사용하는 경우는 많지 않다.)

SET (최대 64개)

  • ENUM과 동일하게 미리 가능한 값 리스트를 지정한다. ENUM과 다르게 0개 혹은 여러 개의 값이 올 수 있다. (예: 개, 고양이, 물고기가 올 수 있다고 지정했을 때 빈 문자열이 들어와도 괜찮고 (강아지, 고양이)도 가능하고 (개, 고양이, 물고기)도 가능하다.)

  • 가능한 값 리스트의 모든 조합이 올 수 있다.

  • 순서를 무시한다.

문자열은 CHAR, VARCHAR를 많이 사용한다.


이진

BLOB (최대 65535바이트, 디폴트값을 가질 수 없다.)

  • 문자열뿐만 아니라 아무 데이터 상관없이 저장 가능한 타입

  • Binary파일: 데이터를 저장하거나 활용하기위해 0과 1을 이진형식으로 인코딩해둔 파일

  • 이진형식으로 표시할 때는 16진법으로 표시하기도 한다.

  • Binary타입은 다른 타입을 포함하는 개념 (TEXT파일은 Binary파일에 포함되지만 모든 Binary파일이 TEXT파일은 아니다 - IMAGE파일, 숫자)

TINYBLOB (최대 255 바이트)

MEDIUMBLOB (최대 약 1670만 바이트)

LONGBLOB (최대 약 42.9억 바이트)

BINARY

  • CHAR의 Binary버전

VARBINARY

  • VARCHAR의 Binary버전

CHAR, VARCHAR는 인수로 문자열의 길이가 들어가고 BINARY는 인수로 바이트가 들어간다.

BINARY데이터의 쿼리를 수행하면 데이터 형식이 BINARY이므로 CAST함수를 사용해서 타입을 바꾼다.

(insert into 'a' (a_binary) values
(’안녕하세요’);

SELECT CAST(a as CHAR) as hello
FROM a;
)


배열(ARRAY)

데이터가 저장된 리스트 ([’a’, ’b’, ’c’])

원소(element): 배열에 저장된 각 데이터

JSON 타입으로 배열을 저장(JSON_ARRAY)하고 JSON타입으로 저장할 수 있는 형태가 다양하기 때문에 기본값을 설정할 수 없다.


JSON_ARRAY

  • 입력을 JSON 배열로 반환하는 함수

  • INSERT, SELECT문에서 주로 사용한다.

  • INSERT문에서 문자열을 삽입하려면 JSON_ARRAY(”원소1”, “원소2”, “원소3”…)이나 ‘[”원소1”, “원소2”, “원소3”…]’ 형식을 사용한다. (후자 형식은 따옴표를 구분해서 작성해야한다.)

  • 배열의 원소로 배열이 들어갈 수 있다. (예: JSON_ARRAY(JSON_ARRAY(”원소1-1”, “원소1-2”, “원소1-3”…), JSON_ARRAY(”원소2-1”, “원소2-2”, “원소2-3”…), JSON_ARRAY(”원소3-1”, “원소3-2”, “원소3-3”…)…))


JSON_EXTRACT

  • ARRAY 내부의 데이터에 접근할 수 있다.

  • 인덱싱: 배열 내부 데이터에 인덱스를 통해 접근하는 것.

모든 값을 가져오는 쿼리

(SELECT JSON_EXTRACT(options, ‘$’) as all_elements
FROM products;
)

첫번째 값을 뽑아오는 쿼리

(SELECT JSON_EXTRACT(options, ‘$[0]’) as first_element
FROM products
)


구조체

Key-value

  • 딕셔너리와 유사하다.

1) {’이름’ : ’홍길동’, ‘부서’ : ’개발팀’ , ’직책’ : ’팀장’, ‘근무지’ : ’판교’}
2) {’색상’ : [’빨강’, ‘파랑’], ‘사이즈’ : [’S’, ‘M’, ‘L’]}

  • JSON 타입으로 key-value 저장 (INSERT문에서 JSON타입으로 지정한다.)

JSON_OBJECT

  • key-value 입력값을 JSON객체로 반환하는 함수 (JSON_ARRAY와 유사하게 사용)

  • INSERT, SELECT문에서 주로 사용한다.

  • JSON_OBJECT에 들어가는 값을 입력할 때는 key-value 순으로 입력한다.

  • 예: JSON_OBJECT(’off’, JSON_ARRAY(’일’, ‘월’), ‘substitute’, ‘민수’)

  • 홀수번째는 key값, 짝수번째는 value값이다.

  • 중첩이 가능하다. (’a’, JSON_OBJECT(JSON_OBJECT(’b’, ‘c’)))

JSON_EXTRACT

  • key-value에서 JSON_EXTRACT를 사용해 값을 가져올 때는 ‘$’뒤에 ‘.원하는키 이름'을 쓰면 된다.

  • 예: select json_extract(info, ‘$.off’) as off from managers_v2;

  • 중첩이 가능하다. (JSON_EXTRACT(JSON_EXTRACT(info, ‘.a),.a’), ‘.b’))


JSON_INSERT

  • key-value쌍을 삽입할 때 사용한다.

  • 예: UPDATE managers_v2 set info = JSON_INSERT(info, ‘$.new’, JSON_ARRAY(1,2,3,4));

JSON_REPLACE

  • 이미 있는 컬럼값을 바꾸는 함수이다.

  • 예: UPDATE managers_v2 set info = JSON_REPLACE(info, ‘$.new’, 1);


공부하며 어려웠던 내용

코딩테스트 문제를 풀면서 시간복잡도나 코드의 용량이 중요하다는 것을 알았고 다양한 타입과 함수들을 배워 효율적인 코드를 작성해야겠다는 생각이 들었습니다.

0개의 댓글