DB

[ SQL 스터디 - 2주차 ] MySQL의 데이터 형식

yangheeb 2024. 2. 7. 02:13

 
위 포스트는 "혼자 공부하는 SQL" 책 Chapter 04-1 내용을 정리한 글입니다.

한빛미디어 - 혼자 공부하는 SQL (우재남 저) : 무료 동영상 강의 제공

누구를 위한 책인가요? SQL을 처음 시작하려고 하는 학생과 취업 준비생, 데이터베이스 기초를 배우고자 하는 초보 개발자, SQL의 이론과 실습을 동시에 학습하고 싶은 입문자, SQL을 공부하다가

hongong.hanbit.co.kr


 
 
 

Chapter 4-1. MySQL의 데이터 형

** 데이터 형식

 
데이터의 형식은 크게 숫자형, 문자형, 날짜형으로 나눌 수 있다.
각각의 특징에 대해 하나씩 살펴보자.
 
 

01. 정수형


정수형은 소수점이 없는 숫자에 많이 사용된다.
크기와 범위는 다음과 같다.

데이터 형식바이트 수숫자 범위
TINYINT1-128 ~ 127
SMALLINT2- 32,768 ~ 32,767
INT4약 -21억 ~ + 21억
BIGINT8약 -900경 ~ + 900경

 
 
이전 포스트에서 생성했던 member 테이블을 다시 살펴보겠다.

[ 1주차 ] SQL 기본 문법

위 포스트는 "혼자 공부하는 SQL" 책 Chapter 03 내용과 "유선배 SQL개발자(SQLD) 과외노트" 책 Part 2-1 내용을 정리한 글입니다. 한빛미디어 - 혼자 공부하는 SQL (우재남 저) : 무료 동영상 강의 제공 누구

yangheeb.tistory.com

CREATE TABLE member -- 회원 테이블
( mem_id  		CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
  mem_name    	VARCHAR(10) NOT NULL, -- 이름
  mem_number    INT NOT NULL,  -- 인원수
  addr	  		CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
  phone1		CHAR(3), -- 연락처의 국번(02, 031, 055 등)
  phone2		CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
  height    	SMALLINT,  -- 평균 키
  debut_date	DATE  -- 데뷔 일자
);

 
mem_number 열의 경우 데이터 형식이 INT로 명시되어 있지만,
할당될 데이터 값에 비해 불필요하게 숫자 범위가 넓게 설정되어 있기 때문에
데이터 형식을 숫자 범위가 적은 것으로 바꿀 필요가 있다.
 

  mem_number    TINYINT NOT NULL,  -- 인원수

 
위 코드는 mem_number의 데이터 형식을 'TINYINT'로 바꾼 것이다.
 
 
그리고

값의 범위를 0부터 시작하고 싶을 때는

"UNSIGNED 예약어"를 사용하여 이를 표현할 수 있다.
 
 
 
아래의  height 변수에서 SMALLINT 데이터 형식은 
- 32,768 ~ 32,767 이라는 숫자 범위를 가지고 있는 형식이다.

  height    	SMALLINT,  -- 평균 키

 
 
 
 
 

여기서 잠깐 !
이 height 데이터에서 2가지 수정사항이 보이지 않는가?

 

1. height 역시 불필요하게 숫자 범위가 넓게 설정되어 있기 때문에,
데이터 형식을 TINYINT 정도로 변경을 해주어야 한다.

 

2. TINYINT는 -128 ~ +127로 200cm가 넘는 사람도 존재하기에,
UNSIGNED 예약어를 사용하여 값의 범위를 0부터 시작하게 지정해야 한다.

 
 
 
 
이 2가지 문제점을 수정한 height 데이터는 다음과 같다.

  height    	TINYINT UNSIGNED,  -- 평균 키

 
 
 
mem_number와 height를 수정한 member 테이블이다.

