SQL : MAX 함수
이 SQL 튜토리얼에서는 구문과 예제를 통해 SQL MAX 함수를 사용하는 방법을 설명합니다.
설명
SQL MAX 함수는 SELECT 문에서 식의 최대값을 반환하는 데 사용됩니다.
구문
SQL에서 MAX 함수의 구문은 다음과 같습니다.
SELECT MAX(aggregate_expression)
FROM tables
[WHERE conditions];
또는 하나 이상의 열을 기준으로 결과를 그룹화할 때 MAX 함수의 구문은 다음과 같습니다.
SELECT expression1, expression2, ... expression_n,
MAX(aggregate_expression)
FROM tables
[WHERE conditions]
GROUP BY expression1, expression2, ... expression_n;
매개변수 및 인수
expression1, expression2, ... expression_n
- MAX 함수 내에 캡슐화되지 않은 표현식은 SQL 문 끝에 있는 GROUP BY 절에 포함되어야 합니다.
aggregate_expression
- 최대값이 반환되는 열 또는 표현식입니다.
tables
- 레코드를 검색하려는 테이블입니다. FROM 절에 테이블이 하나 이상 나열되어 있어야 합니다.
WHERE conditions(WHERE 조건)
- 선택 사항입니다. 레코드를 선택하려면 반드시 충족해야 하는 조건입니다.
예제 - 단일 표현식 사용
SQL MAX 함수를 사용하는 가장 간단한 방법은 MAX 값을 계산하는 단일 필드를 반환하는 것입니다.
예를 들어 모든 직원의 최대 salary를 알고 싶을 수 있습니다.
SELECT MAX(salary) AS "Highest salary"
FROM employees;
이 SQL MAX 함수 예제에서는 MAX(salary) 필드의 별칭을 "Highest salary"로 지정했습니다. 결과적으로 결과 집합이 반환될 때 "Highest salary"가 필드 이름으로 표시됩니다.
예제 - SQL GROUP BY 절 사용
경우에 따라 SQL MAX 함수와 함께 SQL GROUP BY 절을 사용해야 할 수도 있습니다.
예를 들어 SQL MAX 함수를 사용하여 각 department의 이름과 해당 department의 최대 salary를 반환할 수도 있습니다.
SELECT department, MAX(salary) AS "Highest salary"
FROM employees
GROUP BY department;
SQL SELECT 문에 MAX 함수로 캡슐화되지 않은 열 하나를 나열했으므로 SQL GROUP BY 절을 사용해야 합니다. 따라서 부서 필드는 GROUP BY 섹션에 나열되어야 합니다.
자주 묻는 질문
- 질문 : 테이블에서 몇 가지 정보를 추출하려고 합니다. 간단하게 설명하기 위해 report_history 테이블에 user_name, report_job_id, report_name, report_run_date의 4개 열이 있다고 가정해 보겠습니다.
Oracle에서 보고서가 실행될 때마다 위의 정보가 기록된 레코드가 이 테이블에 기록됩니다. 제가 하고자 하는 것은 이 테이블에서 각 개별 보고서가 마지막으로 실행된 시점과 마지막으로 실행한 사람을 가져오는 것입니다.
내 초기 쿼리입니다.
SELECT report_name, MAX(report_run_date)
FROM report_history
GROUP BY report_name
는 정상적으로 실행됩니다. 그러나 보고서를 실행한 사용자의 이름은 제공하지 않습니다.
선택 목록과 그룹별 절에 user_name을 추가하면 각 보고서에 대해 여러 줄이 반환되며, 결과에는 각 사용자가 해당 보고서를 마지막으로 실행한 시간이 표시됩니다. (예: User1은 Report 1을 01-JUL-03에 실행했고, User2는 Report 1을 01-AUG-03에 실행했습니다). 그런 건 필요 없습니다... 특정 보고서를 마지막으로 실행한 사람이 누구인지 알고 싶을 뿐입니다.
어떤 제안이 있나요?
- 답변 : 여기서부터 상황이 조금 복잡해집니다. 아래의 SQL SELECT 문은 원하는 결과를 반환합니다.
잠시 시간을 내어 저희가 한 일에 대해 설명해 드리겠습니다.SELECT rh.user_name, rh.report_name, rh.report_run_date FROM report_history rh, (SELECT MAX(report_run_date) AS maxdate, report_name FROM report_history GROUP BY report_name) maxresults WHERE rh.report_name = maxresults.report_name AND rh.report_run_date= maxresults.maxdate;
먼저 report_history 테이블의 첫 번째 인스턴스에 별칭을 rh로 지정했습니다.
둘째, FROM 절에 두 가지 구성 요소를 포함시켰습니다. 첫 번째는 report_history라는 테이블(별칭은 rh)입니다. 두 번째는 select 문입니다.
(SELECT MAX(report_run_date) AS maxdate, report_name
FROM report_history
GROUP BY report_name) maxresults
max(report_run_date)의 별칭을 maxdate로 지정하고 전체 결과 집합의 별칭을 maxresults로 지정했습니다.
이제 FROM 절 내에 이 select 문을 만들었으므로 Oracle은 이러한 결과를 원래 report_history 테이블에 대해 조인할 수 있습니다. 따라서 report_name 및 report_run_date 필드를 rh 및 maxresults라는 테이블 간에 조인했습니다. 이렇게 하면 report_name, max(report_run_date) 및 user_name을 검색할 수 있습니다.
- 질문 : SQL 쿼리에 대한 도움이 필요합니다. Oracle에 order_no, customer, amount 필드가 있는 orders이라는 테이블이 있습니다.
총 주문 금액이 가장 높은 고객을 반환하는 쿼리가 필요합니다.
답변 : 다음 SQL은 orders 테이블에서 총 금액이 가장 높은 고객을 반환해야 합니다.
SELECT query1.* FROM (SELECT customer, SUM(orders.amount) AS total_amt FROM orders GROUP BY orders.customer) query1, (SELECT MAX(query2.total_amt) AS highest_amt FROM (SELECT customer, SUM(orders.amount) AS total_amt FROM orders GROUP BY orders.customer) query2) query3 WHERE query1.total_amt = query3.highest_amt;
이 SQL SELECT 문은 각 고객의 총 주문을 요약한 다음 총 주문이 가장 많은 고객을 반환합니다. 이 구문은 Oracle에 최적화되어 있으며 다른 데이터베이스 기술에서는 작동하지 않을 수 있습니다.
질문 : Oracle 데이터베이스에서 몇 가지 정보를 검색하려고 합니다. Name과 Score라는 두 개의 필드가 있는 Scoring이라는 테이블이 있습니다. 제가 얻고 싶은 것은 테이블에서 가장 높은 점수와 선수의 이름입니다.
답변 : 다음 SQL SELECT 문이 작동합니다.
SELECT Name, Score FROM Scoring WHERE Score = (SELECT MAX(Score) FROM Scoring);
- 질문 : SQL 쿼리에 대한 도움이 필요합니다. Oracle에 OrderNo, Customer_id, Order_Date, Amount와 같은 필드가 있는 cust_order라는 테이블이 있습니다.
주문 수가 가장 많은 customer_id를 찾고 싶습니다.
다음 쿼리로 시도해 보았습니다.
SELECT MAX(COUNT(*))
FROM CUST_ORDER
GROUP BY CUSTOMER_ID;
이렇게 하면 최대 카운트가 나오지만 CUSTOMER_ID를 얻을 수 없습니다. 도와주실 수 있나요?
답변 : 다음 SQL SELECT 문은 cust_order 테이블에서 주문 수가 가장 많은 고객을 반환해야 합니다.
SELECT query1.* FROM (SELECT Customer_id, Count(*) AS order_count FROM cust_order GROUP BY cust_order.Customer_id) query1, (SELECT max(query2.order_count) AS highest_count FROM (SELECT Customer_id, Count(*) AS order_count FROM cust_order GROUP BY cust_order.Customer_id) query2) query3 WHERE query1.order_count = query3.highest_count;
이 SQL SELECT 문은 각 고객의 총 주문을 합산한 다음 주문 수가 가장 많은 고객을 반환합니다. 이 구문은 Oracle에 최적화되어 있으며 다른 데이터베이스 기술에서는 작동하지 않을 수 있습니다.
질문 : 부서 30에서 최대 급여를 받는 직원을 가져오려고 하는데 직원의 전체 정보를 표시해야 합니다. 다음 쿼리를 시도했지만 30번 부서와 80번 부서의 결과가 모두 반환됩니다.
SELECT * FROM employees WHERE salary = (SELECT MAX(salary) FROM employees WHERE department_id=30);
답변 : 작성한 SQL SELECT 문은 먼저 부서 30의 최대 급여를 결정한 다음 이 급여를 받는 모든 직원을 선택합니다. 이 경우 동일한 급여를 받는 직원이 2명(부서 30에 1명, 부서 80에 1명)이어야 합니다. 부서 30의 직원만 반환하도록 쿼리 결과를 구체화해야 합니다.
이 SQL SELECT 문을 사용해 보세요.
SELECT *
FROM employees
WHERE department_id=30
AND salary = (SELECT MAX(salary)
FROM employees
WHERE department_id=30);
이렇게 하면 급여가 가장 높은 30번 부서의 직원에 대한 직원 정보만 반환됩니다.