Voltar para a lista de artigos Artigos
9 minutos de leitura

Funções SQL MIN e MAX Explicadas em 6 Exemplos

O que são as funções SQL MIN() e MAX()? Quando você deve usá-las como funções agregadas, e quando deve usá-las com funções de janela? Explicamos usando exemplos práticos.

É difícil imaginar SQL sem as funções agregadas MIN() e MAX(). Elas são muito úteis entre muitos profissionais de dados porque nos permitem resolver muitos problemas de negócios. Neste artigo, vou explicar o que cada função faz e discutir vários casos de uso.

Vamos começar.

Qual é a função MIN() em SQL?

O padrão SQL é suportado pela maioria dos motores de banco de dados relacionais e inclui várias funções agregadas. Estas funções agregadas computam cálculos sobre dados numéricos. Um Guia para Iniciantes em Funções Agregadas SQL discute todas elas em detalhes; este artigo enfoca apenas duas destas funções: MIN() e MAX().

Primeiro, vamos falar sobre a função MIN(). Ela retorna o menor valor em um conjunto de valores. Os valores podem vir de uma coluna numérica ou como resultado de uma expressão que retorna um valor numérico. (Nota: A coluna pode vir de uma tabela ou de uma vista.) É uma função escalar que retorna um valor numérico.

A sintaxe da função MIN() é apresentada abaixo:

MIN(column_or_expression)

Como você vê, esta função leva um argumento - uma coluna ou uma expressão com valores numéricos. É importante que os valores sejam numéricos, pois a função encontra o valor mínimo entre eles. Por exemplo, a partir deste conjunto de valores ...

4, 5, 8, 2, 14

... MIN() retorna 2.

Qual é a função MAX() em SQL?

Como MIN(), MAX() é uma função agregada que retorna um valor numérico a partir de um conjunto. A diferença é que ela retorna o maior valor (máximo). Os valores podem vir de uma coluna ou como o resultado de uma expressão que retorna um valor ou valores numéricos. É uma função escalar que retorna um valor.

Aqui está a sintaxe da função MAX():

MAX(column_or_expression)

A partir deste conjunto de valores ...

4, 5, 8, 2, 14 

... MAX() retorna 14.

A amostra de dados

Antes de começarmos a analisar os casos de uso MIN() e MAX(), vejamos os dados que estaremos usando na tabela cosmetics:

idnamecategorydelivered_yearprice
1shampoohair202011
2night creamface202012
3cleanserface20205
4brushhair20203
5mascaraeye20218
6eyebroweye202115
7conditionerhair202121
8sprayhair202113
9eyelinereye202120
10tonicface202021
11face maskface202110
12eye creameye202122
13hair maskhair20203

Esta tabela armazena informações sobre produtos cosméticos em três categorias (a coluna category): cabelo, rosto e olhos. Os nomes dos produtos estão no nome da coluna. As duas últimas colunas apresentam dados sobre quando o produto foi entregue (delivered_year) e seu price. Há apenas dois anos (2020 e 2021) na coluna delivered_year.

Se você precisar de ajuda com as instruções e funções SQL que usamos neste artigo, experimente a folha de trapaça SQL para Iniciantes .

Exemplos de casos de uso de MIN() e MAX()

1. Usando MIN() ou MAX() como uma única coluna

Funções agregadas como MIN() podem ser usadas como uma única coluna na consulta SELECT. Por exemplo:

SELECT MIN(price) FROM cosmetics;

Aqui está o resultado:

min
3

Após a palavra-chave SELECT, colocamos MIN() e o nome da coluna (neste caso, price). A seguir é a palavra-chave FROM e o nome da tabela (cosmetics). O resultado é o menor valor da coluna price, que é 3.

Você pode usar MAX() exatamente da mesma maneira para encontrar o preço mais alto do produto:

SELECT MAX(price) FROM cosmetics;

E aqui está o resultado:

max
22

O preço máximo na tabela cosmetics é 22 (o preço do creme para os olhos).