CREATE TABLE member -- 회원 테이블
( mem_id  		CHAR(8) NOT NULL PRIMARY KEY, -- 사용자 아이디(PK)
  mem_name    	VARCHAR(10) NOT NULL, -- 이름
  mem_number    TINYINT NOT NULL,  -- 인원수
  addr	  		CHAR(2) NOT NULL, -- 지역(경기,서울,경남 식으로 2글자만입력)
  phone1		CHAR(3), -- 연락처의 국번(02, 031, 055 등)
  phone2		CHAR(8), -- 연락처의 나머지 전화번호(하이픈제외)
  height    	TINYINT UNSIGNED,  -- 평균 키
  debut_date	DATE  -- 데뷔 일자
);

 
 

'TINYINT''TINYINT UNSIGNED'

모두 1Byte의 크기를 가지고 있는 데이터라는 공통점을 가지고 있지만,
- TINYINT는 1Byte를 -128 ~ +127의 범위로 256개의 Bit로 표현하고
- TINYINT UNSIGNED는 1Byte를 0 ~ 255의 범위로 256개의 Bit를 표현하는 차이점이 있다.
 
 
 
 
 

02. 문자형


 

문자형은

글자를 저장하기 위해 사용하며, 입력할 최대 글자의 개수를 정해야 한다.
 
대표적인 문자형 예시인 CHARVARCHAR에 대해 알아보자.

데이터 형식바이트 수
CHAR (개수)1 ~ 255
 VARCHAR (개수)1 ~ 16383

 
 

# CHAR
- 문자를 의미하는 Character의 약자
- "고정길이 문자형"이라고 부르며, 자릿수가 고정되어있음
- 글자의 개수가 고정된 경우 사용하는 것이 좋음
# VARCHAR
- Variable Character의 약자
- "가변길이 문자형"이라고 부름
- 글자의 개수가 변동될 경우에 사용하는 것이 좋음

 
 

두 문자형 방식의 차이점이 있다면

( "이태민"이라는 문자를 저장 가정 )

** CHAR(10)의 경우 
   : 이태민 + 7칸의 공간 낭비 -> 총 10칸 중 3칸만 저장
** VARCHAR(10)의 경우
   : 이태민 -> 문자에 해당하는 길이만 저장됨. 3자리만 사용

 
 

즉 VARCHAR은

CHAR보다 공간을 효율적으로 운영할 수 있는 장점이 있지만,
MySQL 내부적으로 성능면에서는 CHAR보다 조금 약하다는 단점이 있다.
 
 
cf1) 문자형에는 위 예시 이외에도 BINARY, VARBINARY 있지만 잘 사용하지 않는다
cf2) 단순히 CHAR, VARCHAR로만 표시한다면 CHAR(1), VACHAR(1)과 동일하다
 
 
 
 
 

03. 대량의 데이터 형식


문자형인 CHAR는 최대 255자까지, VARCHAR는 최대 16383자까지 지정이 가능하다.
그뿐만 아니라 더 큰 데이터 형식을 지정할 수 있는데,  형식은 아래과 같다.

데이터 형식바이트 수
TEXT 형식TEXT1 ~ 65535
LONGTEXT1 ~ 4294967295 (약 42억자)
BLOB 형식BLOB1 ~ 65535
LONGBLOB1 ~ 4294967295

 

이때 BLOB형식

Binary Long Object의 약자로, 글자가 아닌 이미지, 동영상 등의 데이터를 말한다.
그리고 이것을 "이진(Binary) 데이터"라고도 부른다.
 
대량의 텍스트, 대량의 이진테이터는
각각 LONGTEXT, LONGBLOB로 설정하며, 데이터는 최대 4GB까지 입력할 수 있다.
 
 
 
 

04. 실수형


실수형은 소수점이 있는 숫자를 저장할 때 사용한다.

데이터 형식바이트 수설명
FLOAT4소수점 아래 7자리까지 표현
DOUBLE8소수점 아래 15자리까지 표현

 
과학 기술용 데이터가 아닌 이상 FLOAT이면 충분하다.
 
 
 

05. 날짜형


날짜형은 날짜 및 시간을 저장할 때 사용한다.

데이터 형식바이트 수설명
DATE3날짜만 저장
YYYY-MM-DD 형식으로 사용
TIME3시간만 저장
HH:MM:SS 형식으로 사용
DATETIME8날짜 및 시간을 저장
YYYY-MM-DD HH:MM:SS 형식으로 사용

 
 
 

