본문에 들어가기 앞서서 간단한 함수를 보자
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 ;
