SQL

[혼공s] 3주차 학습 내용 정리

gini1031 2024. 7. 18.

 
 
 

0. 들어가며

이전 블로그에서 얘기했듯이, 블로그 쓰는 방법을 조금 바꿔보려 한다. 내가 공부한 내용 위주로 좀 더 얘기해보려고 하는데, 그렇다고 아예 개념 정리를 내려놓을 수는 없을  것 같아 게시물을 나누기로 결정했다. 여기에선 개념 정리를 위주로 애기해보도록 하겠다 😉
 


 

1.  데이터 형식

처음 테이블을 만들 때, 우리는 각 열에 들어가는 데이터에 대한 형식을 정해줘야 한다. 데이터 형식은 정수형, 실수형과 같은 숫자 타입, 문자 타입 등 다양하게 존재한다. 그리고 신기한 점은, 다른 언어와는 다르게 SQL에는 날짜 타입이 존재한다. 블로그에서는 책에 나온 내용과 더불어, 추가적으로 찾아본 데이터 형식도 조금 이야기해보고자 한다.
 

 

1-1. 숫자 타입

숫자 타입은 크게 정수형과 실수형으로 나눌 수 있다.
 
정수형

데이터 형식 바이트 수 signed 숫자 범위 unsigned 숫자 범위
TINYINT 1 -128 ~ 127 0 ~ 255
SMALLINT 2 -32,768 ~ 32,767 0 ~ 65,535
MEDIUMINT 3 -8,388,608 ~. ,388,607 0 ~ 16,777,215
INT 4 약 -21억 ~ 21억 0 ~ 약 42억
BIGINT 8 약 -900경 ~ 900경 0 ~ 약 1800경

 

이때 signed와 unsigned는 각각 음수의 범위를 사용할 것인지 아닌지를 정해준다. 모든 데이터 타입의 기본은 signed로 설정되어 있으며, unsigned라는 키워드를 붙일 때 해당 범위 내에 있는 숫자를 저장할 수 있게 된다.

 

실수형

데이터 형식 바이트 수 설명
DECIMAL(M, d) 5 ~ 17 전체 자릿수 M과 소수점 이하 자릿수 d를 이용하여 고정 소수점 표현 가능
FLOAT 4 소수점 아래 7자리까지 표현 가능
DOUBLE 8 소수점 아래 15자리까지 표현 가능

 

숫자 타입은 나타내고 싶은 데이터에 따라 선택된다. 만일 정확한 수치를 나타내고 싶다면 정수형 혹은 DECIMAL을, 근사치를 나타내고 싶다면 FLOAT 혹은 DOUBLE을 사용하면 된다. 그런데 여기에서 똑같은 실수형임에도 불구하고 DECIMAL과 FLOAT, DOUBLE이 구분되는지에 대한 의문점이 들 수 있다. 그 이유는 DECIMAL은 고정 소수점이고, FLOAT과 DOUBLE은 부동 소수점이기 때문이다.

 

 

그렇다면 간단하게나마 고정 소수점과 부동 소수점은 무엇인지에 짚고 넘어가자.

 

고정 소수점

: 소수점 위치가 고정된 숫자를 나타내며, 금융 데이터나 통화 데이터와 같이 소수점 이하의 정확한 자릿수를 유지해야 하는 경우에 사용된다.

부동 소수점

: 소수점 위치가 가변적인 숫자를 나타내며, 과학적 계산, 통계 등과 같이 큰 숫자 범위와 상대적인 정밀도를 필요로 하는 경우에 주로 사용된다.

 

고정 소수점과 부동 소수점의 특징은 다음과 같다.

고정 소수점 부동 소수점
1. 소수점 이하의 자릿수를 정확하게 저장한다.

2. 정밀도를 유지하기 위해 범위가 제한적이다.

3. 자릿수에 따라 고정된 메모리 공간을 사용한다.
(바이트 수가 범위로 지정되어 있는 이유)
1. 소수점 이하 자릿수에서 근사값을 사용하여 정밀도가 떨어질 수 있다.

2. 매우 큰 숫자 범위 표현이 가능하다.

3. 고정된 크기의 메모리 공간을 사용하지만, 표현 가능 범위는 넓다.

 

위의 특징을 참고하여 저장하고자 하는 데이터에 따라 알맞은 데이터 형식을 사용하면, 메모리를 효율적으로 사용할 수 있는 이점이 있다.

 

 

1-2. 문자열 타입

 

데이터 형식 바이트 수 설명
CHAR 1 ~ 255 고정 길이 문자열
VARCHAR 1 ~ 16383 가변 길이 문자열
BINARY 1 ~ 255 고정 길이 이진 데이터
VARBINARY 1 ~ 16383 가변 길이 이진 데이터

 

