데이터를 '가져오는' 언어
파이썬으로 데이터를 수집했다면, 이제는 쌓인 데이터를 꺼내 보는 차례다. 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 위에서 반복한 셈이다.