데이터분석
13. 데이터 타입
장수우
2023. 12. 6. 17:00
학습주제
- 다양한 데이터 타입 다루기
- 숫자
- 문자
- 이진
- Array
- Key-value
주요 메모 사항 소개
- 숫자 데이터 타입 (비고란의 크기는 전부 byte 입니다.)
데이터 타입 | 의미 | 비고 |
BIT (M) | 0과 1로만 구성 ex) b’111’ = 7 |
1 <= M <= 64 기본값 M = 1 |
TINYINT | 매우 작은 정수 | Signed 범위 : -127 ~ 127 Unsigned 범위 : 0 ~ 225 |
BOLL, BOOLEAN | True / False | TINYINT(1) 과 같다. 0이면 False, 1이면 True |
SMALLINT | 작은 정수 | -32768 ~ 32767 0 ~ 65535 |
MEDIUMINT | 중간 크기 정수 | -8388608 ~ 8388607 0 ~ 16777215 |
INT, INTEGER | 정수 | -2147483648 ~ 2147483647 0 ~ 4294967295 |
BIGINT, SERIAL | INT 타입보다 2배 많은 비트를 사용하는 정수 | -9223372036854775808 ~ 9223372036854775807 0 ~ 18446744073709551615 |
DECIMAL(M,D), DEC, FIXED | 고정소수점 타입 | M <= 65 0 <= D <= 30 |
FLOAT | 부동소수점 타입 | 4 bytes |
DOUBLE | 부동소수점 타입 | 8 bytes |
상세설명 → https://dev.mysql.com/doc/refman/8.0/en/numeric-type-syntax.html
- 문자 타입
데이터 타입 | 의미 | 비고 |
CHAR | 고정된 길이의 문자열 | 0 ~ 255 byte 선언된 값보다 짧은 문자열이 들어오면, 빈 문자열로 나머지 길이를 채운다. |
VARCHAR | 변동 가능한 길이의 문자열 | 0 ~ 65535 byte |
TEXT | 변동 가능한 길이의 문자열 | 최대 65535 byte (길이 설정 불가) Non-binary strings (=character strings) 기본값 지정 불가 |
TINYTEXT | 작은 TEXT | 최대 255 byte |
MEDIUMTEXT | 중간크기 TEXT | 최대 16777215 byte |
LONGTEXT | 큰 크기 TEXT | 최대 4294967295 byte |
ENUM | 최초에 지정해 둔 리스트에 포함되는 값만 저장 | 효율적인 데이터 저장이 가능하나 유연성, 확장성이 낮다. |
SET | 최초에 지정해 둔 리스트에 포함되는 값들을 중복으로 저장 |
최대 64개 |
상세설명 → https://dev.mysql.com/doc/refman/8.0/en/string-types.html
- 이진
데이터 타입 | 의미 | 비고 |
BLOB | Binary Large Object | 최대 65535 byte (길이 설정 불가) 기본값 지정 불가 |
TINYBLOB | 작은 BLOB | 최대 255 byte |
MEDIUMLOB | 중간 크기 BLOB | 최대 16777215 byte |
LONGLOB | 큰 BLOB | 최대 4294967295 byte |
BINARY | Binary strings (고정된 길이) | 0 ~ 255 byte 선언된 값보다 짧은 문자열이 들어오면, 빈 문자열로 나머지 길이를 채운다 |
VARBINARY | Binary Strings (변동 가능한 길이) | 0 ~ 255 최대 16777215 byte |
- Array
- 데이터가 저장된 리스트
ex) ['a', 'b', 'c'] / [1, 2, 3] - Element (원소) : Array에 저장된 각 데이터이다.
- JSON 타입으로 배열을 저장한다.
- 기본값 설정 불가능하다.
- 데이터가 저장된 리스트
- JSON_ARRAY : 입력을 JSON 배열로 반환하는 함수
CREATE TABLE IF NOT EXISTS `products` ( -- table을 생성하고
`product_id` int(6) NOT NULL,
`category` varchar(40) NOT NULL,
`name` varchar(10) NOT NULL,
`price` int unsigned NOT NULL,
`options` JSON NULL,
PRIMARY KEY (`product_id`)
);
INSERT INTO `products` (`product_id`, `category`, `name`, `price`, `options`) VALUES
(0, '키즈', '어린이칫솔', 1500, JSON_ARRAY('빨강', '파랑')), -- JSON ARRAY 를 사용했습니다.
(1, '스포츠', '손목보호대', 10000, JSON_ARRAY('S', 'M', 'L')),
(2, '주방용품', '밥그릇', 2000, JSON_ARRAY('소', '중', '대')),
(3, '디지털', '마우스', 15000, NULL);
- JSON_TYPE : JSON 데이터의 타입을 반환하는 함수
SELECT options, JSON_TYPE(options)
FROM products;
- JSON_EXTRACT : Array 내부 데이터에 접근하는 함수 = indexing
SELECT JSON_EXTRACT(options, '$') as all_elements -- '$' 는 키를 지정하는 것
FROM products -- '$' 뒤에 아무것도 없으면 전체
SELECT JSON_EXTRACT(options, '$[0]') as all_elements -- '$[0]' 1번째 위치
FROM products
- Key-value : Key와 Value로 이루어진 데이터
- Key를 통해 Value에 접근할 수 있다.
ex) {'이름' : '홍길동', '부서' : '개발팀', '직책' : '팀장', '근무지', : '판교'}
{'색상' : ['빨강', '파랑'], '사이즈' : ['S', 'M', 'L']} - JSON 타입으로 key-value를 저장
- Key를 통해 Value에 접근할 수 있다.
- JSON_OBJECT
CREATE TABLE IF NOT EXISTS `managers_v2` (
`id` int unsigned NOT NULL,
`name` varchar(40) NOT NULL,
`managing` varchar(50) NOT NULL,
`info` JSON NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `managers_v2` (`id`, `name`, `managing`, `info`) VALUES
(0, '영희', '스포츠', JSON_OBJECT('off', JSON_ARRAY('일', '월'), 'substitute', '민수')),
(1, '철수', '주방용품', JSON_OBJECT('off', JSON_ARRAY('화', '수'), 'substitute', '길순')),
(2, '민수', '디지털', JSON_OBJECT('off', JSON_ARRAY('목', '금'), 'substitute', '철수')),
(3, '길순', '키즈', JSON_OBJECT('off', JSON_ARRAY('금', '토'), 'substitute', '영희'));
- JSON_EXTRACT
SELECT JSON_EXTRACT(info, '$.off') as off
FROM managers_v2
- JSON_INSERT
UPDATE managers_v2 set info = JSON_INSERT(info, '$.new', JSON_ARRAY(1,2,3,4));
- JSON_REPLACE
UPDATE managers_v2 set info = JSON_INSERT(info, '$.new', 1);
원래는 이 코드를쓰면 new 값이 1로 변경되어야 하는데 배열이라 변경되지 않는 것 같습니다.
배열 사용시 아래 코드를 쓰면 되겠습니다.
UPDATE managers_v2 SET info = JSON_SET(info, '$.new', JSON_ARRAY(5, 6, 7));
공부하면서 어려웠던 내용
- 키-쌍값 배열 값 변경하는 부분이 어려웠던 것 같습니다.
반응형