[2025.12.08] 오늘의 학습 키워드 - SQL 내장 함수

허진원·2025년 12월 8일

내일배움캠프 TIL

목록 보기
30/41

지난 주에 비해서 날이 상당히 따뜻(?)해졌다. 대신 일교차가 많이 커지긴 했지만. 이런 날씨에는 면역력이 약해지기 쉽다. 특히나 감기 혹은 독감에 쉽게 걸리게 된다. 매 년 감기와 독감의 증상과 강도가 강해지고 있다. 건강과 면역에 특별히 유의하길 바란다.

  1. 오늘 학습 키워드
    SQL 내장 함수 리마스터
  1. 학습한 내용을 나만의 언어로 정리하기
    지난 주부터 이어진 통계학 기초 학습과 SQL 리마인드 과정을 진행했다. 이에 더해서 머신러닝 강의 영상을 시청했다.

통계학은 처음 들어가는 과정이라고는 해도, 고등학교 수학에 포함되는 내용도 있었기 때문에 이해가 아주 안 되지는 않았다. 하지만 머신러닝은 달랐다.

정말 처음 마주하는 어려운 과정이었다. 때문에 내용의 거의 대부분을 이해하지 못 했다. 이번 주는 통계와 머신러닝 영상을 계속해서 반복 시청하는 시간을 보내게 될 듯하다.

오늘의 실습으로는 SQL 내장 함수들을 다시 사용해보는 시간을 가져 보았다. SQL 코드카타를 진행하면서 익숙하게 사용하던 함수들도 있었고, 전에 배웠었지만 잊고 있던 함수들도 있었다. 유용한 SQL 함수들을 다수 재발견하게 되었고, 실제로 적용해보면서 몸에 익히니 퍽 유익하고 즐거운 시간이었다.

  1. 학습 내용

SQL 내장 함수 실습

데이터테이블은 어제 사용했던 "EMP" 테이블을 사용했다.

  • 문자열 함수

1) 문자열 결합 (concat 함수) - '이름'과 '직급' 결합해서 출력하기

SELECT concat(ename_ko, ' ', '[', joblv, ']') AS '이름 [직급]'
FROM emp
;

concat() 사이에 포함되어있는 ' ' 는 띄어 쓰기 공백을 넣은 것으로, 출력되는 값의 가독성을 높이기 위해 사용했다.

2) 문자열 길이 (length, char_length 함수) - 이름 글자수 별 카운트 출력하기

SELECT CHAR_LENGTH(ename_ko) AS '이름길이',
	count(ename_ko) AS '카운트'
FROM emp 
GROUP BY 1
;

여기서 주의할 점은, length() 함수는 영문자 기준으로 byte를 세기 때문에 값이 영어가 아닐 경우 계산에 차이가 발생할 수 있다는 점이다.

이를 방지하기 위해서 char_length() 함수를 사용해 안전하게 한글의 문자수를 세어 준다.

3) 문자열 변환 및 슬라이싱 (upper, right 함수) - 이름이 ‘수’로 끝나는 사원의 이름 출력하기(영문명은 대문자로 변환)

SELECT ename_ko AS '이름',
	upper(ename_en) AS '영문명'
FROM emp 
WHERE RIGHT(ename_ko, 1) = '수'
;

right()의 반대 개념인 left()를 사용해 특정 문자로 시작하는 경우를 필터링할 수도 있다.

4) 문자열 대체 (replace 함수) - 이름이 김낙수인 사원정보의 직급 변경 후 추가하기

SELECT ename_ko AS '이름',
	joblv AS '현 직급',
	replace(joblv, '부장', '상무') AS '승진 직급'
FROM emp
WHERE ename_ko = '김낙수'
;

  • 숫자형 함수

1) 소수점 지정 및 기준 아래 버리기 (truncate 함수) - 급여가 6000 이상인 사원 정보를 연봉과 월급으로 출력 (월급은 연봉 / 12, 소수점 아래 자리 버리기)

SELECT concat(ename_ko, ' ', '[', joblv, ']') AS '이름 [직급]',
	sal AS '연봉',
	truncate(sal/12, 0) AS '월급'
FROM emp
WHERE sal >= 6000
ORDER BY 3 desc
;

소수점 아래를 계산한 후, 이를 버리지 않고 반올림하려면 truncate() 대신 round()를 사용하면 된다.

  • 날짜형 함수

1) 현재 날짜 반환 (curdate, date_format 함수) - 오늘 날짜를 YY.MM.DD 형식으로 출력하기

SELECT date_format(now(), '%y.%m.%d') AS 'Today'

