Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL FROM 절에서 서브쿼리(하위 쿼리) 사용하는 방법

MySQL에서 서브쿼리(하위 쿼리)는 SELECT 문의 FROM 절 안에서도 효과적으로 사용할 수 있습니다. 이렇게 작성된 서브쿼리는 일종의 임시 테이블(파생 테이블, Derived Table)처럼 동작하며, 복잡한 데이터를 단계별로 가공할 때 매우 유용합니다.

기본 문법

SELECT … FROM (subquery) [AS] name …;

FROM 절 내의 서브쿼리는 반드시 별칭(alias)을 가져야 한다는 점에 유의하세요. 별칭은 생략 가능해 보이지만, 실제로는 쿼리가 정상적으로 실행되기 위해 필요한 경우가 많습니다.

예제 데이터 준비

설명을 돕기 위해 다음과 같은 'cars' 테이블 데이터를 사용하겠습니다.

mysql> Select * from Cars;
+------+--------------+---------+
| ID   | Name         | Price   |
+------+--------------+---------+
| 1    | Nexa         | 750000  |
| 2    | Maruti Swift | 450000  |
| 3    | BMW          | 4450000 |
| 4    | VOLVO        | 2250000 |
| 5    | Alto         | 250000  |
| 6    | Skoda        | 1250000 |
| 7    | Toyota       | 2400000 |
| 8    | Ford         | 1100000 |
+------+--------------+---------+
8 rows in set (0.02 sec)

FROM 절에 서브쿼리 적용하기

아래 예제는 FROM 절 안에서 서브쿼리를 실행하여 컬럼 이름을 새롭게 정의하고, 그 결과를 마치 하나의 테이블인 것처럼 조회하는 방식입니다.

mysql> Select Id_New, Name_New, Price_New 
       FROM (SELECT Id as Id_New, Name as Name_New, Price as Price_New FROM Cars) as c 
       Where Price_New > 500000;
+--------+----------+-----------+
| Id_New | Name_New | Price_New |
+--------+----------+-----------+
| 1      | Nexa     | 750000    |
| 3      | BMW      | 4450000   |
| 4      | VOLVO    | 2250000   |
| 6      | Skoda    | 1250000   |
| 7      | Toyota   | 2400000   |
| 8      | Ford     | 1100000   |
+--------+----------+-----------+
6 rows in set (0.00 sec)

쿼리 결과 분석

위 쿼리의 동작 과정을 살펴보면 다음과 같습니다.

1단계: 괄호 안의 서브쿼리가 먼저 실행되어 'Cars' 테이블의 Id, Name, Price 컬럼을 각각 Id_New, Name_New, Price_New이라는 새로운 이름으로 변환한 임시 결과 집합을 만듭니다.
2단계: 이 임시 결과 집합에는 별칭 'c'가 부여되어, 외부 쿼리에서는 'c'라는 이름의 테이블처럼 참조할 수 있습니다.
3단계: 외부 쿼리의 WHERE 조건(Price_New > 500000)에 따라 가격이 500,000보다 큰 차량만 최종 출력됩니다.

그 결과, Alto(250,000)와 Maruti Swift(450,000) 두 행이 필터링되고 나머지 6개 행만 반환된 것을 확인할 수 있습니다.

정리

FROM 절의 서브쿼리는 원본 테이블을 직접 수정하지 않고도 컬럼명을 변경하거나, 집계 결과를 중간 단계로 활용하거나, 여러 단계의 필터링을 수행할 수 있게 해주는 강력한 기능입니다. 특히 GROUP BY나 JOIN과 결합하면 더욱 복잡한 분석 쿼리를 깔끔하게 구성할 수 있습니다.