SQL 활용 (JOIN, LIMIT, HAVING, WINDOW 함수, LEAD, LAG)

dumbbelldore·2024년 12월 5일
0

zero-base 33기

목록 보기
35/97

1. JOIN

  • 두 개 이상의 테이블을 합쳐 한번에 조회하는 기능을 말함
  • 조인하는 방법에 따라 INNER, LEFT, RIGHT, FULL OUTER 조인으로 구분함
# INNER JOIN (INNER 키워드 생략 가능)
SELECT
	*
FROM
	HR.hr_cat C
INNER JOIN HR.hr_num N ON
	C.EmployeeNumber = N.EmployeeNumber
    
# LEFT OUTER JOIN
SELECT
	*
FROM
	HR.hr_cat C
LEFT JOIN HR.hr_num N ON
	C.EmployeeNumber = N.EmployeeNumber
    
# RIGHT OUTER JOIN
SELECT
	*
FROM
	HR.hr_cat C
RIGHT JOIN HR.hr_num N ON
	C.EmployeeNumber = N.EmployeeNumber
    
# FULL OUTER JOIN
SELECT
	*
FROM
	HR.hr_cat C
FULL OUTER JOIN HR.hr_num N ON
	C.EmployeeNumber = N.EmployeeNumber
  • 양 테이블의 컬럼명이 정확히 일치한다면, USING()을 이용하여 간편하게 조인을 수행할 수도 있음
# INNER JOIN w/ USING
SELECT *
FROM HR.hr_cat C
JOIN HR.hr_num N
USING (Employeenumber);

2. LIMIT

  • 조회 결과의 상위 n개의 행만 조회하고 싶을 때 LIMIT을 사용할 수 있음
SELECT Department, EducationField, count(*) AS hc
FROM HR.hr_cat HC
LEFT JOIN HR.hr_num HN
ON HC.EmployeeNumber = HN.EmployeeNumber 
GROUP BY 1, 2
ORDER BY 3 DESC
LIMIT 5;

3. HAVING

  • GROUP BY 함수를 활용하였을 때 조건을 걸고 싶다면, WHERE이 아닌 HAVING을 사용하여야 함
SELECT Department, EducationField, count(*) AS hc
FROM HR.hr_cat HC
LEFT JOIN HR.hr_num HN
ON HC.EmployeeNumber = HN.EmployeeNumber 
GROUP BY 1, 2
HAVING hc <= 30
ORDER BY 3 DESC;

4. WINDOW 함수

  • 집계된 결과값을 기존 데이터에 추가하여 보여주는 기능 ex) 합계, 평균, 순위 매기기, 순서 조작 등
  • GROUP BY와 마찬가지로 집계값을 보여준다는 공통점이 있지만, 결과 건수가 줄어들지 않는다는 차이점이 있음 (기존 데이터에 집계된 값을 부가적으로 보여줌)
SELECT
	JobLevel,
	PerformanceRating,
	count(hn.EmployeeNumber) AS hc1,
	SUM(count(hn.EmployeeNumber)) OVER (PARTITION BY JobLevel) AS hc2
FROM
	hr.hr_num hn
LEFT JOIN hr.hr_cat hc ON
	hn.EmployeeNumber = hc.EmployeeNumber
WHERE
	Attrition = 'No'
GROUP BY 1, 2
ORDER BY 1, 2;

5. LEAD vs LAG

  • LEAD는 순서 상 앞에 있는 데이터를 가져오며, LAG는 순서 상 뒤에 있는 데이터를 가져오는 기능을 수행함
SELECT
	JobLevel,
	COUNT(hn.EmployeeNumber) AS emp_cnt,
	LEAD(COUNT(hn.EmployeeNumber)) OVER (ORDER BY JobLevel) AS lead_cnt,
	LAG(COUNT(hn.EmployeeNumber)) OVER (ORDER BY JobLevel) AS lag_cnt,
FROM
	hr.hr_cat hc
LEFT JOIN hr.hr_num hn 
ON
	hc.EmployeeNumber = hn.EmployeeNumber
GROUP BY 1
ORDER BY 1;

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글