4. SQL 고급 문법 - 1. MySQL의 데이터 형식.

하쮸·2024년 10월 14일

SQL

목록 보기
4/6
post-thumbnail

1. MySQL의 데이터 형식.

  • 테이블을 만들 때는 데이터 형식을 설정해야 함.
    • 데이터 형식에는 크게 숫자형, 문자형, 날짜형이 있음.
    • 다양한 데이터 형식이 존재하는 이유는 실제로 저장될 데이터의 형태가 다양하기 때문.
    • 각 데이터에 맞는 데이터 형식을 지정함으로써 효율적으로 저장할 수 있음.
      • 데이터를 저장하기 위해서는 적절한 데이터 형식을 지정해야 함.

1-1. 데이터 형식.

  • MySQL에서 제공하는 데이터 형식의 종류는 수십 개.
  • 각 데이터 형식마다 크기나 표현할 수 있는 숫자의 범위가 다름.

1-1-1. 정수형.

  • 정수형은 소수점이 없는 숫자.
    • 인원 수, 가격, 수량 등에 많이 사용됨.
데이터형식바이트 수숫자 범위
TINYINT1-128 ~ 127
SMALLINT2-32,768 ~ 32,767
INT4약 -21억 ~ +21억
BIGINT8dir -900경 ~ +900경
  • Ex) 평균 키를 저장할 때
    • TINYINT를 고려할 수 있지만 최대값이 +127임.
      • 이럴 때 값의 범위가 0부터 시작하는 UNSIGNED 예약어를 사용할 수 있음.
      • TINYINTTINYINT UNSIGNED 모두 1바이트.
        • 1byte는 256개를 표현하므로
        • TINYINT : -128 ~ +127
        • TINYINT UNSIGNED : 0 ~ 255
          • TINYINT UNSIGNED를 사용하면 효율적으로 저장할 수 있음.
  • 각 형식의 범위를 벗어나면 Out of range 에러 발생.

1-1-2. 문자형.

  • 문자형은 글자를 저장하기 위해 사용함.
  • 입력할 최대 글자의 개수를 지정해야 함.
데이터 형식바이트 수
CHAR(개수)1 ~ 255
VARCHAR(개수)1 ~ 16383
  • CHAR는 문자를 의미하는 Character의 약자.
    • 고정길이 문자형이라고 함.
    • 자릿수가 고정되어 있음.
  • VARCHAR(Variable Character)는 가변길이 문자열.
  • VARCHARCHAR보다 공간을 효율적으로 운영할 수 있지만, MySQL 내부적으로 성능면에서는 CHAR로 설정하는 것이 조금 더 좋음.
    • CHAR는 글자의 개수가 고정된 경우, VARCHAR는 글자의 개수가 변동될 경우에 사용.
  • Ex) 전화번호는 정수형 or 문자형?
    • 제일 앞에 0을 붙여야 되는 경우도 있는데 정수형으로 지정하면 0이 사라짐.
    • 그래서 문자형으로 지정하는 것이 좋음.
    • 또한 전화번호가 숫자로서 의미가 없음.
      • 숫자로서 의미를 가지려면 2가지 중 1가지는 충족해야 됨.
        • 더하기 / 빼기 등의 연산에 의미가 있을 때.
        • 크다 / 작다 또는 순서에 의미가 있을 때.
    • 데이터가 숫자 형태라도 연산이나 크기에 의미가 없다면 문자형으로 지정하는 것이 좋음.

1-1-3. 대량의 데이터 형식.

  • 문자형인 CHAR는 최대 255자까지, VARCHAR는 최대 16383자까지 지정이 가능함.
데이터 형식 바이트 수
TEXT 형식 TEXT 1 ~ 65,535
LONGTEXT 1 ~ 4,294,967,295
BLOB 형식 BLOB 1 ~ 65,535
LONGBLOB 1 ~ 4,294,967,295
  • LONGTEXTLONGBLOB로 설정하면 각 데이터는 최대 4GB까지 입력할 수 있음.
  • TEXT는 소설이나 영화 대본과 같은 내용을 저장할 때 필요한 데이터 형식.
  • BLOBBinary Long Object의 약자. 글자가 아닌 이미지, 동영상 등의 데이터라고 생각.
    • 이런 것을 이진(Binary) 데이터라고 부름.
    • 테이블에 사진 or 동영상 같은 것을 저장하고 싶다면 BLOB or LONGBLOB로 데이터 형식을 지정.