** 변수의 사용 

MySQL에서 변수의 선언값의 대입은 다음 형식을 따른다.

SET @변수이름 = 변수의 값; -- 변수의 선언 및 값 대입
SELECT @변수이름; -- 변수의 값 출력

 
변수는 MySQL 워크벤치를 재시작할 때까지는 유지되지만, 종료하면 없어진다.
그러므로 임시로 사용한다고 생각하면 된다.
 
 
 
market_db 데이터베이스를 지정한 후 SET으로 myVar1와 myVar2 변수를 선언해보자.
myVar1 변수에는 정수형, myVar2 변수에는 실수형 값이 대입되었다.

USE market_db;
SET @myVar1 = 5;
SET @myVar2 = 4.25;

 
 
SELECT를 이용해 변수 myVar1 내용을 출력하면 다음과 같으며,

SELECT @myVar1;

 

 
myVar1와 myVar2 변수끼리 연산한 후에 출력하면 다음과 같다.

SELECT @myVar1 + @myVar2;

 
 
변수를 선언하고 문자열 또는 정수를 대입   **8 더 적기

SET @txt = '가수 이름 ==> ';
SET @height = 166;
SELECT @txt, mem_name FROM member WHERE height> @height;

 
 
 
 
 
 

** 데이터 형 변환

 
데이터의 형 변환이란

문자형을 정수형으로 바꾸거나, 반대로 정수형을 문자형으로 바꾸는 것을 말한다.
 
이 데이터 형 변환은 크게 2가지 방식이 있는데, 이에 대해 각각 알아보자.
 
 
 
 

01. 함수를 이용한 명시적인 변환


 

명시적인 형 변환

직접 함수를 사용해서 데이터 형을 변환하는 방식이다.
 
이때 사용하는 변환함수는 CAST(), CONVERT()이다.

CAST ( 값 AS 데이터_형식 [(길이)] )
CONVERT ( 값, 데이터_형식 [(길이)] )

 
이 함수들은 형식만 다를 뿐 동일한 기능을 하며,
CHAR, SIGNED, UNSIGNED, DATE, TIME, DATETIME 등의 데이터 형식이 함수 안에 올 수 있다.

더보기

cf) SIGNED는 부호가 있는 정수, UNSIGNED는 부호가 없는 정수를 의미

 
변환 함수 사용 예시를 살펴보자.

SELECT CAST(AVG(price) AS SIGNED) '평균 가격' FROM buy;
SELECT CONVERT(AVG(price), SIGNED) '평균 가격' FROM buy;

 
CAST() 함수, CONVERT() 함수 모두 같은 실행결과가 나오는 것을 확인할 수 있다.
 
 
 
 
02. 암시적인 변환


암시적인 형 변환

함수를 사용하지 않고 데이터 형을 변환하는 방식이다.
 
 
 
CASE 1 ) 문자열의 자동 변환

SELECT '100'+'200';

 
문자는 더할 수 없으므로 자동으로 숫자 100과 200으로 변환해서 덧셈을 수행한다.
따라서 위 코드의 출력 결과는 300이다.

SELECT 100 + '200';

 
숫자 100은 원래부터 정수형 데이터 형이기에 200만 숫자로 반환되어 동일한 300의 결과가 나온다.
 
 
 
 
CASE 2 ) CONCAT() 함수
 

CONCAT() 함수는
문자를 이어주는 역할을 하는 함수이다.

 
 
아래의 예시와 같이 CONCAT()함수는
문자 '100'과 '200'을 연결하여 '100200'가 출력한다.

SELECT CONCAT('100','200');

>> 100200
 
 
CASE1의 예시처럼 숫자와 문자를 CONCAT()함수로 연결해보자.

SELECT CONCAT( 100,'200');

>> 100200
 
CASE1에서는 200이 정수형 데이터로 변환되어 300이라는 결과를 얻을 수 있었지만,
CASE2의 경우는 숫자 100이 문자 '100'으로 변환되어 연결되었다.