MySQL - 4.1 SQL 고급 문법 - MySQL의 데이터 형식

govlKH·2023년 6월 23일
0

SQL

목록 보기
5/17

4.1 MySQL의 데이터 형식

효율적인 SQL을 만들고 활용하기 위해서는 데이터의 내부적인 구성을 이해하는 것이 좋다. ex) 숫자형, 문자형, 날짜형 등

1. int 정수형

일반적인 INT : 내부적으로 4바이트 차지
TINYINT : 1
SMALLINT : 2
BIGINT : 8
(127, 32767, 2147483647, 9000000000000000000)

효율적으로 낭비를 하지 않기 위해 어떤 정보를 넣을 지에 따라 다르게 정해줘야 한다.
ex) 보통 100 이하인 나이를 입력하는데 굳이 INT로 할 필요 없이 TINYINT로도 충분하다.

++ TINYINT같은 경우 -128에서 128인데 이를 0부터 255로 변경해서 사용 가능 : 이렇게 사용한다면 '키' 에 대한 정보도 원래라면 SMALLINT로 2바이트를 사용해야 하지만, 1바이트로 적용시킬 수 있다.
how? TINYINT -> TINYINT UNSIGNED

2. CHAR 문자형

  • CHAR(10): 1~255바이트 vs VARCHAR(10): 1~16383바이트

    (VARCHAR의 효율성 : 혼공SQL 교재)
    BUT 무조건 좋은 것이 아니라 장단점이 존재
    : CHAR로 잡으면 속도가 빠르고, VARCHAR로 잡으면 공간의 효율성이 생긴다.
    따라서 글자의 길이가 고정된 경우에는 CHAR를 사용 (지역 : 서울, 경기, 강원)
    글자의 길이가 가변적인 경우에는 VARCHAR를 사용한다. (mem_name : 잇지, 방탄소년단, 블랙핑크)

++ 연락처 같은 경우는 ex)12341234 왜 INT를 사용하지 않고, CHAR(8)로 사용할까?
: 숫자형은 더하기/빼기의 연산에 의미가 있거나, 크다/작다와 같은 순서에 의미가 있기에 전화번호 같은 경우에는 굳이 숫자로 하지 않고 CHAR로 이용하여 효율성을 높인다.

  • 대량의 데이터 형식
    이 보다 큰 것들이 들어오면 어떻게 할 것인가? ex) 자막 정보, 동영상 정보(바이너리 데이터)
    => LONGTEXT / LONGBLOB 사용!
CREATE TABLE movie 
  (movie_id        INT,
   movie_title     VARCHAR(30),
   movie_director  VARCHAR(20),
   movie_star      VARCHAR(20),
   movie_script    LONGTEXT, 	# 자막
   movie_film      LONGBLOB		# 동영상
); 

3. FLOAT DOUBLE 실수형

FLOAT : 4바이트
DOUBLE : 8바이트

4. DATE 날짜형

DATE : 3바이트 날짜만 저장 : YYYY-MM-DD
TIME : 3 - 시간만 저장 : HH:MM:SS
DATETIME : 8 - 날짜 및 시간 저장 : YYYY-MM-DD HH:MM:SS 형식으로 사용

변수의 사용 (변수의 선언과 값의 대입)

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

하지만 이는 영구유지가 아닌, 임시로 저장되는 것!!
즉, 다른 사람이 접속하면 안 보인다.
따라서 변수는 임시의 값이며 잠시 사용하는 것이라 생각

변수에 값을 할당
SET @txt = '가수 이름==> ' ;
SET @height = 166;

변수를 이용한 구문
SELECT @txt , mem_name FROM member WHERE height > @height ;

여기서 문제 상황!!

SET @count = 3;
SELECT mem_name, height FROM member ORDER BY height LIMIT @count;

LIMIT을 걸기 위해 변수로 할당하고 구문을 작성했는데 에러가 발생
=> PREPARE 과 EXECUTE 이용!

SET @count = 3;
PREPARE mySQL FROM 'SELECT mem_name, height FROM member ORDER BY height LIMIT ?';   # 실행은 아직 아지 않고 준비만 해 놓는다.
EXECUTE mySQL USING @count;   # 진짜로 실행해보자! 변수를 통해 USING으로 물음표를 채워넣고 실행

데이터 형 변환 : 문자를 정수로 바꾸거나, 반대

직접 함수를 사용해서 강제로 변화시키는 '명시적인 변환'
별도의 지시 없이 자연스럽게 변환되는 '암시적인 변환'

  • 직접 함수를 사용해서 강제로 변화시키는 '명시적인 변환'
CAST ( 값 AS 데이터_형식 [ (길이) ])
CONVERT ( 값, 데이터_형식 [ (길이) ])

ex)
SELECT AVG(price) '평균 가격' FROM buy;
: 평균 가격이 142.9167일 때 이를 정수로 변환

# SIGNED : 부호가 있는 정수형
SELECT CAST(AVG(price) AS SIGNED)  '평균 가격'  FROM buy ;
또는
SELECT CONVERT(AVG(price) , SIGNED)  '평균 가격'  FROM buy ;
로 반올림

ex2) CONCAT을 통한 문자형 이어서 표현하기
SELECT num, CONCAT(CAST(price AS CHAR), 'X', CAST(amount AS CHAR) ,'=' ) AS '가격X수량', price*amount AS '구매액' 
        FROM buy ;

  • 별도의 지시 없이 자연스럽게 변환되는 '암시적인 변환'
SELECT '100' + '200' ; -- 문자와 문자를 더함 (정수로 변환되서 연산됨)
: 300
SELECT CONCAT('100', '200'); -- 문자와 문자를 연결 (문자로 처리)
: 100200
SELECT CONCAT(100, '200'); -- 정수와 문자를 연결 (정수가 문자로 변환되서 처리)
: 100200
SELECT 1 > '2mega'; -- 정수인 2로 변환되어서 비교
: 0 (False)
SELECT 3 > '2MEGA'; -- 정수인 2로 변환되어서 비교
: 1 (True)
SELECT 0 = 'mega2'; -- 문자는 0으로 변환됨
: 0 = 0 이기에 True로 1이 나옴
profile
수학과 대학원생. 한 걸음씩 꾸준히

0개의 댓글