메인 콘텐츠로 건너뛰기

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
WHERE의 서브쿼리는 값을 제공합니다. FROM의 서브쿼리는 테이블 전체를 제공하고, 바깥 쿼리는 그것을 실제 테이블인 것처럼 읽습니다. 그것이 파생 테이블이고, 쿼리의 결과를 쿼리하는 방법입니다. 시작하기 전에 mysql -u root -p sakila로 클라이언트를 여세요.

파생 테이블의 동작 방식

COLUMN_LIST를 원하는 열로, TABLE_NAME을 안쪽 쿼리가 읽는 테이블로, ALIAS_NAME을 결과의 이름으로 바꾸세요. 별칭을 포함한 안쪽 쿼리의 열 이름이 파생 테이블의 열이 됩니다. 서버는 안쪽 결과를 먼저 만든 다음, 그 위에서 바깥 쿼리를 실행합니다.

이것이 가능하게 하는 것

GROUP BY는 상세 행을 그룹마다 1개의 행으로 바꾸므로, 그룹화된 쿼리는 행 자체를 보여 줄 수 없습니다. 파생 테이블은 둘 다 유지합니다: 안쪽 쿼리에서 그룹화한 다음, 그 결과를 상세 행에 다시 조인합니다. 이 쿼리는 자기 등급의 평균보다 긴 영화를 나열하고, 각 영화 옆에 그 평균을 보여 줍니다.
WHERE나 HAVING만으로는 이것을 작성할 수 없습니다. HAVING은 그룹을 필터링하므로 제목을 버렸을 것이고, WHERE는 어떤 평균도 존재하기 전에 실행됩니다. 5개의 평균은 안쪽 쿼리에서 한 번 계산되고, 조인이 모든 영화에 알맞은 평균을 붙입니다. 상관 서브쿼리 레슨은 같은 질문에 한 번에 한 행씩 답합니다. 이 형태는 대신 평균을 한 번만 계산합니다.

별칭은 선택 사항이 아닙니다

ERROR 1248은 항상 이것을 뜻하고, 해결 방법도 항상 같습니다: 닫는 괄호 뒤에 AS SOME_NAME을 넣으세요. 이름은 무엇이든 될 수 있고, 행을 설명하는 이름으로 만들 만한데, 독자가 그것을 만든 쿼리를 읽기 전에 그 이름을 먼저 만나기 때문입니다.

파생 테이블 또는 CTE

공통 테이블 표현식은 서브쿼리를 맨 위로 끌어올려 이름을 붙인 채로 같은 일을 합니다. 2가지 형태는 같은 행을 만들어내며, 다음 레슨이 그 차이를 다룹니다. MySQL CTE가 파생 테이블을 이기는 때가 옵티마이저가 어느 쪽을 다르게 다루는지 측정합니다.

요약

  • 쿼리의 결과를 쿼리하려면 파생 테이블을 사용하세요.
  • 별칭이 없으면 ERROR 1248이 나오므로, 별칭을 주세요.
  • 안쪽 쿼리의 열 별칭이 파생 테이블의 열이 된다고 예상하세요.
  • 계산된 열로 필터링하거나 조인해야 할 때 파생 테이블을 쓰세요.
  • 쿼리에 여러 단계가 있거나 같은 서브쿼리를 반복하게 되면 CTE를 쓰세요.

함께 보기