문자열 타입의 경우, 문자열의 길이를 고정해놓는 고정 길이 형식과, 최대 길이를 정해놓고 저장되는 데이터의 길이에 따라 사용되는 바이트 수가 달라지는 가변 길이 형식으로 나누어진다. 일반적으로 기본 데이터 형식에 VAR이 붙어있으면 가변 길이 문자열이다.

 

그렇다면 두 가지의 데이터 형식은 언제 사용하는 것이 좋을까?

먼저 고정 길이 문자형의 경우, (한국인의 이름이 모두 3글자라고 가정할 때) 이름에 대한 데이터는 3글자로 동일하다. 이때 고정 길이 문자형을 이용하여 메모리의 사이즈를 정해주면, 메모리를 보다 더 효율적으로 사용할 수 있다.

가변 길이 문자형의 경우, 문자열의 길이가 다양한 데이터가 들어와야 할 때 사용하면 낭비되는 메모리를 최소화할 수 있다.

 

그렇다면 가변 길이 문자형의 작동 방식은 어떻게 될까?

가변 길이 문자형은 고정 길이 문자형과는 다르게 데이터의 길이에 대한 정보를 저장한다.

만일 해당 열에 'hello'라는 데이터가 들어왔다고 가정해보자. 'hello'의 길이는 5이기 때문에, 5라는 길이 정보가 1바이트 먼저 저장된다. 이후 다음 공간부터 hello라는 문자열이 저장된다. 즉 가변 길이 문자형에서는 데이터의 길이 정보(1바이트) + 데이터의 길이 만큼 공간을 사용한다.

(만일 글자가 255자를 넘어가는 경우, 길이 정보 저장시 2바이트를 사용한다.)

 


 

우리가 책에 들어가는 글자들, 영화에 들어가는 자막을 저장해야 한다면, 앞서 말한 데이터 형식들로 저장하기엔 저장 공간이 턱없이 부족할 것이다. 그렇기에 SQL에는 대용량의 데이터를 저장하기 위한 데이터 형식도 존재한다.

 

데이터 형식 바이트 수 설명
TEXT 1 ~ 65535 가변 길이 문자열
LONGTEXT 1 ~ 4294967295 가변 길이 문자열
BLOB 1 ~ 65535 가변 길이 이진 데이터
LONGBLOB 1 ~ 4294967295 가변 길이 이진 데이터

 

위의 데이터 형식은 앞서 말했던 데이터 형식에서 저장 공간만 늘어난 것이라 봐도 무방하다. 그러나 대량 데이터 형식에서는 고정 길이가 아닌, 모두 가변 길이 문자열이라는 것만 알아두고 넘어가자.

 

 

1-3. 날짜 타입

날짜형

: 날짜 및 시간을 저장할 때 사용

 

데이터 형식 바이트 수 설명
DATE 3 YYYY-MM-DD 형식의 날짜 저장
TIME 3 HH:MM:SS 형식의 시간 저장
DATETIME 8 YYYY-MM-DD HH:MM:SS 형식의 날짜 및 시간 저장

 

날짜형의 경우, 물품을 구매한 날짜, 시간 등을 저장할 때 유용하게 사용된다.

 

 

 

2. 변수

혼공s의 변수 파트에서는 사실 사용자 정의 변수에 대해서만 이야기하고 있다. 그러나 SQL에도 다른 일반적인 프로그래밍 언어와 같이 지역 변수, 전역 변수 등을 가지고 있다. 여러가지 변수에 대해 알아보자.

 

 

2-1. 사용자 정의 변수 (User-Defined Variables)

사용자 정의 변수는 변수를 선언한 세션에서만 사용이 가능하고, 다른 세션에서는 사용이 불가한 변수이다. 변수에 대한 선언과 사용은 다음과 같다.

SET @var_name = value ; -- 변수 선언 및 값 대입
SELECT @var_name ; -- 변수 값 출력

 

사용자 정의 변수의 경우 변수명 앞에 '@'를 붙이는 것이 특징이다. 이 변수는 일반적으로 일시적인 데이터를 저장하고 쿼리 내에서 재사용할 떄 사용된다. 

 

 

2-2. 세션 변수 (Session variables)

세션 변수는 사용자 정의 변수와 유사하게 한 세션에서만 유지되는 변수이다. 그러나 사용자 정의 함수와 다른 점은, 세션 함수는 세션에 대한 설정을 저장한다는 것이다. 일반적으로 세션 변수는 mySQL에 대한 서버 설정을 제어하는 데에 사용된다. 먼저 세션 변수를 사용하는 방법을 보자.

SET SESSION var_name = value ; -- 세션 변수 설정
SHOW VARIABLES LIKE 'var_name' ; -- 세션 변수 값 확인
SELECT @@session.var_name ; -- 세션 변수 값 확인

 

