MySQL에서 특정 조건을 만족하는 데이터만 추출해야 할 때는 서브쿼리(subquery)를 활용하면 간단하게 해결할 수 있습니다. 이번 글에서는 열 값의 합계가 150 미만이 되는 행만 조회한 뒤, 그 결과를 내림차순으로 정렬하는 방법을 예제와 함께 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable844(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Amount int
);
Query OK, 0 rows affected (0.95 sec)
2. 샘플 데이터 삽입하기
INSERT 명령을 이용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable844(Amount) values(80); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable844(Amount) values(100); Query OK, 1 row affected (0.08 sec) mysql> insert into DemoTable844(Amount) values(60); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable844(Amount) values(40); Query OK, 1 row affected (0.36 sec) mysql> insert into DemoTable844(Amount) values(150); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable844(Amount) values(24); Query OK, 1 row affected (0.40 sec)
3. 저장된 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable844;
실행 결과는 다음과 같습니다.
+----+--------+ | Id | Amount | +----+--------+ | 1 | 80 | | 2 | 100 | | 3 | 60 | | 4 | 40 | | 5 | 150 | | 6 | 24 | +----+--------+ 6 rows in set (0.00 sec)
4. 합계가 150 미만인 값만 조회하기
이제 서브쿼리를 사용해 합계가 150 미만이 되는 열 값만 화면에 표시하고, 결과를 내림차순으로 정렬해 보겠습니다. 아래는 해당 작업을 수행하는 쿼리입니다.
mysql> select *from DemoTable844 tbl
where (select sum(Amount) from DemoTable844 where Amount <= tbl.Amount order by Amount) < 150
order by Amount desc;
실행 결과는 다음과 같습니다.
+----+--------+ | Id | Amount | +----+--------+ | 3 | 60 | | 4 | 40 | | 6 | 24 | +----+--------+ 3 rows in set (0.26 sec)
쿼리 동작 원리
위 쿼리는 상관 서브쿼리(correlated subquery) 방식으로 동작합니다. 외부 쿼리의 각 행에 대해, 현재 행의 Amount 값보다 작거나 같은 모든 레코드의 합계(SUM)를 계산합니다. 즉, 값을 오름차순으로 누적했을 때의 누적 합계가 150 미만인 행만 최종 결과에 포함되는 방식입니다.
- Amount = 24 → 누적 합계 24 (150 미만) → 포함
- Amount = 40 → 누적 합계 24 + 40 = 64 (150 미만) → 포함
- Amount = 60 → 누적 합계 24 + 40 + 60 = 124 (150 미만) → 포함
- Amount = 80 → 누적 합계 24 + 40 + 60 + 80 = 204 (150 이상) → 제외
마지막으로 ORDER BY Amount DESC 절이 결과를 내림차순으로 정렬해 줍니다. 이처럼 서브쿼리를 활용하면 누계 조건과 같은 복잡한 필터링도 별도의 임시 테이블 없이 하나의 SELECT 문으로 깔끔하게 처리할 수 있습니다.