숫자, 문자, 이진 데이터 타입의 종류와 Array(배열)와 Key-value를 배우고 데이터 타입들을 다루는 방법을 배웠습니다.
BIT(M): 0과 1로만 구성
TINYINT: 매우 작은 정수를 담을 때 사용 (8비트까지 사용가능, 2^8개의 숫자 표현가능)
Signed: -127 ~ 127, Unsigned: 0 ~ 255
기존 INT 타입에 비해 훨씬 적은 저장공간을 차지한다.
참거짓 여부를 담기위해 사용
0: False, 1: True (0만 아니면 참이다. 음수도 참이다.)
SMALLINT (16비트까지 사용가능, 2^16개의 숫자 표현가능)
약 6만개의 정수를 표현할 수 있는 정수 타입
Signed: -32768 ~ 32767, Unsigned: 0 ~ 65535
MEDIUMINT (24비트까지 사용가능, 2^24개의 숫자 표현가능)
BIGINT, SERIAL (64비트까지 사용가능, 2^64개의 숫자)
BIGINT는 INT 타입보다 2배 많은 비트수를 사용한다.
BIGINT중에서 부호가 없는 경우를 SERIAL이라고 부른다.
DECIMAL(M, D), DEC, FIXED
고정소수점 타입
M: 숫자 전체 자리수의 길이, D: 소수점이하 자리수 (D가 0이면 소수점이하가 없다 → 정수)
소수점이하 자리수를 미리 정한 후 고정된 자리수로만 표현한다.
FLOAT (32비트를 사용한다 = 4바이트)
현업에서는 디테일하게 나눠 사용하진 않는다. (주로 BOOLEAN, INT, DOUBLE 등을 사용한다.)
고정된 길이이므로 선언된 문자보다 짧은 문자열이 들어와도 빈 문자열로 남은 공간을 채운다. (SELECT문을 통해 값을 가져올 때 빈 문자열은 빼고 가져온다.)
메모리를 사용해 쿼리 결과문 반환이 빠르다.
변동 가능한 길이의 문자열 (기본값을 가질 수 있다. 지정된 길이보다 짧고 공백이 있으면 공백도 저장된다. → CHAR도 동일)
한 행에 다른 커럼들의 데이터도 저장하려면 VARCHAR 컬럼 하나가 한 행이 쓸 수 있는 전체 공간을 쓰면 안되기 때문에 실제로는 65535바이트보다 짧은 문자열을 담아야 문제가 없다.
메모리를 사용해 쿼리 결과문 반환이 빠르다.
TEXT (최대 65535바이트)
문자열을 저장할 수 있는 타입. VARCHAR 타입과 다르게 길이(기본값) 지정이 불가능하다.
최대길이만 넘지 않으면 문자열 덩어리를 길이에 상관없이 집어넣는 방식으로 사용
현업에서는 VARCHAR 타입을 더 많이 사용한다. (예: 40개의 문자를 저장하는데 실수로 41개를 저장하려고하면 VARCHAR는 에러가 발생하지만 TEXT는 에러가 발생하지 않기 때문에 오류를 발견하기 어렵다.)
메모리가 아니라 디스크를 사용한다. 따라서 쿼리 결과문 반환이 느리다.
TINYTEXT (최대 255 바이트)
MEDIUMTEXT (최대 약 1670만 바이트)
LONGTEXT (최대 약 42.9억 바이트)
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
VARBINARY
BINARY데이터의 쿼리를 수행하면 데이터 형식이 BINARY이므로 CAST함수를 사용해서 타입을 바꾼다.
(insert into 'a' (a_binary) values
(’안녕하세요’);SELECT CAST(a as CHAR) as hello
FROM a;
)
데이터가 저장된 리스트 ([’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_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, ‘.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);
코딩테스트 문제를 풀면서 시간복잡도나 코드의 용량이 중요하다는 것을 알았고 다양한 타입과 함수들을 배워 효율적인 코드를 작성해야겠다는 생각이 들었습니다.