[Ch4] DBeaver EDA

jayce·2024년 7월 17일

Dbeaver 자주 쓰는 단축키

단축키기능
CTRL + ENTER현재 쿼리 실행
CTRL + \ 새 탭에서 현재 쿼리 실행
CTRL + /현재 단일 행 주석 전환
CTRL + SHIFT + /여러 행 주석 전환
CTRL + ]새 SQL 편집기 열기
CTRL + SHIFT + ↑ / ↓선택한 행을 위/아래로 이동
ALT + ↑ / ↓위/아래 쿼리문 블록 일괄 선택
CTRL + SHIFT + F선택한 SQL문 자동 정리

Dbeaver 로 DB INSERT

  • Database(MySQL) 연결
  • HR 이라는 새로운 Database를 생성
    • Datatbases → Create new database
  • HR Schema 우클릭 → 데이터 가져오기 (csv 파일 가져오기)

EDA


column 읽기

-- Dataset 전체 읽기
SELECT *
FROM HR.HR_Employee_Attrition hea 
;

-- 특정 Column만 읽기
SELECT EmployeeNumber , Attrition , Department , JobRole , JobLevel 
FROM HR.HR_Employee_Attrition hea 
;

Q) hr_employee_attrition 데이터에서 Python Pandas DataFrame으로 동일하게 Column을 추출하려면 ?
A) df[[‘EmployeeNumber’, ‘Attrition’, ‘Department’, ‘JobRole’, ‘JobLevel’]]

DISTINCT

DISTINCT : 해당 컬럼의 중복 제거된 Unique 값

  • Python Pandas와 비슷한 메서드로는, drop_dulicates 와 unique / nunique 가 있음
-- Row 수 확인 : 1470 row
SELECT COUNT(*) Headcount 
FROM HR.HR_Employee_Attrition hea 
;

-- 직원 수 확인 : 1470 
SELECT COUNT(DISTINCT EmployeeNumber) Headcount 
FROM HR.HR_Employee_Attrition hea 
;

GROUP BY & ORDER BY

/*GROUP BY & ORDER BY*/

-- Department,JobRole,JobLevel 별 재직 인원수를 구해보자

SELECT Department , JobRole , JobLevel  -- 2
	, COUNT(*) HC                   -- 5
FROM HR.HR_Employee_Attrition hea -- 1
WHERE Attrition = 'No'            -- 3
GROUP BY Department, JobRole, JobLevel  -- 4
;

-- 다양한 집계함수
-- Department,JobRole,Gender 별로 재직인원수, Age의 최대/최소/평균값

SELECT Department , JobRole , Gender 
	, COUNT(*) hc
	, MAX(age) max_age
	, MIN(age) min_age
	, AVG(age) avg_age 
FROM HR.HR_Employee_Attrition hea 
WHERE Attrition = 'No'
GROUP BY 1,2,3
;

-- Department,JobLevel별로 아래의 계산값을 산출해보자 
-- 재직인원수, TotalWorkingYears 평균값, YearsAtCompany 평균값, MonthlyIncome 최대값, MonthlyIncome 최소값

SELECT Department , JobLevel
	, COUNT(*) hc
	, ROUND(AVG(TotalWorkingYears), 1) avg_total_years
	, ROUND(AVG(YearsAtCompany),1) avg_years_at_company
	, MAX(MonthlyIncome) max_income
	, MIN(MonthlyIncome) min_income
FROM HR.HR_Employee_Attrition hea 
WHERE Attrition = 'No'
GROUP BY 1,2
ORDER BY avg_years_at_company DESC
;

비교연산자

-- 데이터셋에 중복값이 없음을 확인
SELECT 
	(SELECT COUNT(*)
	FROM HR.HR_Employee_Attrition hea)
	=
	(SELECT COUNT(DISTINCT EmployeeNumber) AS hc
	FROM HR.HR_Employee_Attrition hea) check_duplicated
;


SELECT count(*)
FROM (
		SELECT DISTINCT *
		FROM hr.hr_employee_attrition hea 
	)hea2
;

-- 특정 팀의 인원수 파악
SELECT count(*) 
FROM hr.hr_employee_attrition hea
WHERE Department = 'Sales'
	AND Attrition = 'No'
;

-- Quiz
-- 최소 1년 이상 재직 / 나이 30살 이하 / level 2 이하 / HR팀 제외
SELECT COUNT(*)
FROM HR.HR_Employee_Attrition hea 
WHERE 1 = 1
	AND YearsAtCompany  >= 1
	AND Attrition = 'No'
	AND Age <= 30
	AND JobLevel <= 2
	AND Department != 'Human Resources'

논리 연산자

-- 최소 5년 이상 재직 / 나이 30~45 / level 3,4 / Sales 혹은 R&D 소속
SELECT COUNT(*) 
FROM HR.HR_Employee_Attrition hea 
WHERE 1 = 1
	AND YearsAtCompany >= 5
	AND Attrition = 'No'
	AND AGE BETWEEN 30 AND 45 -- Age >= 30 AND age < =45
	AND JobLevel IN(3, 4) -- AND JobLevel BETWEEN 3 AND 4 
	AND Department IN('Sales', 'Research & Development')
;


-- Department, joblevel, gender별 인원수, 평균 연령 표기
-- 평균 연령으로 내림차순 (Round 0)
-- HC, avg_age 컬럼명 명명

SELECT Department, JobLevel, Gender
	, COUNT(*) HC
	, ROUND(AVG(Age), 0) Avg_age 
FROM HR.HR_Employee_Attrition hea 
WHERE 1 = 1
	AND YearsAtCompany >= 5
	AND Attrition = 'No'
	AND AGE BETWEEN 30 AND 45
	AND JobLevel IN(3, 4)
	AND Department IN('Sales', 'Research & Development')
GROUP BY 1,2,3
ORDER BY Avg_age DESC
;

과제

Q1) 사내 공로상 대상자 후보를 선정하고 있습니다.
정성적인 평가에서 앞서 정량적인 기준으로 대상자를 추려보려 합니다.
대상 인원의 EmployeeNumber 리스트를 구하기 위한 쿼리를 작성해주세요.
⠀1. 재직연수 5년 이상
⠀2. 입사 이후 동일 Role 에서 지속 근무
⠀3. 최근 1년 이내 승진 이력이 없음 (동일 Level에서 1년 이상 근무 중)
Q2) Q1에서 구한 결과값에 대하여, Department, JobRole, JobLevel 별로 대상 인원수를
구하기 위한 쿼리를 작성해주세요. (JobLevel을 기준으로 내림차순)

-- Q1) EmployeeNumber 리스트
-- 재직연수 5년이상, 입사 이후 동일 Role에서 지속근무
-- , 최근 1년 이내 승진 이력 없음(동일 level에서 1년이상 근무)

SELECT EmployeeNumber
FROM HR.HR_Employee_Attrition hea 
WHERE 1=1
	AND Attrition = 'No'
	AND YearsAtCompany >=5
	AND YearsInCurrentRole = YearsAtCompany 
	AND YearsSinceLastPromotion > 1
;

-- Q2) Department, JobRole, JobLevel 별로 대상 인원수를 구하기 위한 쿼리 작
-- (JobLevel을 기준으로 내림차순)
SELECT Department, JobRole, JobLevel 
	, COUNT(*) HC
FROM HR.HR_Employee_Attrition hea 
WHERE 1=1
	AND Attrition = 'No'
	AND YearsAtCompany >=5
	AND YearsInCurrentRole = YearsAtCompany 
	AND YearsSinceLastPromotion > 1
GROUP BY 1,2,3
ORDER BY JobLevel DESC
;

0개의 댓글