Database
 sql >> Base de Dados >  >> RDS >> Database

SQL MIN() para iniciantes


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() .