본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
EPL과 유튜브 데이터로 배우는 DuckDB

SQL을 쉽게 배우기: 데이터 과학자를 위한 입문 가이드

by 아참형인간 2026. 6. 14.

https://product.kyobobook.co.kr/detail/S000220221456

 

LUVIT EPL과 유튜브 데이터로 배우는 DuckDB | 이기준 - 교보문고

LUVIT EPL과 유튜브 데이터로 배우는 DuckDB | 복잡한 데이터 분석 흐름을 더 단순하게 만드는 DuckDB 최근 주목받고 있는 DuckDB를 활용해 SQL 기반 데이터 분석과 실전 프로젝트를 학습할 수 있도록 구

product.kyobobook.co.kr

 

대부분의 초보자들처럼 SQL 튜토리얼을 보고 몇 개의 쿼리를 실행해봤지만, 여전히 SQL이 체계적으로 정리되지 않은 것처럼 느껴질 수 있습니다.

당신만 그런 것이 아닙니다.

그리고 이 가이드가 그 문제를 해결해 줍니다.

이 글은 SQL의 모든 핵심 내용을 한 곳에 모아놓은 완전한 입문 가이드입니다.

처음 보는 사람도 바로 이해하고 오래 기억할 수 있도록 설명합니다.

시작해보겠습니다.

1. SQL이 중요한 이유 (진짜 이유)

모든 회사는 데이터를 테이블 형태로 저장합니다.

이러한 테이블은 다음과 같은 데이터베이스 안에 존재합니다.

  • MySQL
  • PostgreSQL
  • Snowflake

SQL은 이러한 데이터와 대화하는 언어입니다.

SQL이 필요한 이유는 다음과 같습니다.

  • 데이터셋 탐색
  • 데이터 정제
  • 테이블 결합

나중에 어떤 도구를 배우더라도 SQL은 항상 기반 기술로 남습니다.

2. 가장 기본적인 개념

테이블에서

  • 행(Row)은 하나의 레코드입니다.
  • 열(Column)은 하나의 속성입니다.

키(Key)

Primary Key → 행을 고유하게 식별합니다. (예: 학생마다 고유한 student_id)

Foreign Key → 두 개의 테이블을 연결합니다.

3. SELECT — 가장 중요한 SQL 명령어

모든 것은 SELECT에서 시작됩니다.

SELECT * FROM employees;

의미:

"employees 테이블의 모든 데이터를 보여줘."

특정 열만 선택하기:

SELECT name, age FROM employees;

중복 제거하기:

SELECT DISTINCT department FROM employees;
-- 고유한 값만 표시

기억할 것:

SELECT = 선택

FROM = 데이터 원본 테이블

이것만 기억하면 됩니다.

4. WHERE — 행 필터링

SELECT *
FROM employees
WHERE age > 30;
-- 나이가 30보다 큰 직원만 표시

사용 가능한 연산자:

  • =
  •  
  • <
  • AND
  • OR
  • BETWEEN
  • IN
  • LIKE

예시:

WHERE department = 'IT'
WHERE salary BETWEEN 50000 AND 80000
WHERE department IN ('IT', 'Finance')

필터링은 데이터 분석 업무의 80%를 차지합니다.

5. ORDER BY — 정렬

SELECT *
FROM employees
ORDER BY salary DESC;

ASC = 오름차순

DESC = 내림차순

기본값은 오름차순입니다.

6. LIMIT

SELECT * FROM employees LIMIT 10;

처음 10개의 레코드를 가져옵니다.

7. 집계 함수(Aggregations) — 데이터 과학자의 초능력

대표적인 함수:

  • SUM
  • AVG
  • MIN
  • MAX
  • COUNT

예시:

SELECT AVG(salary) FROM employees;

하지만 GROUP BY와 함께 사용하면 훨씬 강력해집니다.

8. GROUP BY — 이것을 이해하면 상위 20%가 됩니다

GROUP BY는 카테고리별로 지표를 계산할 수 있게 해줍니다.

SELECT department, AVG(salary)
FROM employees
GROUP BY department;

의미:

"직원을 부서별로 그룹화한 후 각 부서의 평균 급여를 계산해라."

다음과 같은 작업에 활용됩니다.

  • 데이터 과학 EDA
  • BI 대시보드
  • 특성 엔지니어링(Feature Engineering)

9. HAVING

초보자들이 가장 많이 헷갈리는 키워드

HAVING은 그룹화 이후 필터링합니다.

WHERE는 그룹화 이전 필터링합니다.

예시:

SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 70000;

집계 결과를 조건으로 필터링할 때 사용합니다.

GROUP BY 뒤에 사용됩니다.

10. JOIN — SQL의 진정한 힘

이 단계에서 SQL은 강력한 도구가 됩니다.

실제 데이터는 여러 테이블에 나누어 저장되는 경우가 많습니다.

JOIN은 이러한 데이터를 결합합니다.

INNER JOIN

일치하는 행만 반환합니다.

SELECT e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.dept_id = d.id;

LEFT JOIN

왼쪽 테이블의 모든 행과 일치하는 데이터를 반환합니다.