세션 변수는 사용자 정의 변수와 다르게 '@'를 사용하지 않는 대신, 변수를 선언할 때 'SESSION'이라는 키워드를 함께 붙여주어야 한다. 세션 변수 값을 확인하기 위해선 'SHOW VARIABLE LIKE' 혹은 'SELECT'를 사용해주면 된다.

 

 

2-3. 전역 변수 (Global Variables)

전역 변수는 mySQL 서버 전체에 영향을 미치며, 서버가 가동되는 동안 계속 유지된다.

SET GLOBAL var_name = value ; -- 변수 선언 및 값 대입
SHOW VARIABLE LIKE 'var_name' ; -- 전역 변수 값 확인
SELECT @@global.var_name ; -- 전역 변수 값 확인

 

전역변수를 선언하려면 'GLOBAL' 키워드를 써주면 된다. 또한 전역 변수 값을 확인하는 방법은 세션 변수와 동일하다.

 

 

2-4. 로컬 변수 (Local Variables)

로컬 변수는 스토어드 프로시저나 트리거 내에서 사용되며, 프로시저나 트리거가 실행되는 동안에만 존재한다. 로컬 변수 사용 방법은 다음과 같다.

DELIMITER //
CREATE PROCEDURE myProcedure()
BEGIN
    DECLARE var_name data_type ; -- 로컬 변수 선언
    SET var_name = value ; -- 변수 값 대입
    SELECT var_name ; -- 변수 값 사용
END //
DELIMITER ;

 

로컬 변수는 다른 변수들과는 다르게 변수 선언 시 'DECLARE' 명령어를 사용하며, 데이터 타입을 명시해주어야 한다는 것이다. 변수를 사용하고자 할 땐 다른 변수들과 동일하게 'SELECT'를 사용해주면 된다.

 

 

 

3. SQL 프로그래밍

이전 블로그에서도 말했듯이, SQL에서도 프로그래밍이 가능하다. 우리가 일반적으로 프로그래밍을 한다 생각하면, 조건문, 반복문 등 가양한 문법들을 사용하기 마련이다. 이 목차에서는 SQL에서 사용하는 프로그래밍 문법들을 이야기해보고자 한다.

 

 

3-1. IF문

if문은 말 그대로 조건을 문법이다. if문의 기본 형식은 다음과 같다.

BEGIN
    IF <condition> THEN
        command...
        command...
    ELSE
        command...
    END IF;
END $$

 

먼저 위의 형식을 보면 앞뒤로 'BEGIN'과 'END' 써있는 것을 볼 수 있는데, 만일 if문 안에 명령어가 하나만 들어있다면 이를 생략해도 된다. 그러나 일반적으로 명령어가 한 줄만 들어가진 않기 때문에, 써주는 습관을 들이는 것이 좋다.

SQL에서의 if문에서 한 가지 불편한 점이 있다면, 다른 프로그래밍 언어와는 달리 if else를 사용하지 못한다는 것이다. 만일 SQL에서 여러 조건을 주고 싶다면, if문 대신 case문을 사용해주면 된다.

 

 

3-2. CASE문

CASE문은 if문과 달리 조건을 여러 개 설정할 수 있다. CASE문의 형식은 다음과 같다.

CASE
    WHEN condition1 THEN
        command...
    WHEN condition2 THEN
        command...
    WHEN condition3 THEN
        command...
    ELSE
        command...
END CASE ;

 

CASE문은 'CASE'와 'END CASE' 사이에 'WHEN ... THEN' 문장을 삽입하여 여러 조건을 줄 수 있다. 또한 모든 조건이 부합하지 않을 경우 마지막 ELSE문을 통해 조건을 주면 된다.

 

 

3-3. WHILE문

while문은 조건식이 참일 동안에 특정 명령들을 반복하도록 돕는다. while문의 형식은 다음과 같다.

WHILE condition DO
    command...
END WHILE ;

 

만일 while 문을 진행하던 중 특정 조건에서 명령을 뛰어넘거나 while문을 종료하고 싶다면 각각 ITERATE와 LEAVE를 사용해주면 된다.

ITERATE는 C언어의 continue를, LEAVE는 break를 생각하면 쉽다.

 

 

 

4. 3주차 숙제

 

4-1. 기본 숙제

 

 

 

4-2. 추가 숙제

 

 

 

5. 마치며

아무래도 조인은 중요하다는 생각이 들어, 따로 다시 정리할 예정이라 이번 블로그에서는 내용을 빼게 되었다. 최대한 빠른 시일 내로 올릴 수 있도록 해야겠다 🥹

아 그리고 2주차 우수 혼공족으로 선정된 게 생각보다 너무 행복했다 !! 다음에도 우수 혼공족이 될 수 있도록 노력해야지 !!!!

댓글