O artigo How to Find Minimum Values in Columns dá mais exemplos sobre como encontrar o valor mínimo.

2. Usando MIN() e MAX() com Outras Colunas

Um uso mais avançado das funções MIN() ou MAX() é utilizá-las em grupos de filas. Aqui está outra pergunta:

SELECT category,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category;

Ela retorna os dados:

categorymax_price
hair21
face21
eye22

Primeiro é a palavra-chave SELECT com o nome da coluna (category), depois a função MAX() com a coluna price como argumento. Depois temos max_price, o pseudônimo da nova coluna criada por MAX().

A seguir é a palavra-chave FROM e o nome da tabela. No final, temos a cláusula GROUP BY com a coluna category. Isto determina os grupos (ou seja, os produtos são agrupados por categoria). Para cada grupo, obtemos seu maior valor - neste caso, o preço mais alto entre os produtos daquela categoria. Na categoria "olho", o preço mais alto é de US$ 22; nas categorias "rosto" e "cabelo", é de US$ 21.

O artigo Como Encontrar Valores Máximos em Linhas lhe dá mais exemplos desta função.

3. Usando MIN() e MAX() na mesma consulta

Você pode usar ambas as funções MIN e MAX em um SELECT. Se você usar somente estas funções sem colunas, não precisa de uma cláusula GROUP BY.

A seguir, temos uma consulta que implementa ambas as funções:

 SELECT MIN(price) AS min_price,
  MAX(price) AS max_price
FROM cosmetics;

Esta consulta retorna os dados:

min_pricemax_price
322

No SELECT, temos a função MIN() com o argumento da coluna price seguida de MAX() com o mesmo argumento e seus respectivos pseudônimos. Isto retorna o preço mínimo ($3) e máximo ($22) para todos os produtos da tabela.

Naturalmente, você pode fazer o mesmo calculando o preço mínimo e máximo para cada categoria. Entretanto, aqui você precisará usar GROUP BY:

SELECT category,
  MIN(price) AS min_price,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category;

Aqui está o conjunto de resultados:

categorymin_pricemax_price
hair321
face521
eye822

Neste caso, o preço mínimo na categoria "cabelo" é $3 e o preço máximo é $21, enquanto na categoria "olho" o valor mais baixo é $8 e o mais alto é $22.

Você pode saber mais sobre como encontrar o valor mínimo e máximo nos artigos Como encontrar o valor mínimo de uma coluna em SQL e Como encontrar o valor máximo de uma coluna numérica em SQL.

4. Usando MIN() ou MAX() na Cláusula HAVING

Outra maneira de usar MIN() ou MAX() é filtrar linhas de acordo com o valor retornado por esta função - ou seja, na cláusula HAVING.

A consulta abaixo implementa MIN() em HAVING:

SELECT category,
  MAX(price) AS max_price
FROM cosmetics
GROUP BY category
HAVING MIN(price)>4;

O conjunto de resultados:

categorymax_price
face21
eye22

No site SELECT, temos a coluna category. A seguir, temos a função MAX() com price como argumento. Para cada categoria, calcularemos o preço máximo entre os produtos pertencentes a esta categoria. Depois FROM cosmetics vem a cláusula GROUP BY com a coluna category.

No final da consulta é a cláusula HAVING com a função MIN(). Este encontrará o preço mais baixo entre os produtos de cada categoria; se este preço for inferior a 4, não será incluído nos resultados. Como o preço mínimo na categoria "cabelo" é de US$ 3, ele não foi exibido no conjunto de resultados.

Note que o uso de qualquer uma das funções em HAVING não requer o uso (ou qualquer função agregada) em SELECT.

5. Usando MIN() ou MAX() em uma função de janela simples

O uso mais avançado de MIN() ou MAX() está em uma função de janela. Se você não estiver familiarizado com funções de janela, leia o artigo Exemplos de funções de janela SQL com explicações.

Aqui está uma simples função de janela que usa a função MIN():