SELECT *
FROM employees e
LEFT JOIN departments d
ON e.dept_id = d.id;

일치하는 데이터가 없으면 NULL이 반환됩니다.

RIGHT JOIN

LEFT JOIN의 반대입니다.

FULL OUTER JOIN

양쪽 테이블의 모든 행을 반환합니다.

모든 SQL 엔진이 직접 지원하지는 않지만 개념은 중요합니다.

JOIN을 이해하는 쉬운 방법

INNER = 교집합

LEFT = 왼쪽 전체 + 일치하는 데이터 (없으면 NULL)

RIGHT = 오른쪽 전체 + 일치하는 데이터 (없으면 NULL)

FULL = 양쪽 전체의 합집합

JOIN을 이해하면 대부분의 실제 데이터 분석 업무를 수행할 수 있습니다.

11. 서브쿼리(Subquery) — SQL 안의 SQL

서브쿼리는 다른 쿼리 안에서 생성하는 임시 테이블이라고 생각하면 됩니다.

예시:

SELECT name, salary
FROM employees
WHERE salary > (
    SELECT AVG(salary)
    FROM employees
);

처음에는 복잡해 보이지만 한 번 사용해보면 금방 이해됩니다.

12. 윈도우 함수(Window Functions)

윈도우 함수는 현재 행과 관련된 여러 행에 대해 계산을 수행할 때 사용됩니다.

예시: 급여 기준 직원 순위 매기기

SELECT
    name,
    salary,
    RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM employees;

구성 요소:

  • OVER() → 윈도우 정의
  • ORDER BY → 정렬 방식
  • RANK() → 순위 부여

파티션 예시:

SELECT
    name,
    department,
    salary,
    ROW_NUMBER() OVER (
        PARTITION BY department
        ORDER BY salary DESC
    )
FROM employees;

의미:

  • 부서별로 데이터 분할
  • 각 부서 내에서 급여 순위 계산

다음 분야에서 매우 많이 사용됩니다.

  • 고객 순위 분석
  • 시계열 분석
  • 특성 엔지니어링

자주 사용하는 윈도우 함수

1) RANK()

각 그룹 내 순위를 부여합니다.

동점이 있으면 다음 순위가 건너뛰어집니다.

예:

1, 2, 2, 4

2) DENSE_RANK()

RANK()와 비슷하지만 순위를 건너뛰지 않습니다.

예:

1, 2, 2, 3

3) ROW_NUMBER()

각 행에 고유한 연속 번호를 부여합니다.

윈도우 프레임(Window Frame)

기본값은 다음과 같습니다.

RANGE BETWEEN UNBOUNDED PRECEDING
      AND CURRENT ROW

포함할 행 범위를 직접 지정할 수도 있습니다.

예시:

ROWS BETWEEN 2 PRECEDING
     AND CURRENT ROW

13. 실전 데이터 과학 SQL 예제

급여 상위 5명

SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;

중복 행 찾기

SELECT name, COUNT(*)
FROM employees
GROUP BY name
HAVING COUNT(*) > 1;

기여율 계산

SELECT
    department,
    salary,
    salary * 100 / SUM(salary) OVER() AS pct_contrib
FROM employees;

누적 합계

SELECT
    date,
    sales,
    SUM(sales) OVER (ORDER BY date) AS cumulative_sales
FROM sales;

이동 평균

SELECT
    date,
    sales,
    AVG(sales) OVER (
        ORDER BY date
        ROWS BETWEEN 6 PRECEDING AND CURRENT ROW
    )
FROM sales;

14. SQL 면접 단골 질문

1. WHERE와 HAVING의 차이는?

WHERE는 그룹화 전에 원본 데이터를 필터링합니다.

HAVING은 그룹화 후 결과를 필터링합니다.

2. UNION과 UNION ALL의 차이는?

UNION → 중복 제거

UNION ALL → 모든 행 유지

3. PRIMARY KEY와 FOREIGN KEY의 차이는?

Primary Key → 고유 식별자

Foreign Key → 테이블 간 관계 생성

4. INNER JOIN과 LEFT JOIN의 차이는?

INNER JOIN → 일치하는 데이터만

LEFT JOIN → 왼쪽 전체 + 일치하는 데이터

5. 정규화(Normalization)란?

중복을 줄이기 위해 테이블 구조를 체계적으로 설계하는 과정입니다.

15. SQL 치트시트

SELECT

SELECT columns
FROM table;

필터링

WHERE condition

정렬

ORDER BY column DESC

제한

LIMIT 10

집계

SUM()
AVG()
MIN()
MAX()
COUNT()

그룹화

GROUP BY column

조인

INNER
LEFT
RIGHT
FULL

윈도우 함수

OVER(
    PARTITION BY ...
    ORDER BY ...
)

이 정도만 익혀도 실제 데이터 과학 업무에서 사용하는 SQL의 약 90%를 다룰 수 있습니다.

 

<출처: https://medium.com/@shreyasnaphad/sql-made-simple-the-beginners-guide-for-data-science-39b557ca4513>

댓글