요즘 들어 HR 데이터를 다루는 재미에 점점 빠지고 있다. 그동안은 '채용' 데이터, '근무' 데이터 등 각각 따로 떼어내서만 바라봤는데, 오늘은 JOIN을 활용해 두 가지 데이터를 '엮어서' 분석해보려고 한다. 데이터분석 부트캠프에서 배운 SQL JOIN이 실제로 어떻게 HR 실무에 활용될 수 있는지 직접 실습해보면서 느낀 점을 정리한다.

1. 오늘 주제를 선정한 이유
사실 나는 아직 실무에서 인사 데이터를 본격적으로 다뤄본 경험이 없다. 전 직장에서는 HR 부서였지만, 채용이나 근태 데이터가 분리되어 있었고, 데이터를 엮어서 분석하는 경험이 거의 없었다. 부트캠프에서 배운 SQL 지식을 활용해 '내가 만약 실무에서 HR 데이터를 다루게 된다면, 가장 먼저 무슨 분석을 할까?'를 고민하다 보니, 자연스럽게 JOIN이 떠올랐다.
특히, 신입 데이터분석가로 취업을 준비하는 입장에서, 채용정보(입사 지원자 정보)와 근무정보(입사 후 실제 근무 데이터)를 함께 분석하는 역량은 분명 강점이 될 수 있다고 생각했다. 예를 들면, '어떤 유형의 채용 지원자가 실제로 입사 후 성과가 좋은지', '신입과 경력 직원 간 근무 패턴의 차이', '입사 전 이력(자격증, 교육 이수 등)이 실제 근무와 어떤 연관이 있는지' 등 다양한 인사이트를 찾을 수 있다.
2. JOIN의 기본 개념과 실습 예시
JOIN은 두 개 이상의 테이블을 공통된 컬럼(열, 보통은 id나 key) 기준으로 연결해주는 SQL 구문이다. HR에서는 보통 '지원자 테이블'(채용정보)과 '직원 테이블'(근무정보)을 JOIN해서 분석하는 경우가 많다.
JOIN의 주요 유형은 다음과 같다.
- INNER JOIN: 양쪽 테이블에 모두 존재하는 데이터만 결합 (교집합)
- LEFT JOIN: 왼쪽 테이블의 모든 데이터와 오른쪽 테이블의 일치하는 데이터 결합
- RIGHT JOIN: 오른쪽 테이블의 모든 데이터와 왼쪽 테이블의 일치하는 데이터 결합
- FULL JOIN: 양쪽 테이블의 모든 데이터 결합 (합집합)
예를 들어, 다음과 같은 데이터가 있다고 가정해 보자.
채용정보 테이블 (recruit)
지원자ID
|
이름
|
지원부서
|
자격증
|
지원일자
|
1
|
김지연
|
인사
|
HRM
|
2023-06-01
|
2
|
이수빈
|
영업
|
없음
|
2023-06-05
|
3
|
박민수
|
인사
|
ERP
|
2023-06-02
|
근무정보 테이블 (employee)
사번
|
이름
|
입사일자
|
퇴사일자
|
근무상태
|
1001
|
김지연
|
2023-06-10
|
-
|
재직
|
1002
|
박민수
|
2023-06-15
|
2024-03-01
|
퇴사
|
이 두 데이터를 JOIN해서, '채용→입사→퇴사'까지 한눈에 보는 데이터셋을 만들 수 있다.
SQL 예시:
SELECT
r.이름,
r.지원부서,
r.자격증,
r.지원일자,
e.입사일자,
e.퇴사일자,
e.근무상태
FROM
recruit r
LEFT JOIN
employee e ON r.이름 = e.이름;
실제 실무에서는 이름이 아닌 고유ID(예: 지원자ID=사번)로 JOIN해야 데이터 정확도가 높다.
위 쿼리의 결과는 다음과 같을 것이다.
이름
|
지원부서
|
자격증
|
지원일자
|
입사일자
|
퇴사일자
|
근무상태
|
김지연
|
인사
|
HRM
|
2023-06-01
|
2023-06-10
|
-
|
재직
|
이수빈
|
영업
|
없음
|
2023-06-05
|
NULL
|
NULL
|
NULL
|
박민수
|
인사
|
ERP
|
2023-06-02
|
2023-06-15
|
2024-03-01
|
퇴사
|
여기서 LEFT JOIN을 사용했기 때문에 이수빈의 경우 근무정보가 없어도(즉, 채용되지 않았어도) 결과에 포함된 것을 볼 수 있다.
3. JOIN으로 얻을 수 있는 인사이트
JOIN을 활용한 HR 데이터 분석은 단순한 테이블 단위 분석보다 훨씬 더 다양한 인사이트를 제공한다.
3.1 채용-입사율 분석
SELECT
지원부서,
COUNT(DISTINCT r.지원자ID) AS 지원자수,
COUNT(DISTINCT e.사번) AS 입사자수,
COUNT(DISTINCT e.사번) / COUNT(DISTINCT r.지원자ID) * 100 AS 입사율
FROM
recruit r
LEFT JOIN
employee e ON r.이름 = e.이름
GROUP BY
지원부서;
이 분석을 통해 '어느 부서의 채용 전환율이 높은지', '자격증 보유자와 미보유자의 입사율 차이는 어떤지' 등을 파악할 수 있다.
3.2 입사 후 유지율 분석
SELECT
r.자격증,
COUNT(DISTINCT e.사번) AS 입사자수,
SUM(CASE WHEN e.근무상태 = '재직' THEN 1 ELSE 0 END) AS 재직자수,
SUM(CASE WHEN e.근무상태 = '재직' THEN 1 ELSE 0 END) / COUNT(DISTINCT e.사번) * 100 AS 유지율
FROM
recruit r
INNER JOIN
employee e ON r.이름 = e.이름
GROUP BY
r.자격증;
이 쿼리는 자격증 별로 입사자 중 현재 재직 중인 비율을 보여준다. 특정 자격증(예: HRM)을 가진 직원들이 더 오래 회사에 남는지 확인할 수 있다.
3.3 채용 소요기간 분석
SELECT
r.지원부서,
AVG(DATEDIFF(e.입사일자, r.지원일자)) AS 평균채용기간_일
FROM
recruit r
INNER JOIN
employee e ON r.이름 = e.이름
GROUP BY
r.지원부서;
지원에서 실제 입사까지 걸리는 시간을 부서별로 분석하여 채용 프로세스의 효율성을 평가할 수 있다.
3.4 자격증과 퇴사율의 관계
SELECT
r.자격증,
COUNT(e.사번) AS 입사자수,
SUM(CASE WHEN e.근무상태 = '퇴사' THEN 1 ELSE 0 END) AS 퇴사자수,
SUM(CASE WHEN e.근무상태 = '퇴사' THEN 1 ELSE 0 END) / COUNT(e.사번) * 100 AS 퇴사율
FROM
recruit r
INNER JOIN
employee e ON r.이름 = e.이름
GROUP BY
r.자격증;
이 분석을 통해 특정 자격증을 가진 직원들의 퇴사율이 높은지 낮은지 파악할 수 있다.
4. 부트캠프에서 배운 SQL 지식 적용하기
부트캠프에서 배운 SQL 지식을 HR 데이터에 적용해 보는 것은 매우 흥미롭다. 비록 부트캠프에서 직접 HR 데이터를 다뤄보지는 않았지만, 기본 SQL 기술들(SELECT, JOIN, GROUP BY 등)은 어떤 도메인의 데이터에도 적용 가능하다.
부트캠프에서 배웠던 여러 JOIN과 함수들을 HR 데이터에 활용하면
- 날짜 함수: 입사일과 퇴사일 간의 근속기간 계산
- 집계 함수: 부서별, 직급별 평균 급여나 평균 근속기간 계산
- 윈도우 함수: 부서 내 급여 순위나 연차별 성과 비교
- 서브쿼리: 평균 이상의 성과를 내는 직원들의 특성 분석
SQL을 배운 기본 지식이 실제 HR 업무에 이렇게 적용될 수 있다는 점이 가장 큰 배움이다.
5. HR 데이터 분석 시 JOIN 활용 팁
실습을 하면서 몇 가지 중요한 팁을 발견했다.
5.1 데이터 정합성 확인하기
JOIN을 하기 전에 반드시 두 테이블의 키 값이 정확히 일치하는지 확인해야 한다. 예를 들어, 이름으로 JOIN할 때 '김 지연'과 '김지연'처럼 공백 하나 차이로 JOIN이 실패할 수 있다.
-- 정합성 체크 예시
SELECT
r.이름 AS 지원자이름,
e.이름 AS 직원이름
FROM
recruit r
LEFT JOIN
employee e ON TRIM(r.이름) = TRIM(e.이름)
WHERE
e.이름 IS NULL;
5.2 적절한 JOIN 유형 선택하기
분석 목적에 따라 JOIN 유형을 선택해야 한다:
- 채용-입사율 분석: LEFT JOIN (지원자 전체 대비 입사자 비율을 보기 위해)
- 퇴사율 분석: INNER JOIN (입사한 사람들 중 퇴사 비율을 보기 위해)
5.3 GROUP BY와 함께 활용하기
JOIN만으로는 집계가 어렵기 때문에, GROUP BY와 함께 사용하면 더 의미있는 결과를 얻을 수 있다.
SELECT
YEAR(r.지원일자) AS 지원년도,
MONTH(r.지원일자) AS 지원월,
COUNT(r.지원자ID) AS 지원자수,
COUNT(e.사번) AS 입사자수
FROM
recruit r
LEFT JOIN
employee e ON r.이름 = e.이름
GROUP BY
YEAR(r.지원일자), MONTH(r.지원일자)
ORDER BY
지원년도, 지원월;
6. 한계와 앞으로의 목표
아직은 실무 HR 데이터셋을 구하기가 쉽지 않고, 직접 JOIN을 적용할 만한 진짜 사례가 부족한 게 현실이다. 하지만 부트캠프에서 배운 이론과 SQL 지식을 바탕으로, 실제 채용과 근무 데이터가 주어졌을 때 빠르게 JOIN해서 다양한 분석을 시도해보고 싶다.
특히 앞으로는 GROUP BY나 HAVING 등 집계함수까지 활용해서, '부서별, 연차별, 자격증별 입사 후 성과' 같은 좀 더 구체적인 분석을 해보고 싶다. 또한 시각화 도구(Tableau, Power BI 등)와 연동하여 HR 데이터를 대시보드로 만들어보는 것도 목표다.
더 나아가 직원 만족도 조사 데이터, 교육 참여 데이터 등 다양한 HR 데이터를 JOIN해서 '어떤 교육이 직원 유지율을 높이는지', '어떤 팀빌딩 활동이 직원 만족도를 높이는지' 등의 더 심층적인 분석도 시도해보고 싶다.
실제로 이런 분석이 가능해지면, 나도 실무에서 '데이터로 HR을 혁신하는 신입 데이터분석가'가 될 수 있을 거라 믿는다.
마치며
JOIN은 단순한 SQL 구문이 아니라, HR 데이터를 '흐름'으로 바라보게 해주는 강력한 도구다. 채용부터 퇴사까지 직원의 전체 라이프사이클을 하나의 데이터셋으로 연결함으로써, 단편적인 분석을 넘어 통합적인 인사이트를 제공한다.
부트캠프에서 배운 기본 SQL 지식을 HR이라는 새로운 도메인에 적용해보니, 데이터분석가로서의 역량이 한 단계 성장한 느낌이다. 데이터 분석의 진정한 가치는 도메인을 이해하고 그에 맞는 인사이트를 도출하는 능력에서 나온다는 것을 깨달았다.
앞으로 더 다양한 HR 데이터를 JOIN하고 분석하면서, 데이터에 기반한 인사 의사결정을 지원할 수 있는 분석가로 성장하고 싶다.
오늘의 한줄 요약: JOIN은 HR 데이터를 '흐름'으로 바라보게 해주는 힘이 있다. 오늘 연습을 토대로, 앞으로 실무에서 더 다양한 HR 데이터 분석을 시도해보고 싶다.
'HR애널리틱스 기록' 카테고리의 다른 글
[22일차] HR 자동화 혁신! ChatGPT 실무 적용 실전 활용법 3가지 (업무효율 3배 UP) (2) | 2025.05.22 |
---|---|
[HR노트] 근로기준법 핵심요약 – 근로자 정의부터 해고까지 한눈에 (0) | 2025.05.22 |
[20일차] 복잡한 정규화, HR 데이터로 쉽게 이해하기 (4) | 2025.05.20 |
[19일차] 이직 예측, 머신러닝으로 확장하면 어떻게 될까? (3) | 2025.05.19 |
[18일차] 실무 HR 데이터로 SQL 쿼리 작성하기 – 이직률 예측 분석 (5) | 2025.05.18 |