연재 데이터 항해 훈련 일지

약 1분

Sakila로 SELECT와 JOIN을 익힌 SQL 첫걸음

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)으로 쿼리를 짧고 읽기 좋게

정리