Windows · SQLite 3.45.3. 본문의 첫 예제를 실행하여 표준 출력과 예상 결과가 일치함을 확인했습니다. 연습문제의 모든 입력을 검증한 것은 아닙니다.
이 글의 순서 5개 단락
주문에 상품 이름 대신 상품 ID가 기록되어 있다면, 주문 목록에서 이름을 보려면 상품 정보를 함께 조회해야 합니다. SQLite의 INNER JOIN을 사용하면 두 테이블에서 ID가 일치하는 행을 연결할 수 있습니다.
연결할 기준 열 찾기
상품마다 고유한 product_id가 있고, 주문의 product_id에는 주문한 상품의 ID가 기록되어 있다고 가정합니다. 상품의 product_id처럼 각 행을 식별하는 열을 기본 키로 사용할 수 있습니다. 주문의 product_id는 그 상품을 가리키는 연결 기준 열입니다.
예를 들어 상품 ID가 1인 상품이 노트라면, product_id가 1인 주문을 노트와 연결합니다. 여러 주문이 같은 상품 ID를 가질 수도 있습니다.
주문과 상품 연결하기
실습 환경은 SQLite입니다. 다음 예제는 별도의 파일이나 테이블 생성 없이 실행할 수 있도록 WITH와 VALUES로 예제 데이터를 제공합니다. WITH에 정의한 이름은 이 SQL 문이 실행되는 동안 테이블처럼 사용할 수 있고, VALUES의 각 괄호는 한 행을 나타냅니다. 여기서는 상품 ID가 고유하다고 가정하며, 실제 기본 키 제약 조건을 선언하지는 않습니다.
입력 데이터는 상품 2개와 주문 4개입니다. 주문 103의 상품 ID인 3은 상품 목록에 없습니다.
WITH products(product_id, product_name) AS (
VALUES (1, '노트'), (2, '펜')
),
orders(order_id, product_id) AS (
VALUES (101, 1), (102, 2), (103, 3), (104, 1)
)
SELECT orders.order_id, products.product_name
FROM orders
INNER JOIN products
ON orders.product_id = products.product_id
ORDER BY orders.order_id;

예상 결과는 다음과 같습니다. 구분자와 열 이름 표시 방식은 사용하는 SQLite 실행 환경에 따라 달라질 수 있습니다.
order_id | product_name
101 | 노트
102 | 펜
104 | 노트
FROM orders로 주문을 선택하고, INNER JOIN products로 상품을 연결합니다. ON 뒤의 조건은 주문의 상품 ID와 상품의 ID가 같은지 비교합니다. orders.product_id처럼 이름 앞에 테이블 이름을 붙이면 어느 쪽 열인지 구분할 수 있습니다. 마지막 ORDER BY는 주문 ID 순서로 결과를 정렬합니다.
주문 101과 104는 모두 상품 ID 1과 일치하므로 각각 노트로 표시됩니다. 주문 102는 상품 ID 2와 일치해 펜으로 표시됩니다. 주문 103은 일치하는 상품이 없어 결과에 포함되지 않습니다.
흔한 실수와 경계 조건
두 테이블에 모두 product_id가 있으므로 이를 그냥 product_id라고 쓰면 어느 테이블의 열인지 모호해 오류가 날 수 있습니다. ON과 같이 열을 참조하는 곳에는 orders.product_id, products.product_id처럼 출처를 명시하세요.
SQLite에서 INNER JOIN에 ON을 빠뜨리면 주문과 상품의 모든 조합이 만들어집니다. 위 데이터라면 주문 4행과 상품 2행이 결합되어 8행이 됩니다. 관련 상품만 찾으려면 연결 조건을 적어야 합니다.
연결 기준 값이 NULL이거나 일치하는 값이 없으면 = 조건이 참이 아니므로 해당 행은 포함되지 않습니다. 반대로 상품 쪽에 같은 ID가 여러 행 있다면 각각 일치하여 주문 한 건이 여러 결과 행으로 나타납니다. 실제 테이블에서는 상품 ID를 기본 키로 정해 중복을 막을 수 있습니다.
작은 연습과 해설
위 예제의 주문 103에서 상품 ID를 3 대신 2로 바꾸면 어떤 행이 추가될까요? 나머지 데이터와 정렬 조건은 그대로 둡니다.
상품 ID 2는 펜과 일치하므로 103 | 펜이 결과에 추가됩니다. 주문 102도 같은 상품을 가리키지만, 두 주문은 서로 다른 행이므로 각각 표시됩니다.
출처
- SQLite SELECT 문서: JOIN과 ON의 동작
- SQLite WITH 문서: 한 SQL 문에서 사용하는 임시 결과 정의
CHECK THE SOURCE
참고한 공식 문서
기능 설명은 위 문서를 참고했으며, 예제의 입력·결과와 한계는 본문에 따로 기록했습니다.