1. 날짜
1. 날짜 기본 함수
-- 1. 날짜, 시간
select now();
select '2025-02-25';
select year('2025-02-25 12:50:12');
select month('2025-02-25 12:50:12');
select day('2025-02-25 12:50:12');
select hour('2025-02-25 12:50:12');
select minute('2025-02-25 12:50:12');
select second('2025-02-25 12:50:12');
select week('2025-02-25 12:50:12');

2. 날짜 포맷

select date_format(now(), '%y/%m/%d-%h-%i-%s');

3. 날짜 연산 (더하기, 빼기, 간격, 마지막 날짜)
-- 3. 날짜 연산하기 (더하기, 뺴기, 간격, 마지막 날짜)
select date_add(now(), interval 4 year);
select date_add(now(), interval 4 month);
select date_add(now(), interval 4 week);
select date_add(now(), interval 4 day);
select date_add(now(), interval 4 hour);
select date_add(now(), interval 4 minute);
select date_add(now(), interval 4 second);
select date_sub('2025-02-25', interval 4 day);
select datediff('2025-02-25', '2025-03-01');
select timediff(now(), '2025-02-25 12:50:00');
select last_day(now());
- datediff는 시작 날짜 - 끝 날짜의 값을 출력


2. 수학 함수
-- 4. 수학 함수
select floor(101.5);
select ceil(101.5);
select round(101.5);
select mod(101, 10);

3. 문자열 함수
-- 5. 문자열 함수
-- substr(문자열, 시작번지(1 ~), 개수)
select *
from emp;
select substr(hiredate,1,4)
from emp;
select year(hiredate)
from emp;
-- replace(문자열, 바꿀 문자, 치환할 문자)
select replace('010/2222/7777', '/', '-');
-- instr(문자열, 위치 확인할 문자)
select instr('abcde', 'c');
-- rpad(문자열, 표현할 문자 길이, 빈칸 채울 문자)
select rpad('ssarmango', 10, '*');
select rpad(substr('ssarmango',1,4), LENGTH("ssarmango"), '*');
select lpad(substr('ssarmango',1,4), LENGTH("ssarmango"), '*');
4. 문제 풀이 : 전화번호 가운데 자리 추출하기

문제 분석
- 가운데 자리 : 전화번호의 ‘)’와 ‘-’ 사이의 자리
- 3자리 또는 4자리 (매번 다름)
- replace의 단점 : 문자 치환
- 정해진 문자로만 치환 가능
- ‘***’이 될지, ‘****’이 될지 모름
- 길이에 따라 문자를 반복하는 함수 : repeat()
- repeat(‘*’, 중간 전화번호 길이)
- 중간 전화번호 길이는 어떻게?
- 문자열 붙이기 concat() 활용도 가능
코드 작성 1. concat, rpad 사용
select name, concat(
rpad(substr(tel,1,instr(tel,')')),length(substr(tel,1,instr(tel,'-')-1)),'*'),
substr(tel,instr(tel,'-'),length(tel)-length(substr(tel,instr(tel,'-')))))
as tel
from student;
- rpad : 문자열을 특정 길이만큼 출력하고, 길이가 부족하면 원하는 글자로 메꾸는 함수
- 중간만 ‘*’로 바뀌면 되므로 ‘-’ 전까지의 길이를 구함
- instr : 문자가 시작하는 index 반환
- length(substr(tel, 1, instr(tel, ‘-’)-1)) : tel의 처음부터 ‘-’ 전까지 자른 문자열의 길이
- rpad(substr(tel, 1, instr(tel, ‘)’)), length(substr(tel, 1, instr(tel, ‘-’)-1)), ‘*’)
- tel의 처음부터 ‘-’ 전까지 자른 문자열에서, tel의 처음부터 ‘)’ 까지만 표현하고 나머지는 ‘*’로 표현 = 중간 부분만 치환됨
- concat : 다른 문자열을 합쳐서 출력
- tel의 ‘-’ 전까지는 문자로 표현되었으므로, ‘-’ 이후부터는 원래대로 출력
- substr(tel,instr(tel,'-'),length(tel)-length(substr(tel,instr(tel,'-'))))
- tel의 ‘-’부터 맨 끝까지의 문자열 출력
- concat( rpad(substr(tel,1,instr(tel,')')),length(substr(tel,1,instr(tel,'-')-1)),'*'), substr(tel,instr(tel,'-'),length(tel)-length(substr(tel,instr(tel,'-')))))
- tel의 ‘)’부터 ‘-’ 전까지는 치환하고, 나머지는 그대로 출력 후 두 개의 문자열 합치기
결과

코드 작성 2. replace, repeat 사용
select name,
replace(tel,
substr(tel, instr(tel, ')')+1, length(substr(tel, 1, instr(tel, '-')-1)) - length(substr(tel, 1, instr(tel, ')')))),
repeat('*', length(substr(tel, 1, instr(tel, '-')-1)) - length(substr(tel, 1, instr(tel, ')'))))) as tel
from student;
- replace : 정해진 문자열을 특정 문자로 치환
- 중간 전화번호만을 추출
- substr(tel, instr(tel, ')')+1, length(substr(tel, 1, instr(tel, '-')-1)) - length(substr(tel, 1, instr(tel, ')'))))
- tel에서 ‘)’ 다음의 문자부터 ‘-’ 전까지의 문자열 추출
- repeat('*', length(substr(tel, 1, instr(tel, '-')-1)) - length(substr(tel, 1, instr(tel, ')'))))
5. 조건문
-- 조건문
-- if - mysql / case when - 모든 DB
select if(10>5, "참", "거짓");
-- 2500 (고액연봉), (일반연봉)
select ename, SAL,
case
when sal > 2500 then '고액연봉'
when sal < 2000 then '일반연봉'
else '중간연봉'
end '연봉그룹'
from emp;

6. 정렬
- 기본 설정 (default)은 오름차순
-- 정렬
select *
from emp
where deptno = 20
order by sal;
select *
from emp
where deptno = 20
order by sal desc;
select *
from emp
where deptno = 20
order by sal desc, ename asc;
select *
from emp
where deptno = 20
order by ename asc, sal desc;

Share article