1. 단일행 함수
-- SELECT 단일행 함수
-- 1. 날짜/시간
-- from dual 생략
select now();
select ename, hiredate, now()
from emp;
-- varchar 문자열 타입
select '2025-02-25';
-- date 타입으로 변경
select date('2025-02-25 12:30:35');
-- time만 출력
select time('2025-02-25 12:30:35');
select year('2025-02-25 12:30:35');
select month('2025-02-25 12:30:35');
select day('2025-02-25 12:30:35');
select hour('2025-02-25 12:30:35');
select minute('2025-02-25 12:30:35');
select second('2025-02-25 12:30:35');
-- 2. 날짜 포맷
-- Y(키워드)는 대문자 m, d는 소문자 (Minute도 있어서 month는 소문자로 씀)
select date_format(now(), '%Y/%m/%d-%h:%i:%s');
-- 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());
-- 4. 수학 함수 (ABS, CEIL, FLOOR, ROUND, RAND, mod 등...)
select floor(101.5);
select ceil(101.5);
select round(101.5);
select mod(101,10);
-- 5. 문자열 함수
-- substr(문자열,시작번지1~,길이)
select substr(hiredate, 1, 4)
from emp;
select year(hiredate)
from emp;
-- replace(문자열, 기존의 바꾸고자 하는 문자열, 치환하고자 하는 문자열)
select replace("010/2222/7777", "/", "-");
-- instr: 문자열에서 찾는 문자열이 있으면 시작 번지, 없으면 0
select instr("abcde", "c");
-- rpad(원본문자열 , 원하는 자리수, 채울 문자열): 오른쪽에 특정문자를 원하는 자리수만큼 채워서 반환
select rpad('ssarmango',10, '*');
select rpad(substr('ssarmango',1,4), LENGTH('ssarmango'), '*');
-- lpad
select lpad(substr('ssarmango',1,4), LENGTH("ssarmango"), '*');
6. 문제 풀기
-- 6. 문제 풀기
select name, replace(tel,'381','***')
from student;
-- (1). )와 -위치 찾기
select name, tel, instr(tel,")"), instr(tel,"-")
from student;
-- (2). )와 - 사이 문자열 추출
select name, tel, substr(tel, instr(tel,")") + 1 , instr(tel,"-")-instr(tel,")") - 1 ) as '치환할 부분'
from student;
-- (3). 기존 문자열 -> ***
select name, tel, replace(tel, substr(tel, instr(tel,")") + 1 , instr(tel,"-")-instr(tel,")") - 1 ),repeat("*", instr(tel,"-")-instr(tel,")") - 1 )) as 'telephone'
from student;

2. 날짜 포맷
형식 | 설명 | 예시 ( 2025-02-25 14:30:45 ) |
%Y | 4자리 연도 | 2025 |
%y | 2자리 연도 | 25 |
%m | 2자리 월(01~12) | 02 |
%c | 월 별 이름을 0 ~12 로 | 2 |
%d | 2자리 일(01~31) | 25 |
%e | 일(1, 19) | 25 |
%H | 24시간제 시간(00~23) | 14 |
%h or %I | 12시간제 시간(01~12) | 02 |
%i | 분(00~59) | 30 |
%s or %S | 초(00~59) | 45 |
%p | AM/PM | PM |
%M | 월 이름 (January~December) | February |
%b or %h | 월 이름 약어 (Jan~Dec) | Feb |
%W | 요일 이름 (Sunday~Saturday) | Tuesday |
%a | 요일 약어 (Sun~Sat) | Tue |
%w | 요일 숫자 (0=일요일, 6=토요일) | 2 |
%j | 연도 기준 몇 번째 날(001~366) | 056 |
%U | 연 기준 주(일요일 시작, 00~53) | 08 |
%u | 연 기준 주(월요일 시작, 00~53) | 08 |
3. 조건문
-- 조건문(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;

4. 정렬
select *
from emp
where deptno = 20
order by sal asc;

order by 칼럼1, 칼럼2
: 칼럼1 기준으로 정렬 후 동일한 값을 가지는 인스턴스에 대해서 다시 칼럼2 기준으로 정렬
-- 같은 sal 중에서는 이름 순서로 두 번 정렬
select *
from emp
where deptno = 20
order by sal desc, ename asc;

-- 같은 이름이 없으므로 그냥 이름 순서로 정렬된 것과 같다.
select *
from emp
where deptno = 20
order by ename asc, sal desc;

전체 코드
-- SELECT 단일행 함수
-- 1. 날짜/시간
-- from dual 생략
select now();
select ename, hiredate, now()
from emp;
-- varchar 문자열 타입
select '2025-02-25';
-- date 타입으로 변경
select date('2025-02-25 12:30:35');
-- time만 출력
select time('2025-02-25 12:30:35');
select year('2025-02-25 12:30:35');
select month('2025-02-25 12:30:35');
select day('2025-02-25 12:30:35');
select hour('2025-02-25 12:30:35');
select minute('2025-02-25 12:30:35');
select second('2025-02-25 12:30:35');
-- 2. 날짜 포맷
-- Y(키워드)는 대문자 m, d는 소문자 (Minute도 있어서 month는 소문자로 씀)
select date_format(now(), '%Y/%m/%d-%h:%i:%s');
-- 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());
-- 4. 수학 함수 (ABS, CEIL, FLOOR, ROUND, RAND, mod 등...)
select floor(101.5);
select ceil(101.5);
select round(101.5);
select mod(101,10);
-- 5. 문자열 함수
-- substr(문자열,시작번지1~,길이)
select substr(hiredate, 1, 4)
from emp;
select year(hiredate)
from emp;
-- replace(문자열, 기존의 바꾸고자 하는 문자열, 치환하고자 하는 문자열)
select replace("010/2222/7777", "/", "-");
-- instr: 문자열에서 찾는 문자열이 있으면 시작 번지, 없으면 0
select instr("abcde", "c");
-- rpad(원본문자열 , 원하는 자리수, 채울 문자열): 오른쪽에 특정문자를 원하는 자리수만큼 채워서 반환
select rpad('ssarmango',10, '*');
select rpad(substr('ssarmango',1,4), LENGTH('ssarmango'), '*');
-- lpad
select lpad(substr('ssarmango',1,4), LENGTH("ssarmango"), '*');
-- 6. 문제 풀기
select name, replace(tel,'381','***')
from student;
-- (1). )와 -위치 찾기
select name, tel, instr(tel,")"), instr(tel,"-")
from student;
-- (2). )와 - 사이 문자열 추출
select name, tel, substr(tel, instr(tel,")") + 1 , instr(tel,"-")-instr(tel,")") - 1 ) as '치환할 부분'
from student;
-- (3). 기존 문자열 -> ***
select name, tel, replace(tel, substr(tel, instr(tel,")") + 1 , instr(tel,"-")-instr(tel,")") - 1 ),repeat("*", instr(tel,"-")-instr(tel,")") - 1 )) as 'telephone'
from student;
-- 조건문(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;
Share article