본문 바로가기

데이터분석캠프 TIL

241202_ 데이터 분석 과정(JOIN, UNION, SUBQUERY, 윈도우 함수 )

1. JOIN 

- 조인은 두 개 이상의 테이블에서 데이터를 결합하여 원하는 정보를 추출하는 SQL 작업

- 테이블들이 각각 분리된 정보를 갖고 있을 때, 공통 컬럼을 통해 데이터를 결합할 수 있습니다.

- 엑셀 VLOOKUP과 비슷한 기능

 

테이블들이 각각 분리된 정보를 갖고 있을 때, 공통 컬럼을 통해 데이터를 결합하여 전체적인 통찰을 제공합니다.

 

 

1.1 JOIN의 종류

(1) INNER JOIN: 두 테이블의 공통된 데이터만 조회

 

(2) LEFT JOIN: 왼쪽 테이블의 모든 행을 반환하며, 오른쪽에 없는 데이터는 NULL로 표시

 

1.2 기타 JOIN 

  • RIGHT JOIN: LEFT JOIN의 정반대로, 오른쪽 테이블을 기준으로 반환→ 실무에서는 거의 사용 X
    • 엑셀의 VLOOKUP처럼 왼쪽을 중심으로 필요한 정보를 오른쪽으로부터 가져오는 left join이 주로 사용됨 
  • CROSS JOIN: 모든 가능한 조합(데카르트 곱)을 생성→ 테스트 데이터 생성이나 조건 확인 시 유용하나, 실무 활용도는 낮음
  • SELF JOIN: 동일 테이블 내에서 데이터를 비교하거나 그룹화할 때 유용 → 특정 조건(예: 같은 연령대의 고객)을 만족하는 매칭 찾기

1.3 Key의 종류

  • 기본 키(Primary Key): 행을 유일하게 식별하는 컬럼으로, NULL 값과 중복 허용 불가함
  • 외래 키(Foreign Key): 다른 테이블의 기본키를 참조해 테이블 간 관계를 설정하는 컬럼
  • 대체 키(Candidate Key): 기본 키로 선택 가능한 후보 컬럼
  • 복합 키(Composite Key): 두 개 이상의 컬럼을 결합하여 만든 기본 키

 

2. UNION

- 여러 SELECT 문의 결과를 수직으로 결합하면서 중복된 행은 제거 - 중복된 데이터가 제거되므로 성능은 다소 떨어질 수 있음 

※ SELECT문의 열 수와 데이터 형식이 동일해야 함. 

 

2.1 UNION ALL 

- 여러 SELECT 문의 결과를 수직으로 결합하며, 중복된 행도 포함

UNION과 동일하게  SELECT문의 열 수와 데이터 형식이 동일해야 함  

 

 

3. SUBQUERY

- SQL쿼리 내부에서 실행되는 중첩된 쿼리. 복잡한 데이터를 단순하게 만들어주고, 중간 결과를 생성해 외부 쿼리에서 활용하는 데 사용. 

 

 

 

1.1 특징

  1. 위치: SELECT, FROM, WHERE, HAVING, JOIN
  2. 독립성: 서브쿼리는 외부 쿼리와 상관없이 독립적으로 실행될 수도 있고, 외부 데이터를 참조하여 실행될 수도 있음(비상관 vs 상관 서브쿼리)
  3. 실행 순서: 서브쿼리는 외부 쿼리보다 먼저 실행되며, 반환된 결과는 외부 쿼리에서 사용됨

 

1.2 반환 타입에 따른 분류

서브쿼리는 반환값의 형태에 따라 세 가지로 나뉩니다. → 스칼라, 다중행(한 컬럼), 다중열(테이블)

 

(1) 스칼라 서브쿼리

- 서브쿼리가 스칼라 값(숫자, 문자열 등)을 반환

- 주로 SELECT, WHERE, HAVING 절에서 사용

 

(2) 다중 행 서브쿼리

- 서브쿼리가 1개의 컬럼에 여러 행을 반환 -> 마치 배열(리스트)처럼 동작

- IN, ANY, ALL 

 

(3) 다중 열 서브쿼리

- 서브쿼리가 여러 열과 여러 행으로 구성된 결과를 반환 -> 가상 테이블처럼 동작 

- FROM, JOIN

 

1.3 위치에 따른 분류 

(1) SELECT절에서 사용

SELECT절의 서브쿼리는 단일값만을 반환하며, 외부 쿼리의 결과에 새로운 파생변수 생성 

 

(2) FROM절에서 사용"인라인 뷰" 

- 서브쿼리가 외부 쿼리와 독립적으로 1번만 실행됨

- 내부 쿼리 결과가 외부 쿼리에서 사용됨

 

(3) WHERE절에서 사용

- 비교 연산자 혹은 논리 연산자와 함께 특정 조건을 필터링

 > 비교 연산자: 부등호를 활용하여 조건을 비교

 > 논리 연산자:

  • ANY: 서브쿼리 결과 중 하나라도 조건을 만족하면 참
  • ALL: 서브쿼리 결과의 모든 값에 대해 조건을 만족해야 참
  • IN : 서브쿼리 결과 값 중 하나와 일치하면 참
  • EXISTS :서브쿼리의 결과가 존재하면 참(한 행이라도 존재하면 OK)

 

1.4 의존성에 따른 분류

(1) 비상관 서브쿼리

  • 서브쿼리가 외부 쿼리와 독립적으로 1번만 실행됨
  • 내부 쿼리 결과가 외부 쿼리에서 사용됨

 

(2) 상관 서브쿼리

상관 서브쿼리는 내부 쿼리(Subquery)가 외부 쿼리(Outer Query)의 데이터를 참조하며, 외부 쿼리의 각 행에 대해 반복적으로 실행됩니다.

→ 각 행별로 동적으로 조건을 비교가능!

 

- 외부 데이터를 참조: 내부 쿼리가 외부 쿼리의 데이터를 사용

- 반복 실행: 외부 쿼리가 실행될 때마다 내부 쿼리도 반복 실행

- 성능 고려 필요: 반복 실행으로 인해 성능 저하. 성능 이슈를 완화하기 위해 상관 서브쿼리를 -> JOIN 혹은 원도우 함수로 변환

 

 

(3) 비상관 VS 상관 

구분 비상관 서브쿼리 상관 서브쿼리  
의존성 외부 쿼리와 독립적으로 한 번만 실행 내부쿼리가 외부 쿼리의 데이터를 참조
실행 횟수 1번 실행 외부 쿼리의 각 행마다 반복 실행
성능 더 빠르고 효율적 반복 실행으로 성능 저하 가능: 상관서브쿼리가 꼭 필요할 때만 쓸것! → 예: 동적으로 사용자별 특정 조건을 비교해야 하는 상황(사용자별 최종 구매일 이후의 이벤트 참여 기록 찾기)

 

⭐(4) 윈도우 함수

집계 함수와 유사한 작업을 쿼리의 행 집합에 대해 수행함. 집계함수가 쿼리 행을 하나의 결과 행으로 그룹화하는 것과 달리, 윈도우 함수는 쿼리의 각 행에 대해 결과를 생성함. 

- 함수가 평가되는 대상 행을 현재 행(Current row)라고 부름

- 현재 행과 연관된 쿼리 행들로 구성된 집합을 현재 행의 윈도우(window)라고 부름. 이 윈도우 범위 내에서 함수가 실행됨.