FLOW 03 · INFORMATION PROCESSING
DIRECTION 03 · 연결된 세계를 걷다 · DB · SQL · 트랜잭션
나누어 놓은 표를 다시 연결하다
DB · SQL · 트랜잭션
책 p.116–119 DIRECTION 03
QUESTION · 질문에서 시작합니다정규화를 하면서 회원과 예약을 서로 다른 표로 나누었다. 그런데 화면에는 회원 이름과 예약시간을 함께 보여줘야 한다.
“나눈 데이터를 다시 한 번에 볼 수 있을까?”
이때 서로 관련 있는 행을
공통된 값을 기준으로 연결한다.
공통된 값을 기준으로 연결한다
SELECT m.name, r.reserve_date, r.reserve_time
FROM member m
JOIN reservation r
ON m.member_id = r.member_id;
회원번호가 같은 행을 찾아
회원 이름과 예약 정보를 하나의 결과처럼 보여준다.
기술 이름
둘 이상의 테이블을 관련된 열을 기준으로
결합해 조회하는 것을 JOIN이라고 한다.
ILLUST A | ILL-09 | member와 reservation JOIN 결과 | JOIN 전후 결과
양쪽에 모두 있는 데이터만 볼 것인가
두 테이블에 모두 대응되는 데이터만 보고 싶다면
내부 조인을 사용할 수 있다.
반면 아직 예약하지 않은 회원까지
모두 보고 싶다면 어떻게 해야 할까?
JOIN은 문법만 외우면 금세 헷갈린다.
어느 쪽 데이터를 반드시 남겨야 하는가를 먼저 생각하면 쉽다.
LEFT JOIN을 읽을 때는 ‘왼쪽 테이블을 기준으로 모두 남긴다’고 생각하면 된다. 오른쪽에서 일치하는 값이 없으면 그 부분은 비어 보일 수 있지만, 왼쪽 행 자체는 사라지지 않는다. JOIN은 결과에 어떤 행을 남길지 결정하는 문제다.
결과 안에서 다시 질문할 수도 있다
“예약이 가장 많은 회원을 찾고 싶다”처럼
한 번의 단순 조건으로 해결하기 어려운 질문도 있다.
SELECT name
FROM member
WHERE member_id IN (
SELECT member_id
FROM reservation
WHERE reserve_date = '2026-09-20'
);
기술 이름
SQL 문 안에 다시 포함된 SELECT 문을
서브쿼리(Subquery)라고 한다.
안쪽 질문이 먼저 회원번호 목록을 만들고,
바깥쪽 질문이 그 결과를 다시 조건으로 사용하는 구조다.
서브쿼리는 복잡한 질문을 두 단계로 나누는 방법으로 생각하면 쉽다. 안쪽 SELECT가 중간 결과를 만들고, 바깥 SELECT가 그 결과를 다시 조건이나 비교 대상으로 사용한다. 먼저 안쪽 결과가 어떤 모양인지 예상해 보면 전체 문장이 훨씬 잘 읽힌다.
더 찾아보고 싶다면846면 학습 아카이브에서 검색하세요.