[혼공SQL] chapter 4. SQL 고급 문법(1)

여정이·2024년 1월 17일
0

혼자 공부하는 SQL

목록 보기
10/28

📒 요약 : 테이블에 데이터를 입력할 때에는 데이터 형식을 지정해주어야 한다. 저장될 데이터는 숫자, 문자, 날짜 등 그 형태가 다양하기 때문에 각 데이터에 맞는 데이터 형식을 지정해주어야 데이러를 효율적으로 관리할 수 있다.

데이터 형식

1. 정수형

정수형은 소수가 없는 숫자로, 그 크기와 범위에 따라 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

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
);



2. 문자형

문자형은 글자를 저장하기 위한 데이터 형태로, 입력할 최대 글자의 개수를 지정해야 한다. 대표적인 문자형은 아래 표와 같다.

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

CHAR는 문자를 의미하는 Character의 약자로, 길이가 고정된 문자형이다. 예를 들어 CHAR(10)에 '가나다' 3글자를 저장한다면 10자리의 공간을 확보한 후 그 중 3자리만 사용하고 나머지 7자리는 낭비하게 된다. 반면 VARCHAR는 길이가 변하는 문자형으로, VARCHAR(10)에 '가나다' 3글자를 저장할 경우 3자리만 사용하여 공간의 낭비가 없다. 이처럼 VARCHAR는 공간을 효율적으로 이용할 수 있지만 연산을 처리하는 속도는 CHAR가 더 빠르니 상황에 맞게 적절한 데이터 형을 선언하면 될 것이다.



3. 대량의 데이터 형식

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의 약자로, 글자가 아닌 이미지 혹은 동영상 등의 데이터를 저장하는 형식이다.



4. 실수형

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

데이터 형식 바이트 수 설명
FLOAT 4 소수점 아래 7자리까지 표현
DOUBLE 6 소수점 아래 15자리까지 표현

FLOATDOUBLE은 거의 비슷하다. 소수점 아래를 어디까지 정밀하게 표현하는지의 차이이다.


5. 날짜형

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

데이터 형식 바이트 수 설명
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에서는 변수를 사용할 수 없음에 주의하자. 대신 PREPAREEXECUTE를 활용할 수 있는데, 아래의 예시를 보자.

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()함수를 이용하면 된다.

0개의 댓글