Em SQL, o
MIN()
function é uma função agregada que retorna o valor mínimo em uma determinada expressão. Abaixo estão alguns exemplos básicos para demonstrar como funciona.
Tabela de amostra
Suponha que temos a seguinte tabela:
SELECT * FROM Products;
Resultado:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | NULL | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Exemplo
Aqui está um exemplo simples para demonstrar.
SELECT MIN(ProductPrice)
FROM Products;
Resultado:
+--------------------+ | (No column name) | |--------------------| | 9.99 | +--------------------+
Nesse caso, as informações de preço são armazenadas no
ProductPrice
coluna, e então passamos isso como um argumento para o MIN()
função, que então calcula e retorna o resultado. Usando aliases de coluna
Você notará que os resultados anteriores não incluem um nome de coluna. Isso é esperado, porque o
MIN()
A função não retorna nenhuma coluna. Você pode fornecer facilmente um nome de coluna atribuindo um alias. SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;
Resultado:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+
Resultados filtrados
O
MIN()
A função opera nas linhas retornadas pela consulta. Então, se você filtrar os resultados, o resultado de MIN()
vai refletir isso. SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products
WHERE VendorId = 1001;
Resultado:
+----------------+ | MinimumPrice | |----------------| | 11.99 | +----------------+
Nesse caso, 11,99 é o preço mínimo de todos os produtos oferecidos pelo fornecedor especificado.
NULL
Valores
O
MIN()
função ignora qualquer NULL
valores. Em nossa tabela de amostra acima, número do produto 6
tem NULL
em seu ProductPrice
coluna, mas isso foi ignorado em nosso MIN()
exemplo. Dependendo de seu DBMS e suas configurações, você pode ou não ver um aviso de que
NULL
valores foram eliminados no conjunto de resultados. Aqui está um exemplo do que você pode ver:
SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;
Resultado:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Tudo isso nos diz que a coluna continha pelo menos um
NULL
valor, e que foi ignorado no cálculo dos resultados. Dados de data/hora
Você pode usar
MIN()
em valores de data/hora. Suponha que temos a seguinte tabela:
SELECT PetName, DOB
FROM Pets;
Resultado:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +-----------+------------+
Podemos usar
MIN()
para encontrar a data mínima de nascimento (DOB
). SELECT MIN(DOB) AS MinDOB
FROM Pets;
Resultado:
+------------+ | MinDOB | |------------| | 2018-10-01 | +------------+
Novamente, ele ignora
NULL
valores. Dados de caracteres
Quando usado com colunas de dados de caracteres,
MIN()
encontra o valor mais baixo na sequência de classificação. Exemplo:
SELECT MIN(ProductName) AS MinimumProductName
FROM Products;
Resultado:
+---------------------------------+ | MinimumProductName | |---------------------------------| | Bottomless Coffee Mugs (4 Pack) | +---------------------------------+
O DISTINCT
Palavra-chave
Seu DBMS pode permitir o
DISTINCT
palavra-chave a ser usada com o MIN()
função. Em caso afirmativo, isso provavelmente está em conformidade com o padrão ISO SQL. Portanto, você pode fazer isso:
SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;
Resultado:
+----------------+ | MinimumPrice | |----------------| | 9.99 | +----------------+
Mas não terá impacto nos resultados.
O
DISTINCT
palavra-chave pode ser muito útil quando usada com outros contextos (por exemplo, com o COUNT()
função), mas não tem significado quando usado com MIN()
. O DISTINCT
palavra-chave remove duplicatas, mas no caso de MIN()
não fará diferença porque MIN()
retorna o mesmo resultado, independentemente de quantas linhas compartilham o mesmo valor mínimo. Funções da janela
Dependendo do seu DBMS, você pode usar um
OVER
cláusula com seu MIN()
função para criar uma função de janela. Uma função de janela executa uma operação semelhante à agregação em um conjunto de linhas de consulta. Ele produz um resultado para cada linha da consulta. Isso contrasta com uma operação agregada, que agrupa linhas de consulta em uma única linha de resultado.
Aqui está um exemplo para demonstrar o conceito.
Já vimos os
Products
tabela. Nosso banco de dados também possui um Customers
tabela e contém os seguintes dados:+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | CustomerId | CustomerName | PostalAddress | City | StateProvince | ZipCode | Country | Phone | |--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 1001 | Palm Pantry | 20 Esplanade | Townsville | QLD | 2040 | AUS | (308) 555-0100 | | 1002 | Tall Poppy | 12 Main Road | Columbus | OH | 43333 | USA | (310) 657-0134 | | 1003 | Crazy Critters | 10 Infinite Loops | Cairns | QLD | 4870 | AUS | (418) 555-0143 | | 1004 | Oops Media | 4 Beachside Drive | Perth | WA | 1234 | AUS | (405) 443-5987 | | 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 | | 1006 | Hi-Five Solutionists | 5 High Street | Highlands | HI | 1254 | AUS | (415) 413-5182 | +--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
Podemos recuperar dados dessas tabelas e apresentá-los como um conjunto de resultados usando uma junção.
Também podemos usar o
MIN()
função com o OVER
cláusula para aplicar uma função de janela aos dados. SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
MIN(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Minimum Price For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Minimum Price For This Vendor";
Resultado:
+---------------+---------------------------------+----------------+---------------------------------+ | VendorName | ProductName | ProductPrice | Minimum Price For This Vendor | |---------------+---------------------------------+----------------+---------------------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.99 | | Mars Supplies | Long Weight (green) | 11.99 | 11.99 | | Mars Supplies | Long Weight (blue) | 14.75 | 11.99 | | Mars Supplies | Left handed screwdriver | 25.99 | 11.99 | | Pedal Medals | Straw Dog Box | NULL | 245.00 | | Pedal Medals | Chainsaw | 245.00 | 245.00 | | Randy Roofers | Sledge Hammer | 33.49 | 33.49 | +---------------+---------------------------------+----------------+---------------------------------+
Neste caso usamos o
OVER
cláusula com nosso MIN()
função para particionar o resultado pelo nome do fornecedor. Ao fazer isso, conseguimos retornar informações de preço para cada produto, bem como o preço mínimo para todos os produtos daquele fornecedor. Esse preço mínimo muda conforme o fornecedor muda (a menos que vários fornecedores tenham o mesmo preço mínimo), mas permanece o mesmo para todos os produtos do mesmo fornecedor.
Este conceito também pode ser aplicado a outras funções agregadas em SQL, como
SUM()
, AVG()
, MAX()
e COUNT()
.