[mySQL] 형변환 , 데이터 타입, DATE_FORMAT(), FORMAT()

merci·2022년 11월 29일
0

mySQl 기초

목록 보기
3/11
post-thumbnail

본문에 들어가기 앞서서 간단한 함수를 보자

SELECT NOW() FROM DUAL; 

now() 함수는 현재 시간을 출력해준다

데이터 입력과 출력을 하려고 할때 타입이 맞지 않아서 원하는 데이터를 얻지 못 할 경우
형변환을 이용하자.




묵시적 변환

자동변환, 암시적 변환이라고도 하는데
mySQL 은 데이터를 자동적으로 우선순위가 높은 타입으로 변환시켜준다.
우선은 정수타입이 문자타입보다 우선순위가 높다고만 알아두자.

  • '20' + '200' 는 '안에' 있는 데이터를 정수타입으로 변환시켜 220이 나온다.
  • 데이터 타입이 정수인 컬럼에 '2mega' 를 넣었다면 2mega 로 출력 된다.
  • concat('10','30') 은 데이터를 이어서 출력하므로 1030이 출력 된다.



하지만 이러한 묵시적 변환을 이용하면 원하지 않는 변환이 발생하여 의도와 다른 데이터를 얻게 된다.




명시적 변환

cast()convert() 를 이용해서 명시적 변환을 할 수 있다

 CAST('[변환 시킬 데이터]' AS [데이터형식])
 CONVERT('[변환 시킬 데이터]', [데이터형식])

입력해보면

select cast(now() as signed) from dual; 

select convert(now(), date) from dual;







데이터 타입

데이터에도 타입이 있다.
주로 쓰이는 것들을 간단히 표로 살펴보자

데이터 타입설명
CHAR(n)1 ~ 255 bytes
VARCHAR(n)1 ~ 65535 bytes
INT약-21억 ~ 21억 (4bytes)
BIGINT약-900경 ~ 900경 (8bytes)
FLOAT-3.40E+38 ~ -1.17E-38 (8bytes) 소수점 이하 7자리까지
DOUBLE-1.22E-308 ~ -1.17E-38 (8bytes) 소수점 이하 15자리까지
DECIMAL(m,d)-1038+1 ~ 1038-1 전체자릿수(m), 소수점 이하 자릿수(d)
DATE‘YYYY-MM-DD’ 형식으로 날짜 저장(1001-01-01~9999-12-31)
DATETIME‘YYYY-MM-DD HH:MM:SS’ (1001-01-01 00:00:00~9999-12-31 23:59:59)
TEXT65535 bytes(LONGTEXT: 4GB)->대용량 글자
BLOB65535 bytes(LONGBLOB: 4GB)->사진,동영상,문서 파일
  • CHAR(n) 는 입력한 단위 만큼 저장공간이 고정적으로 할당되는데 데이터가 hello 로 같더라도 n에 5를 넣으면 5바이트, 50을 넣으면 50바이트를 차지한다.
    고정된 크기를 가지므로 검색시 예측가능한 구조가 되어 검색이나 정렬을 빠르게 할 수 있다.

  • VARCHAR(n) 는 할당단위가 가변적으로 변하고 길이 정보도 저장된다. VARCHAR타입은 보다 큰 인덱스를 생성하지만 데이터 길이를 인덱스에 저장하여 검색 성능을 향상시킨다.
    따라서 일부 문자열 검색이나 색인화가 빠르다는 장점이 있다.

  • FLOAT 은 mySQL 에서 8바이트를 가진다.

  • DECIMAL(6,2) 는 1234.56 처럼 출력된다.

  • TEXTBLOB 은 기본값을 가질 수 없다.
    TEXT 타입은 VARCHAR 타입에 비해서 길이제한이 크기 때문에 큰 텍스트 저장시에 유용하다. 하지만 인덱스를 사용할 수 없어 접두어만 인덱스가 허용 된다.





DATE_FORMAT()

NOW() 함수를 이용하면 2022-11-29 11:41:19 와 같은 형식으로 현재 날짜와 시간을 알 수 있다.
하지만 특정한 데이터가 필요한다면 DATE_FORMAT()함수를 사용하면 된다

입력출력
NOW()2022-11-29 11:41:19
DATE_FORMAT(NOW(),'%Y')2022연도
DATE_FORMAT(NOW(),'%y')22연도
DATE_FORMAT(NOW(),'%M')November
DATE_FORMAT(NOW(),'%m')11
DATE_FORMAT(NOW(),'%b')Nov
DATE_FORMAT(NOW(),'%D')29th
DATE_FORMAT(NOW(),'%d')29
DATE_FORMAT(NOW(),'%H')1724시간
DATE_FORMAT(NOW(),'%h')5am,pm
DATE_FORMAT(NOW(),'%i')47
DATE_FORMAT(NOW(),'%s')50
  • SELECT DATE_FORMAT(NOW() , '%y %b %H %i'); 입력하면 22 Nov 12 04 출력
  • SELECT DATE_FORMAT("2021/01/24 12:33:32", "%Y-%m-%d"); 입력하면 2021-01-24 출력



이를 이용해 생일이 1분기인 명단을 뽑고 싶다면

select empno, ename, HIREDATE 
From emp
where date_format(hiredate, '%m') in (1,2,3); 

시간 타입 차이

Date_Format()convert( , date) 그리고 기본적인 now() 로 생성된 3가지의 시간 타입은 모두 다른 타입이다.

now() - datetime
convert(now(), date) - date
Date_Format(now(), '%Y-%m-%d') - varchar(10)

datetime 은 날짜와 시간 정보를 모두 가지고 있다.
2023-07-06 17:03:35
date 는 날짜 정보만 가지고 있다.
2023-07-06




FORMAT()

간단히 표를 먼저 보자

입력출력
10001000
format(1000, 0)1,000
format(1255, 3)1,255.000
format(2001000, 0)2,001,000

FORAMT() 함수에 데이터를 입력하고, 소수점 자리수를 입력해주면 표처럼 출력이 된다


이를 이용해서 데이터를 출력해보자

select name, pay, bonus, 
format(pay * 12 + bonus, 0) as sal
from professor 
where deptno  = 201 ;

profile
작은것부터

0개의 댓글