원하는 시간 형식으로 수정하고 싶다면, date_format() 안의 '%y.%m.%d'를 바꿔주면 된다. 예를 들어, '2025-12-01'과 같은 형식으로 출력하고 싶다면 '%Y-%m-%d'로 바꾸면 된다.

2) 년도 데이터만 활용하기 (year 함수) - 2010년 대에 입사한 직원의 이름, 직급, 입사일 출력하기 (일/월/년도 형식으로, 년도는 뒤의 2자리만 표시)

SELECT ename_ko AS '이름',
	joblv AS '직급',
	date_format(hiredate, '%d/%m/%y') AS '입사일'
FROM emp 
WHERE year(hiredate) >= 2010 
	AND year(hiredate) < 2020
ORDER BY 3
;

3) 두 날짜 간 일수 차이 계산 (datediff 함수) - 오늘까지 근무 일수가 2500일에서 7500일 사이인 직원 목록을 근무일수 기준 내림차순 정렬

SELECT ename_ko AS '이름', 
	DATEDIFF(CURDATE(), hiredate) AS '근무일수'
FROM emp 
WHERE DATEDIFF(CURDATE(), hiredate) >= 2500
	AND DATEDIFF(CURDATE(), hiredate) <= 7500
ORDER BY 2 desc
;

4) 요일 정보 출력 (dayofweek 함수) - 입사일 기준 요일별로 입사한 인원 수 출력하기

SELECT DAYOFWEEK(hiredate) AS '요일',
	count(empno) AS '인원수'
FROM emp 
GROUP BY 1
ORDER BY 1
;

dayofweek()를 사용하면 1=일요일, 2=월요일, ..., 6=토요일 로 출력된다.

  • 변환형 함수

1) 숫자열을 콤마(,) 포함한 문자열로 변환 (format 함수) - 재직 중인 직원의 총급여(연봉+성과금)를 ‘만 원’ 단위로 계산하기 (총급여 기준으로 내림차순 정렬)

SELECT ename_ko AS '이름',
	concat(format(sal + comm, 0), '만 원') AS '총급여'
FROM emp
ORDER BY sal + comm desc
;

format()을 사용하지 않으면, 총급여 컬럼의 값에 콤마(,)가 포함되지 않는다. 따라서 가독성 향상을 위해 format()을 사용해 계산 결과를 문자열로 변경 후 결합해준다.

2) 시간대 변경 (CONVERT_TZ 함수) - UTC(+00:00) 기준으로 설정되어 있는 시간을 한국 시간(KST, +09:00) 으로 변환하고, 이 둘을 함께 출력하기

SELECT now() AS 'utc_time',
	CONVERT_TZ(NOW(), '+00:00', '+09:00') AS 'kst_time'
;

CONVERT_TZ() 안에 바꾸고자 하는 날짜 데이터, 원래 시간대, 바꿀 시간대 순서대로 입력하면 된다.

  • NULL 관련 함수

1) NULL값 대체하기 (ifnull 함수) - 사원번호와 매니저사번 출력하기 (매니저 사원번호가 없다면 본인 사원번호로 대체)

SELECT empno AS '사원번호',
	IFNULL(mgr, empno) AS '매니저사번'
FROM emp 
;

ifnull() 안에 출력할 데이터 컬럼, 대체할 데이터 컬럼을 순서대로 넣으면 된다. 위 실습의 경우 'mgr' 컬럼의 값에 NULL이 있을 경우, 'empno' 컬럼의 값으로 대체하게 된다.

  1. 학습하며 느낀 점
    SQL도 파이썬만큼은 아니지만, 함수가 상당히 많다고 생각한다. 이를 일일이 외울 수는 없지만, 자주 사용하는 함수는 최대한 외워보려고 한다. SQL도 파이썬도 결국 함수에 대해서 검색을 할 수밖에 없지만, 자주 사용하는 것은 손에 익을 테니 외울 수 있는 데까지는 외워볼 요량이다.

마치며 : 요즘 몸이 피곤함을 많이 느끼는 듯한 기분이 든다. 학습 시간에 꾸벅꾸벅 졸고, 눈이 계속 감긴다. 정신을 바짝 차리고, 잠을 깰 만한 음식을 준비하거나 가볍게 몸을 움직일 필요가 있어 보인다. 근본적으로는 전 날 밤에 충분히 잠을 자는 것이 중요하다. 오늘은 충분히 잘 수 있도록 조금 더 일찍 잠자리에 들어봐야겠다.

profile
국문과 전공 데이터 입문자

0개의 댓글