'Table 'test.p' doesn't exist' — SQL 별칭 및 기본 JOIN 동작 이해

발행: (2026년 4월 3일 오후 10:26 GMT+9)
4 분 소요
원문: Dev.to

Source: Dev.to

문제 개요

LeetCode #175 (Combine Two Tables)를 풀면서 몇 가지 예상치 못한 오류를 마주했습니다. 원인은 SQL 별칭 문법과 JOIN의 기본 동작에 대한 오해가 섞여 있었기 때문입니다.

초기 쿼리와 오류

SELECT firstName, lastName, city, state
FROM P Person 
JOIN Address A 
ON P.personId = A.personId;

위 쿼리를 실행하면 다음과 같은 런타임 오류가 발생했습니다:

Table 'test.p' doesn't exist

별칭 문법

SQL에서 별칭을 지정하는 올바른 순서는 다음과 같습니다.

[테이블명] [별칭]
  • 작성한 내용: FROM P Person
  • 발생한 상황: 엔진이 P를 테이블명으로, Person을 별칭으로 해석했습니다. P라는 테이블이 존재하지 않기 때문에 오류가 발생했습니다.

수정: 실제 테이블명을 먼저 쓰고 그 뒤에 별칭을 붙입니다. 예: FROM Person p.

JOIN 동작

나는 JOIN이 기본적으로 LEFT JOIN과 동일하게 동작한다고 잘못 가정했습니다. 표준 SQL(MySQL, PostgreSQL 등)에서는:

  • JOININNER JOIN의 약어입니다.
  • INNER JOIN은 두 테이블 모두에 매치가 있을 때만 행을 반환합니다(교집합).

문제에서는 주소가 없을 경우 NULL을 반환해야 했으므로, INNER JOIN을 사용하면 해당 사람들의 행이 완전히 제외됩니다.

LEFT JOIN을 사용한 올바른 쿼리

SELECT 
    p.firstName, 
    p.lastName, 
    a.city, 
    a.state
FROM Person p
LEFT JOIN Address a 
    ON p.personId = a.personId;
  • LEFT JOIN은 왼쪽 테이블(Person)의 모든 행을 유지하고, 오른쪽 테이블(Address)에 매치가 없을 경우 NULL로 채워줍니다.

핵심 정리

  • 별칭 순서 중요: 항상 [테이블] [별칭] 형태로 작성하고, 반대로 쓰지 않도록 합니다.
  • JOIN은 명시적으로: 기본값을 가정하지 말고, 필요에 따라 LEFT JOIN이나 RIGHT JOIN을 명시적으로 사용하세요.
  • 요구사항을 읽자: “주소가 없으면 null을 반환한다”와 같은 문구는 외부 조인을 사용해야 한다는 강력한 힌트입니다.

이러한 기본 개념을 이해하는 것은 복잡한 로직을 구현하는 것만큼 중요합니다. 여러분도 코드에서 비슷한 “기본 동작”을 가정한 경험이 있나요? 댓글로 알려주세요!

0 조회
Back to Blog

관련 글

더 보기 »

모던 SQLite: 당신이 몰랐던 기능들

JSON 데이터를 다루기 위해 SQLite는 JSON 확장을 제공하여 JSON 문서를 테이블에 직접 저장하고 쿼리할 수 있게 합니다. 스키마를 유연하게 유지할 수 있습니다.