MySQL에서 여러 테이블에 흩어져 있는 값들 중 가장 큰 값(최댓값)을 찾아야 하는 경우가 있습니다. 이럴 때 GREATEST() 함수를 사용하면 아주 간단하게 해결할 수 있습니다.
이 글에서는 네 개의 테이블을 각각 생성하고 데이터를 삽입한 뒤, 각 테이블의 최댓값을 비교하여 전체 최댓값을 구하는 과정을 단계별로 살펴보겠습니다.
1. 첫 번째 테이블 생성 (DemoTable1)
먼저 첫 번째 테이블을 생성하는 쿼리입니다.
mysql> create table DemoTable1
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.70 sec)
INSERT 명령으로 첫 번째 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable1 values(10);
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1 values(60);
Query OK, 1 row affected (0.14 sec)
SELECT 문으로 첫 번째 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable1;
출력 결과
+-------+
| Value |
+-------+
| 10 |
| 60 |
+-------+
2 rows in set (0.00 sec)
2. 두 번째 테이블 생성 (DemoTable2)
두 번째 테이블을 생성하는 쿼리입니다.
mysql> create table DemoTable2
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.67 sec)
두 번째 테이블에도 레코드를 삽입합니다.
mysql> insert into DemoTable2 values(90);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable2 values(12);
Query OK, 1 row affected (0.12 sec)
SELECT 문으로 두 번째 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable2;
출력 결과
+-------+
| Value |
+-------+
| 90 |
| 12 |
+-------+
2 rows in set (0.00 sec)
3. 세 번째 테이블 생성 (DemoTable3)
세 번째 테이블을 생성하는 쿼리입니다.
mysql> create table DemoTable3
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.65 sec)
세 번째 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable3 values(34);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable3 values(120);
Query OK, 1 row affected (0.17 sec)
SELECT 문으로 세 번째 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable3;
출력 결과
+-------+
| Value |
+-------+
| 34 |
| 120 |
+-------+
2 rows in set (0.00 sec)
4. 네 번째 테이블 생성 (DemoTable4)
네 번째 테이블을 생성하는 쿼리입니다.
mysql> create table DemoTable4
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.68 sec)
네 번째 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable4 values(140);
Query OK, 1 row affected (0.72 sec)
mysql> insert into DemoTable4 values(290);
Query OK, 1 row affected (0.14 sec)
SELECT 문으로 네 번째 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable4;
출력 결과
+-------+
| Value |
+-------+
| 140 |
| 290 |
+-------+
2 rows in set (0.00 sec)
5. 네 개 테이블에서 가장 큰 값 조회하기
이제 핵심인 GREATEST() 함수를 사용한 쿼리입니다. 각 테이블에서 MAX(Value)로 최댓값을 먼저 구한 뒤, GREATEST()가 이 네 개의 값을 비교하여 그중 가장 큰 값을 반환합니다.
mysql> select greatest(
-> (select max(Value) from DemoTable1),
-> (select max(Value) from DemoTable2),
-> (select max(Value) from DemoTable3),
-> (select max(Value) from DemoTable4)
-> ) as MaximumValue;
출력 결과
+--------------+
| MaximumValue |
+--------------+
| 290 |
+--------------+
1 row in set (0.00 sec)
동작 원리 정리
위 쿼리의 동작 방식은 다음과 같습니다.
1. 각 서브쿼리 (select max(Value) from DemoTableN)가 해당 테이블의 최댓값을 계산합니다.
2. 네 테이블의 최댓값은 각각 60, 90, 120, 290입니다.
3. GREATEST() 함수가 이 값들을 비교하여 최종적으로 290을 반환합니다.
이처럼 GREATEST() 함수와 스칼라 서브쿼리를 조합하면, 테이블이 몇 개로 나뉘어 있더라도 하나의 쿼리만으로 전체 최댓값을 손쉽게 구할 수 있습니다. 참고로 반대로 가장 작은 값을 찾으려면 GREATEST() 대신 LEAST() 함수를 사용하면 됩니다.