본문에 들어가기 앞서서 간단한 함수를 보자
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) |
TEXT | 65535 bytes(LONGTEXT: 4GB)->대용량 글자 |
BLOB | 65535 bytes(LONGBLOB: 4GB)->사진,동영상,문서 파일 |
CHAR(n)
는 입력한 단위 만큼 저장공간이 고정적으로 할당되는데 데이터가 hello
로 같더라도 n에 5를 넣으면 5바이트, 50을 넣으면 50바이트를 차지한다.
고정된 크기를 가지므로 검색시 예측가능한 구조가 되어 검색이나 정렬을 빠르게 할 수 있다.
VARCHAR(n)
는 할당단위가 가변적으로 변하고 길이 정보도 저장된다. VARCHAR
타입은 보다 큰 인덱스를 생성하지만 데이터 길이를 인덱스에 저장하여 검색 성능을 향상시킨다.
따라서 일부 문자열 검색이나 색인화가 빠르다는 장점이 있다.
FLOAT
은 mySQL 에서 8바이트를 가진다.
DECIMAL(6,2)
는 1234.56 처럼 출력된다.
TEXT
와 BLOB
은 기본값을 가질 수 없다.
TEXT
타입은 VARCHAR
타입에 비해서 길이제한이 크기 때문에 큰 텍스트 저장시에 유용하다. 하지만 인덱스를 사용할 수 없어 접두어만 인덱스가 허용 된다.
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') | 17 | 24시간 |
DATE_FORMAT(NOW(),'%h') | 5 | am,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
간단히 표를 먼저 보자
입력 | 출력 |
---|---|
1000 | 1000 |
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 ;