[데이터베이스] 3. SELECT 단일 행 함수

문정준's avatar
Feb 25, 2025
[데이터베이스] 3. SELECT 단일 행 함수
 

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');
notion image

2. 날짜 포맷

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

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는 시작 날짜 - 끝 날짜의 값을 출력
notion image
notion image

2. 수학 함수

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

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. 문제 풀이 : 전화번호 가운데 자리 추출하기

notion image
 

문제 분석

  1. 가운데 자리 : 전화번호의 ‘)’와 ‘-’ 사이의 자리
    1. 3자리 또는 4자리 (매번 다름)
  1. replace의 단점 : 문자 치환
    1. 정해진 문자로만 치환 가능
      1. ‘***’이 될지, ‘****’이 될지 모름
      2. 길이에 따라 문자를 반복하는 함수 : repeat()
      3. repeat(‘*’, 중간 전화번호 길이)
        1. 중간 전화번호 길이는 어떻게?
  1. 문자열 붙이기 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의 ‘)’부터 ‘-’ 전까지는 치환하고, 나머지는 그대로 출력 후 두 개의 문자열 합치기
 

결과

notion image
 

코드 작성 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;
notion image
 

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;
notion image
Share article

sxias