SELECT name, price, category, delivered_year,
  MIN(price) OVER (ORDER BY category DESC) AS min_price
FROM cosmetics;

A primeira coisa que você pode notar é a lista de colunas SELECT: name, price, category, delivered_year. A seguir é a função agregada MIN(price), que encontra o valor mais baixo na coluna price. OVER é o que faz desta uma função de janela; ela define a janela. ou o conjunto de linhas dentro do conjunto de resultados da consulta. Isto nos permite calcular um valor agregado para cada linha na janela. Aqui, OVER é emparelhado com ORDER BY categoria DESC (ou seja, em ordem decrescente); assim, o preço mínimo é sempre $3, porque o preço mais baixo na categoria "cabelo" é $3, que é menor que o mínimo da categoria seguinte de $5.

O resultado é o seguinte:

namepricecategorydelivered_yearmin_price
hair mask3hair20203
brush3hair20203
conditioner21hair20213
spray13hair20213
shampoo11hair20203
night cream12face20203
cleanser5face20203
tonic21face20203
face mask10face20213
mascara8eye20213
eye cream22eye20213
eyeliner20eye20213
eyebrow15eye20213

6. Usando MIN/MAX em uma Função de Janela Particionada

A seguir, vamos usar MIN() ou MAX() em uma função de janela que tem a cláusula PARTITION BY. (Se você precisar de uma atualização em PARTITION BY, dê uma olhada na folha de consultas SQL Funções de Janela (Window Functions) em SQL .) Esta é a consulta:

SELECT name, price, category, delivered_year,
  MIN(price) OVER (PARTITION BY delivered_year
           	ORDER BY category DESC)
  AS min_price
FROM cosmetics;

Esta consulta calcula o preço mínimo para cada partição com base na coluna delivered_year e ordena as linhas por categoria.

Ela retorna o seguinte conjunto de resultados:

namepricecategorydelivered_yearmin_price
shampoo11hair20203
brush3hair20203
hair mask3hair20203
tonic21face20203
night cream12face20203
cleanser5face20203
spray13hair202113
conditioner21hair202113
face mask10face202110
eyeliner20eye20218
mascara8eye20218
eyebrow15eye20218
eye cream22eye20218

Estes resultados contêm a lista de cosméticos, incluindo seu nome, preço, categoria e o ano de entrega. Cada linha também contém o preço mínimo para esse ano de entrega (que é a partição). Em cada divisória, as linhas são ordenadas em ordem decrescente por categoria.

Neste caso, a cláusula OVER contém as cláusulas ORDER BY e PARTITION BY. PARTITION BY delivered_year denota que o preço mínimo é calculado separadamente para cada ano. Os registros em cada partição (o ano em que os produtos foram entregues) são classificados por categoria em ordem decrescente (ORDER BY categoria DESC).

O que aprendemos sobre as funções MIN() e MAX() da SQL

As funções agregadas do SQL MIN() e MAX() são muito populares. Neste artigo, eu expliquei como utilizá-las em vários casos. A principal diferença entre elas é que MIN() encontra o valor mínimo em um conjunto de valores, enquanto MAX() retorna o valor máximo.

Agora que você sabe como usar MIN() e MAX(), você está pronto para isso:

  • Encontrar os maiores/pequenos valores entre todas as linhas ou grupos de linhas dadas.
  • Comparar os valores mínimo e máximo com outras linhas.
  • Use estas funções em divisórias e em funções de janela simples.

Para mais informações sobre as diferenças entre valores agregados e funções de janela, tente nosso artigo SQL Funções de Janela (Window Functions) em SQL vs. Funções Agregadas SQL: Semelhanças e diferenças.

Se você é um iniciante e gostaria de expandir seus conhecimentos de SQL, recomendo LearnSQL.com.br's SQL para Iniciantes curso. Mas se você já está familiarizado com SQL básico, você pode querer fazer o nosso Funções de Janela (Window Functions) em SQL curso para elevar o nível de suas habilidades.