FROM 절의 하위 쿼리(파생 표)
쿼리를 가상 표로 감싸는 방법과 별칭이 필수인 이유를 알아봅니다.
FROM 절의 하위 쿼리(파생 표)은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
파생 테이블이란
FROM 절의 하위 쿼리를 파생 테이블(또는 인라인 뷰)이라고 합니다. 하나의 값을 반환하는 대신 전체 결과 집합을 반환하며, 외부 쿼리는 이를 실제 테이블처럼 취급합니다.
- 행과 열을 여러 개 가질 수 있습니다.
- 어떤 테이블처럼 조회하고 조인하고 필터링할 수 있습니다.
면접관은 파생 테이블을 사용해 문제를 여러 단계로 나눌 수 있는지 확인합니다.
별칭은 필수입니다
가장 중요한 함정은 파생 테이블에 반드시 별칭이 있어야 한다는 점입니다. 별칭이 없으면 대부분의 실행 엔진이 쿼리를 거부합니다.
- MySQL: 모든 파생 테이블에는 고유한 별칭이 있어야 합니다
- Postgres: FROM의 하위 쿼리에는 별칭이 있어야 합니다
이름을 지정하면(여기서는 dept_avg) 해당 이름으로 열을 참조할 수 있습니다.
SELECT dept_avg.dept_id, dept_avg.avg_salary
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) AS dept_avg;파생 테이블에서 미리 집계하는 이유
면접에서 자주 나오는 문제는 각 직원과 해당 직원이 속한 부서의 평균 급여를 함께 표시하십시오입니다. 그룹화 문제 없이 상세 행과 집계를 직접 함께 사용할 수는 없습니다.
깔끔한 방법은 파생 테이블에서 부서별 평균을 계산한 다음 상세 행과 다시 조인하는 것입니다. 먼저 파생 테이블을 부서마다 한 행으로 축약합니다.
SELECT e.name, e.salary, d.avg_salary
FROM employees e
JOIN (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) AS d ON e.dept_id = d.dept_id;집계 결과를 필터링하기
파생 테이블을 사용하면 외부 쿼리에서 복잡한 HAVING 처리 없이 계산된 집계 결과를 필터링할 수 있습니다. 평균 급여가 60000을 초과하는 부서만 원한다고 가정해 보겠습니다.
내부에서 집계한 다음 외부에서 파생된 열에 일반적인 WHERE를 적용합니다. 외부 쿼리에서는 avg_salary가 일반적인 열로 보입니다.
SELECT dept_id, avg_salary
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) AS d
WHERE avg_salary > 60000;두 단계의 집계
파생 테이블은 집계 결과에 대한 집계가 필요할 때 특히 유용합니다. 면접에서 자주 나오는 전형적인 질문은 부서별 평균 급여들의 평균은 얼마입니까?입니다.
AVG(AVG(...))를 직접 중첩할 수는 없습니다. 내부 쿼리가 부서마다 하나의 평균을 만들고, 외부 쿼리가 그 평균들을 다시 계산합니다.
SELECT AVG(avg_salary) AS avg_of_dept_avgs
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY dept_id
) AS d;계산된 열의 이름 지정
파생 테이블의 표현식을 외부에서 참조하려면 별칭이 필요합니다. 내부의 salary * 12는 그렇지 않으면 데이터베이스가 지정한 이름을 가지게 되며, 그 이름에 의존할 수 없습니다.
계산된 열에는 항상 별칭을 지정하십시오. 면접관은 별칭이 없는 표현식을 참조하면서 존재하지 않을 수도 있는 열 이름을 가정하는 경우를 알아챕니다.
SELECT name, annual_salary
FROM (
SELECT name, salary * 12 AS annual_salary
FROM employees
) AS yearly
WHERE annual_salary > 100000;두 파생 테이블 조인하기
여러 파생 테이블을 서로 조인할 수 있습니다. 여기서는 미리 집계한 두 하위 쿼리를 조인하여 각 부서의 직원 수와 총 급여를 비교합니다.
각 파생 테이블이 하나의 하위 질문에 답하고, 조인이 이 결과들을 연결하여 최종 보고서를 만듭니다. 이러한 단계적 사고방식은 중급 면접에서 정확히 높이 평가하는 능력입니다.
SELECT c.dept_id, c.headcount, p.payroll
FROM (
SELECT dept_id, COUNT(*) AS headcount
FROM employees GROUP BY dept_id
) AS c
JOIN (
SELECT dept_id, SUM(salary) AS payroll
FROM employees GROUP BY dept_id
) AS p ON c.dept_id = p.dept_id;범위: 외부 쿼리는 내부를 볼 수 없음
중요한 규칙이 있습니다. 외부 쿼리는 파생 테이블이 SELECT 목록에서 노출하는 열만 참조할 수 있습니다. 하위 쿼리 내부에서만 사용된 열은 외부에서 보이지 않습니다.
내부 쿼리가 dept_id와 avg_salary를 선택한다면 salary나 name은 외부에서 사용할 수 없습니다. 이 열들은 집계에 사용되었기 때문입니다. 면접관은 이러한 범위의 경계를 확인합니다.
SELECT dept_id, avg_salary
FROM (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees GROUP BY dept_id
) AS d;파생 테이블과 CTE 비교
파생 테이블과 공통 테이블 표현식(CTE)은 흔히 동일한 실행 계획을 만듭니다. 면접관은 왜 둘 중 하나를 선택하는지 물을 수 있습니다.
- 파생 테이블: 인라인 방식이며 일회성 사용에 적합합니다.
- CTE(
WITH): 맨 위에서 이름을 지정하므로 읽기 쉽고 여러 번 참조할 때 재사용할 수 있습니다.
깊게 중첩된 논리에서는 CTE 처리 흐름이 위에서 아래로 읽히고, 파생 테이블은 안쪽에서 바깥쪽으로 읽힙니다.
WITH dept_avg AS (
SELECT dept_id, AVG(salary) AS avg_salary
FROM employees GROUP BY dept_id
)
SELECT * FROM dept_avg WHERE avg_salary > 60000;LATERAL / 상관된 FROM 하위 쿼리
일반적으로 FROM 하위 쿼리는 외부 쿼리의 행을 참조할 수 없습니다. LATERAL(Postgres) 또는 CROSS APPLY(SQL Server)는 이 제한을 해제하여 파생 테이블을 외부 행마다 실행할 수 있게 합니다.
이를 통해 행별 상위 N 조회를 수행할 수 있습니다. 이 키워드의 존재를 아는 것만으로도 중급 면접에서 시니어 수준의 이해를 보여 줄 수 있습니다.
SELECT d.dept_name, top_emp.name, top_emp.salary
FROM departments d
CROSS JOIN LATERAL (
SELECT name, salary FROM employees e
WHERE e.dept_id = d.id
ORDER BY salary DESC LIMIT 1
) AS top_emp;면접용 핵심 답변
FROM 절 서브쿼리에 대해 질문을 받으면 다음과 같이 답변하시면 됩니다: "파생 테이블은 FROM 절에 있는 서브쿼리로, 외부 쿼리가 테이블처럼 사용하는 결과 집합을 반환합니다. 별칭이 반드시 있어야 하며, 외부 쿼리는 파생 테이블이 선택한 열만 볼 수 있습니다. 조인 전에 미리 집계하거나 집계 결과를 다시 집계할 때 특히 유용합니다."
LATERAL을 사용하면 외부 행을 참조할 수 있다는 점까지 덧붙이면 빠짐없이 설명한 것입니다.
간단한 확인
FROM 절 서브쿼리에 항상 필요한 구문을 고르십시오.
복습
파생 테이블, 완벽히 정리:
- FROM 서브쿼리는 가상 테이블, 즉 여러 행과 여러 열을 반환합니다.
- 별칭이 반드시 있어야 하며, 외부 쿼리는 파생 테이블이 선택한 열만 볼 수 있습니다.
- 조인 전에 미리 집계하거나, 집계 결과를 기준으로 필터링하거나, 집계 결과를 다시 집계할 때 사용하십시오.
- CTE는 읽기 쉬운 이름 지정 대안이며,
LATERAL/CROSS APPLY를 사용하면 외부 행을 참조할 수 있습니다.
다음: IN, ANY, ALL을 사용하는 집합 포함 여부 서브쿼리입니다.
AI 튜터와 함께 SQL을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 30
- 레슨
- 120
자주 묻는 질문
“FROM 절의 하위 쿼리(파생 표)” 강의는 무료인가요?
네 — “FROM 절의 하위 쿼리(파생 표)” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“FROM 절의 하위 쿼리(파생 표)”에서 뭘 배우나요?
쿼리를 가상 표로 감싸는 방법과 별칭이 필수인 이유를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“FROM 절의 하위 쿼리(파생 표)” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- SELECT와 WHERE의 스칼라 하위 쿼리
- FROM 절의 하위 쿼리(파생 표)
- IN, ANY와 ALL 하위 쿼리
- EXISTS와 IN의 성능 비교