📒 요약 : 테이블에 데이터를 입력할 때에는 데이터 형식을 지정해주어야 한다. 저장될 데이터는 숫자, 문자, 날짜 등 그 형태가 다양하기 때문에 각 데이터에 맞는 데이터 형식을 지정해주어야 데이러를 효율적으로 관리할 수 있다.
정수형은 소수가 없는 숫자로, 그 크기와 범위에 따라 4종류가 있다.
데이터 형식 | 바이트 수 | 숫자 범위 |
TINYINT | 1 | -128~127 |
SMALLINT | 2 | -32,768~32,767 |
INT | 4 | 약 -21억~+21억 |
BIGINT | 8 | 약 -900경~+900경 |
market_db 데이터베이스에 간단한 테이블 하나를 만들어 각 열에 들어갈 데이터 형식을 지정해보자.
USE market_db;
CREATE TABLE hongong4(
tinyint_col TINYINT,
smallint_col SMALLINT,
int_col INT,
bigint_col BIGINT
);
tinyint_col 열에 256같이 데이터 형식이 가지는 범위를 벗어난 값을 입력하면 out of range라는 오류가 발생할 것이다. 그러니 오류가 발생하지 않게 하려면 각 데이터 형식에 맞는 정수를 입력해야 한다.
간단하게 모든 열에 BIGINT를 쓰면 범위를 고려할 필요 없이 데이터를 입력할 수 있는데, 작은 범위의 데이터 형식은 왜 있는걸까? 그것은 표의 '바이트 수'를 보면 알 수 있다. 데이터의 바이트 수가 크면 그 만큼 데이터를 저장하는 데 필요한 공간이 커진다는 의미이다. 컴퓨터의 자원은 한정되어 있기에 이 공간을 효율적으로 써야 하는데, 10을 저장하기 위해 커다란 BIGINT를 위한 공간을 만든다면 그 만큼 자원을 낭비한다는 의미이다. 그래서 데이터를 입력할 때 어떤 데이터를 입력할 지, 그 크기를 고려하여 데이터 형식을 정하는 것이 좋다.
UNSIGNED는 음수를 양수로 넘겨주는 개념이라고 생각하면 된다. 예를 들어, TINYINT로 지정된 열에 200을 입력하고 싶지만, 범위를 벗어난다. 그렇다고 SMALLINT로 선언하기에는 1바이트를 더 사용해야 한다. 이럴 때 데이터 형식에 UNSIGNED를 붙여 사용할 수 있는 양수의 범위를 늘려줄 수 있다. 예를 들어, 다음과 같이 TINYINT UNSIGNED를 사용한다면 0~256까지의 범위의 데이터를 입력할 수 있게 된다. 이는 나머지 정수형 데이터에도 해당이 되는 내용이니 기억해두도록 하자.
USE market_db;
CREATE TABLE hongong4(
tinyint_col TINYINT UNSIGNED,
smallint_col SMALLINT,
int_col INT,
bigint_col BIGINT
);
문자형은 글자를 저장하기 위한 데이터 형태로, 입력할 최대 글자의 개수를 지정해야 한다. 대표적인 문자형은 아래 표와 같다.
데이터 형식 | 바이트 수 |
CHAR(개수) | 1~255 |
VARCHAR(개숰) | 1~16383 |
CHAR는 문자를 의미하는 Character의 약자로, 길이가 고정된 문자형이다. 예를 들어 CHAR(10)에 '가나다' 3글자를 저장한다면 10자리의 공간을 확보한 후 그 중 3자리만 사용하고 나머지 7자리는 낭비하게 된다. 반면 VARCHAR는 길이가 변하는 문자형으로, VARCHAR(10)에 '가나다' 3글자를 저장할 경우 3자리만 사용하여 공간의 낭비가 없다. 이처럼 VARCHAR는 공간을 효율적으로 이용할 수 있지만 연산을 처리하는 속도는 CHAR가 더 빠르니 상황에 맞게 적절한 데이터 형을 선언하면 될 것이다.
CHAR과 VARCHAR 각각 최대 255자, 16383자까지 지정이 가능하다. 최대 글자의 길이가 한정되어 있기에 길이가 긴 뎅터는 저장할 수 없다. 그래서 더 큰 데이터를 저장하려면 아래와 같은 형식을 사용해야 한다.
데이터 형식 | 바이트 수 | |
TEXT 형식 | TEXT | 1~65535 |
LONGTEXT | 1~4294967295 | |
BLOB 형식 | BLOB | 1~65535 |
LONGBLOB | 1~4294967295 |
TEXT로 지정하면 최대 65535자까지, LONGTEXT로 지정하면 최대 약 42억자까지 저장이 가능하다. BLOB 형식은 Binary Long Object의 약자로, 글자가 아닌 이미지 혹은 동영상 등의 데이터를 저장하는 형식이다.
실수형은 소수점이 있는 숫자를 저장할 때 사용한다.
데이터 형식 | 바이트 수 | 설명 |
FLOAT | 4 | 소수점 아래 7자리까지 표현 |
DOUBLE | 6 | 소수점 아래 15자리까지 표현 |
FLOAT와 DOUBLE은 거의 비슷하다. 소수점 아래를 어디까지 정밀하게 표현하는지의 차이이다.
날짜형은 날짜 및 시간을 저장할 때 사용한다.
데이터 형식 | 바이트 수 | 설명 |
DATE | 3 | 날짜만 저장. YYYY-MM-DD 형식으로 사용 |
TIME | 3 | 시간만 저장. HH:MM:SS 형식으로 사용 |
DATETIME | 8 | 날짜 및 시간을 저장. YYYY-MM-DD HH:MM:SS 형식으로 사용 |
DATE는 날짜만, TIME은 시간만 저장한다. 날짜와 시간을 모두 저장하고 싶으면 DATETIME을 사용한다.
SQL도 다른 프로그래밍 언어처럼 변수를 선언하고 사용할 수 있다. 변수의 선언과 값의 대입은 아래의 형식을 따른다.
SET @변수이름 = 변수의 값;
SELECT @변수이름
아래의 예시 코드는 변수를 선언하고 숫자를 대입, 출력, 연산 후 출력 그리고 변수를 사용하여 조건문을 이용해보는 것이다. 지금까지 배운 내용과 다른 프로그래밍 언어에서 사용하는 형식을 조합해본다면 쉽게 해석이 가능할 것이다.
USE market_db
SET @myVar1 = 5;
SET @myVar2 = 4.25;
SELECT @myVar1;
SELECT @myVar1 + @myVar2;
SET @txt = '가수 이름 ==> ';
SET @height = 166;
SELECT @txt, mem_name FROM member WHERE height> @height;
이처럼 조건문에서도 변수를 사용할 수 있는데, LIMIT에서는 변수를 사용할 수 없음에 주의하자. 대신 PREPARE와 EXECUTE를 활용할 수 있는데, 아래의 예시를 보자.
SET @count = 3;
PREPARE example FROM 'SELECT mem_name, height FROM member ORDER BY height LIMIT ?';
EXECUTE example USING @count;
먼저 count 변수에 3을 대입해주었다. 이후 PREPARE는 SELECT문을 실행하지 않고 example이라는 이름으로 준비만 해 둔다. LIMIT 뒤에 오는 ?는 지금은 모르지만 나중에 채워진다는 의미이다. 이후 EXECUTE문에서 example을 실행할 때, count 변수를 사용하게 함으로써 결론적으로 LIMIT 값을 3으로 두어 SQL문을 실행하게 된다.
문자형을 정수형으로 바꾸거나 반대로 정수형을 문자형으로 바꾸는 것을 데이터의 형 변환이라고 한다. 형 변환은 명시적인 변환과 암시적인 변환이 있다.
데이터 형식을 변환하는 함수는 CAST(), CONVERT()이다. 기본형은 아래와 같다.
CAST(값 AS 데이터_형식 [(길이)]
CONVERT(값, 데이터_형식 [(길이)]
간단한 예시를 보자.
SELECT AVG(price) AS '평균 가격' FROM buy;
SELECT CAST(AVG(price) AS SIGED) FROM buy;
CONVERT(AVG(price), SIGNED) FROM buy;
아래의 두 줄은 같은 기능을 한다. CAST()와 CONVERT() 안에 들어올 수 있는 데이터 형식은 CHAR, SIGNED, UNSIGNED, DATE, TIME, DATETIME 등이 있다.
다양한 구문자를 날짜형으로 변경할 수도 있다.
SELECT CAST('2024$01$01' AS DATE);
SELECT CAST('2024/01/01' AS DATE);
SELECT CAST('2024%01%01' AS DATE);
SELECT CAST('2024@01@01' AS DATE);
암시적인 변환은 CAST()나 CONVERT()함수를 사용하지 않고도 자연스럽게 데이터 형식이 변환되는 것을 말한다. 예를 들어, 아래처럼 문자 '1'과 '2'를 더했을 때, 문자는 더할 수 없으므로 암시적으로 숫자 1과 2로 인식하여 덧셈을 수행한다.
SELECT '1' + '2';
만약 문자 1과 2를 그대로 더하여 '12'를 만들고 싶다면 CONCAT()함수를 이용하면 된다.