Captain's Log
← Observatory
Observatory·

SQL 첫걸음 — Sakila로 배우는 SELECT부터 JOIN까지

MySQL 예제 DB Sakila로 조회(SELECT)의 전 범위를 직접 쿼리하며 익힌 기록 — 조건·연산자·BETWEEN·IN·LIKE·NULL부터 정렬·집계·GROUP BY·HAVING, 그리고 여러 테이블을 잇는 JOIN까지.

TrainingSQLDatabase

데이터를 '가져오는' 언어

파이썬으로 데이터를 수집했다면, 이제는 쌓인 데이터를 꺼내 보는 차례다. MySQL 예제 데이터베이스 Sakila(영화 대여점)로 SELECT 문법을 하나씩 손으로 쳐보며 익혔다.

show databases;   -- DB 목록
use sakila;       -- DB 열기
show tables;      -- 테이블 목록
select * from film;

조회의 기본과 조건

-- 필요한 컬럼만, 별칭 붙여서
select title as 영화제목, rental_rate as 대여요금 from film;
 
-- WHERE로 조건 필터링
select * from film where rating = 'PG';
select * from film where rental_rate > 3;
select * from film where rental_rate >= 2 and rating = 'PG-13';  -- and / or
select * from film where rating <> 'PG';                          -- 부정 <>, !=

컬럼끼리 비교하거나(replacement_cost > rental_rate), 사칙연산 결과를 조건에 넣는 것도 연습했다.

편리한 조건 연산자

  • BETWEEN: rental_rate between 2 and 4 (이상·이하 범위, 경계 포함)
  • IN: rating in ('PG', 'G', 'PG-13') — OR을 여러 번 쓴 것과 동일
  • LIKE: description like '%drama%' (포함), 'A Epic%'(시작), '%India'(끝)
  • IS NULL / IS NOT NULL: = null은 동작하지 않는다는 걸 직접 확인

정렬·제한·중복 제거

select * from film order by rating asc, rental_rate desc;  -- 다중 정렬
select * from film order by rand() limit 10;               -- 무작위 10개
select distinct rating from film;                          -- 중복 제거

집계와 그룹핑

select count(*) as 영화수 from film;
select avg(rental_rate) 평균요금, max(rental_rate) 최고요금 from film;
 
-- 등급별로 묶어서 세고, HAVING으로 그룹에 조건 걸기
select rating, count(*) as 영화수
from film
group by rating
having count(*) >= 200;

WHERE는 그룹 전에, HAVING은 그룹 후에 조건을 건다는 차이를 헷갈리지 않게 정리했다.

JOIN — 흩어진 테이블을 잇다

가장 중요한 배움. 공통 컬럼(주로 PK–FK)을 기준으로 여러 테이블을 하나처럼 연결한다.

-- 고객별 대여 횟수 (LEFT JOIN + GROUP BY + HAVING + ORDER BY)
select c.customer_id, count(r.rental_id) as 대여횟수
from customer c
left join rental r
  on c.customer_id = r.customer_id
group by c.customer_id
having count(r.rental_id) >= 10
order by 대여횟수 desc;
  • INNER: 양쪽에 다 있는 데이터만
  • LEFT / RIGHT: 한쪽 테이블을 기준으로 남기고 반대쪽을 붙임
  • 테이블 별칭(c, r)으로 쿼리를 짧고 읽기 좋게

정리

SELECT 하나에 이렇게 많은 문법이 얽혀 있다는 게 놀라웠다. 특히 마지막 "고객별 대여 횟수" 쿼리는 JOIN·GROUP BY·HAVING·ORDER BY가 한 문장에 모여, 데이터를 질문으로 바꾸는 감각을 잡게 해줬다. 파이썬의 pandas 필터링과 같은 사고를, 이번엔 DB 위에서 반복한 셈이다.