1-1-4. 실수형.

  • 실수형은 소수점이 있는 숫자를 저장할 때 사용함.
데이터 형식바이트 수설명
FLOAT4소수점 아래 7자리까지 표현.
DOUBLE8소수점 아래 15자리까지 표현.
  • FLOATDOUBLE은 거의 비슷함.
    • 소수점 아래 어디까지 정밀하게 표현하는지의 차이.

1-1-5. 날짜형.

  • 날짜형은 날짜 및 시간을 저장할 때 사용함.
데이터 형식바이트 수설명
DATE3날짜만 저장. YYYY-MM-DD 형식.
TIME3시간만 저장. HH:MM:SS 형식.
DATETIME8날짜 및 시간을 저장. YYYY-MM-DD HH:MM:SS 형식.
  • DATE는 날짜만, TIME은 시간만 저장하고, DATETIME은 날짜와 시간 둘 다 저장함.
    • 날짜 or 시간을 입력할 때는 문자와 마찬가지로 작은따옴표로 묶어줘야 함.

1-2. 변수의 사용.

  • SQL도 다른 일반적인 프로그래밍 언어처럼 변수를 선언하고 사용할 수 있음.
    • SET @변수이름 = 변수의 값;
      • 변수의 선언 및 값 대입.
    • SELECT @변수이름;
      • 변수의 값 출력.
  • 변수는 MySQL Workbench를 재시작할 때까지는 유지되고, 종료하면 없어짐.
    • 즉, 임시로 사용.
  • SELECT문에서 행의 개수를 제한하는 LIMIT와 변수는 함께 사용하지 못함.
    • SET @count = 3;
       SELECT .... LIMIT @count;
    • 이를 해결하는 것이 PREPAREEXECUTE.

      • PREPARE는 실행하지 않고 SQL문만 준비해놓고 EXECUTE에서 실행하는 방식.

      • SET @count = 3;
        PREPARE mySQL FROM 'SELECT .... LIMIT ?';
        EXECUTE mySQL USING @count;
        
      • PREPARE'SELECT ~~ LIMIT ?'문을 실행하지 않고 mySQL이라는 이름으로 준비만 해놓음.

        • ?는 '현재는 모르지만 나중에 채워짐 정도'로 이해.
      • EXECUTEmySQL에 저장된 SELECT문을 실행할 때 USING으로 ?@count변수의 값을 대입하는 것.


1-3. 데이터 형 변환.

  • 문자형 -> 정수형 or 정수형 -> 문자형으로 바꾸는 것을 데이터의 형 변환(type conversion)이라고 함.
    • 직접 함수를 사용해서 변환하는 명시적인 변환(explicit conversion)
    • 별도의 지시 없이 자연스럽게 변환되는 암시적인 변환(implicit conversion)

1-3-1. 함수를 이용한 명시적인 변환.

  • 데이터 형식을 변환하는 함수는 CAST(), CONVERT().
    • 형식만 다를 뿐 동일한 기능을 함.
CAST (값 AS 데이터 형식 [ (길이) ]
CONVERT (값, 데이터 형식 [ (길이) ]
  • CAST()CONVERT() 함수 안에 올 수 있는 데이터 형식은 CHAR, SIGNED, UNSIGNED, DATE, TIME, DATETIME 등.

1-3-2. 암시적인 변환.

  • 암시적인 변환은 CAST() or CONVERT()함수를 사용하지 않고도 자연스럽게 형이 변환되는 것.
SELECT '100' + '200';

실행결과
300
SELECT CONCAT('100', '200');

실행결과
100200
  • CONCAT() 함수는 문자를 이어주는 역할을 함.
SELECT CONCAT(100, '200');
SELECT 100 + '200';

실행결과
100200
300
  • 숫자와 문자를 CONCAT()함수로 연결

    • 숫자 100이 문자 '100'으로 변환되어서 연결 되었음.
  • CONCAT()함수를 사용하지 않고 숫자 100과 문자 '200'을 더하면 뒤의 문자가 숫자 200으로 자동 변환되어 300이 출력됨.

  • 숫자와 문자를 연산할 때 CONCAT()을 사용하면 숫자는 문자로 변하고, 더하기만 사용하면 문자가 숫자로 변환 후 연산됨.

profile
Every cloud has a silver lining.

0개의 댓글