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

SQL MAX() para iniciantes


Em SQL, o MAX() function é uma função agregada que retorna o valor máximo 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


Podemos usar a seguinte consulta para obter o preço máximo dessa tabela.
SELECT MAX(ProductPrice)
FROM Products;

Resultado:
+--------------------+
| (No column name)   |
|--------------------|
| 245.00             |
+--------------------+

Nesse caso, as informações de preço são armazenadas no ProductPrice coluna, e então passamos isso como um argumento para o MAX() 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. Alguns DBMSs podem usar algo como MAX(ProductPrice) como o nome da coluna. Isso é esperado, porque o MAX() A função não retorna nenhuma coluna. Você pode fornecer facilmente um nome de coluna atribuindo um alias.
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultado:
+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+

Resultados filtrados


O MAX() A função opera nas linhas retornadas pela consulta. Portanto, se você filtrar os resultados, o resultado de MAX() vai refletir isso.
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products
WHERE VendorId = 1001;

Resultado:
+----------------+
| MaximumPrice   |
|----------------|
| 25.99          |
+----------------+

Nesse caso, 25,99 é o preço máximo de todos os produtos oferecidos pelo fornecedor especificado.

NULL Valores


O MAX() 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 MAX() 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 MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultado:
+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+
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 MAX() 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 MAX() para encontrar a data máxima de nascimento (DOB ).
SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Resultado:
+------------+
| MaxDOB     |
|------------|
| 2020-11-28 |
+------------+

Esta seria a data de nascimento do animal de estimação mais jovem. Como mencionado, ele ignora qualquer NULL valores.

Dados de caracteres


Quando usado com colunas de dados de caracteres, MAX() encontra o valor mais alto na sequência de agrupamento.

Exemplo:
SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Resultado:
+----------------------+
| MaximumProductName   |
|----------------------|
| Straw Dog Box        |
+----------------------+

O DISTINCT Palavra-chave


Seu DBMS pode permitir o DISTINCT palavra-chave a ser usada com o MAX() função. Em caso afirmativo, isso provavelmente está em conformidade com o padrão ISO SQL.

Portanto, você pode fazer isso:
SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Resultado:
+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+

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 MAX() . O DISTINCT palavra-chave remove duplicatas, mas no caso de MAX() não fará diferença porque MAX() retorna o mesmo resultado, independentemente de quantas linhas compartilham o mesmo valor máximo.

Funções da janela


Dependendo do seu DBMS, você pode usar um OVER cláusula com seu MAX() 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 MAX() função com o OVER cláusula para aplicar uma função de janela aos dados.
SELECT 
    v.VendorName,
    p.ProductName,
    p.ProductPrice,
    MAX(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Maximum Price For This Vendor"
FROM Products p 
INNER JOIN Vendors v 
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Maximum Price For This Vendor";

Resultado:
+---------------+---------------------------------+----------------+---------------------------------+
| VendorName    | ProductName                     | ProductPrice   | Maximum Price For This Vendor   |
|---------------+---------------------------------+----------------+---------------------------------|
| Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99           | 9.99                            |
| Mars Supplies | Long Weight (green)             | 11.99          | 25.99                           |
| Mars Supplies | Long Weight (blue)              | 14.75          | 25.99                           |
| Mars Supplies | Left handed screwdriver         | 25.99          | 25.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 MAX() 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áximo de todos os produtos daquele fornecedor. Esse preço máximo muda à medida que o fornecedor muda (a menos que vários fornecedores tenham o mesmo preço máximo), 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() , MIN() , AVG() e COUNT() .