'Table 'test.p' doesn't exist' — SQL 별칭 및 기본 JOIN 동작 이해
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 등)에서는:
JOIN은 INNER 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을 반환한다”와 같은 문구는 외부 조인을 사용해야 한다는 강력한 힌트입니다.
이러한 기본 개념을 이해하는 것은 복잡한 로직을 구현하는 것만큼 중요합니다. 여러분도 코드에서 비슷한 “기본 동작”을 가정한 경험이 있나요? 댓글로 알려주세요!