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

MySQL에서 합계가 150 미만인 열 값만 조회하고 내림차순으로 정렬하는 방법

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 문으로 깔끔하게 처리할 수 있습니다.