Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MAX() – Encontre o valor máximo em uma coluna no MySQL


O MySQL MAX() function é uma função agregada que retorna o valor máximo de uma expressão.

Normalmente, a expressão seria um intervalo de valores retornados como linhas separadas em uma coluna, e você pode usar essa função para localizar o valor máximo das linhas retornadas. Se não houver linhas correspondentes, MAX() retorna NULL .

Por exemplo, você pode usar esta função para descobrir qual cidade tem a maior população de uma lista de cidades.


Sintaxe


A sintaxe de MAX() fica assim:
MAX([DISTINCT] expr) [over_clause]

Onde expr é a expressão para a qual você deseja o valor máximo.

over_clause é uma cláusula opcional que funciona com funções de janela. Observe que a over_clause só pode ser usado se você não usar o DISTINCT palavra-chave.

O (opcional) DISTINCT palavra-chave pode ser usada para eliminar valores duplicados.

Exemplo básico


Primeiro, aqui estão os dados brutos que usaremos neste exemplo:
USE world;
SELECT Name, Population
FROM City
WHERE CountryCode = 'THA';

Resultado:
+-------------------+------------+
| Name              | Population |
+-------------------+------------+
| Bangkok           |    6320174 |
| Nonthaburi        |     292100 |
| Nakhon Ratchasima |     181400 |
| Chiang Mai        |     171100 |
| Udon Thani        |     158100 |
| Hat Yai           |     148632 |
| Khon Kaen         |     126500 |
| Pak Kret          |     126055 |
| Nakhon Sawan      |     123800 |
| Ubon Ratchathani  |     116300 |
| Songkhla          |      94900 |
| Nakhon Pathom     |      94100 |
+-------------------+------------+

Podemos usar o MAX() função para encontrar a cidade com a maior população (ou seja, a linha com o valor máximo em sua coluna de população).
USE world;
SELECT MAX(Population) AS 'Maximum Value'
FROM City
WHERE CountryCode = 'THA';

Resultado:
+---------------+
| Maximum Value |
+---------------+
|       6320174 |
+---------------+

A Cláusula GROUP BY


Podemos usar o GROUP BY cláusula para listar cada país, juntamente com a população da maior cidade desse país (por população):
USE world;
SELECT District, MAX(Population) AS 'Max Value'
FROM City
WHERE CountryCode = 'AUS'
GROUP BY District;

Resultado:
+-----------------+-----------+
| District        | Max Value |
+-----------------+-----------+
| New South Wales |   3276207 |
| Victoria        |   2865329 |
| Queensland      |   1291117 |
| West Australia  |   1096829 |
| South Australia |    978100 |
| Capital Region  |    322723 |
| Tasmania        |    126118 |
+-----------------+-----------+

A Cláusula ORDER BY


Também podemos usar o ORDER BY cláusula para especificar uma coluna com a qual ordenar por:
USE world;
SELECT District, MAX(Population) AS 'Max Value'
FROM City
WHERE CountryCode = 'AUS'
GROUP BY District
ORDER BY `Max Value` ASC;

Resultado:
+-----------------+-----------+
| District        | Max Value |
+-----------------+-----------+
| Tasmania        |    126118 |
| Capital Region  |    322723 |
| South Australia |    978100 |
| West Australia  |   1096829 |
| Queensland      |   1291117 |
| Victoria        |   2865329 |
| New South Wales |   3276207 |
+-----------------+-----------+

Isso ordena os resultados em ordem crescente, que lista primeiro o valor mínimo.

Observe que, ao ordenar por um alias de várias palavras (como `Max Value` ), você precisa usar o caractere de acento grave (` ) em vez do apóstrofo (' ) para cercar as duas palavras.

Encontre o comprimento máximo de caracteres


O MAX() A função não se limita apenas a colunas com dados numéricos. Você também pode combinar MAX() com outras funções para retornar valores máximos em outras áreas.

Por exemplo, usando nossos dados de exemplo, podemos encontrar o valor com o número máximo de caracteres na City coluna:
SELECT MAX(CHAR_LENGTH(Name)) AS 'Maximum Character Length'
FROM city;

Resultado:
+--------------------------+
| Maximum Character Length |
+--------------------------+
|                       34 |
+--------------------------+

Também podemos ver isso usando a seguinte consulta (que não envolve o MAX() função):
SELECT Name, CHAR_LENGTH(Name) AS 'Character Length'
FROM city
ORDER BY `Character Length` DESC
LIMIT 10;

Resultado:
+--------------------------------------+------------------+
| Name                                 | Character Length |
+--------------------------------------+------------------+
| Luxembourg [Luxemburg/Lëtzebuerg]   |               34 |
| Castellón de la Plana [Castell      |               31 |
| San Fernando del Valle de Cata       |               30 |
| Santo Domingo de los Colorados       |               30 |
| Thiruvananthapuram (Trivandrum       |               30 |
| [San Cristóbal de] la Laguna        |               29 |
| Ingraj Bazar (English Bazar)         |               28 |
| Soledad de Graciano Sánchez         |               28 |
| Valle de Chalco Solidaridad          |               27 |
| Machilipatnam (Masulipatam)          |               27 |
+--------------------------------------+------------------+

Usando uma cláusula OVER


Como mencionado, a sintaxe permite um OVER cláusula a ser incluída em suas consultas. Basicamente, o OVER A cláusula permite especificar como particionar linhas de consulta em grupos para processamento pela função de janela.

Aqui está um exemplo:
SELECT 
    District,
    Name AS City,
    Population AS 'City Population',
    MAX(Population) OVER(PARTITION BY District) AS 'District Max'
FROM City
WHERE CountryCode = 'AUS'
ORDER BY `District Max` DESC;

Resultado:
+-----------------+---------------+-----------------+--------------+
| District        | City          | City Population | District Max |
+-----------------+---------------+-----------------+--------------+
| New South Wales | Sydney        |         3276207 |      3276207 |
| New South Wales | Wollongong    |          219761 |      3276207 |
| New South Wales | Newcastle     |          270324 |      3276207 |
| New South Wales | Central Coast |          227657 |      3276207 |
| Victoria        | Melbourne     |         2865329 |      2865329 |
| Victoria        | Geelong       |          125382 |      2865329 |
| Queensland      | Townsville    |          109914 |      1291117 |
| Queensland      | Brisbane      |         1291117 |      1291117 |
| Queensland      | Cairns        |           92273 |      1291117 |
| Queensland      | Gold Coast    |          311932 |      1291117 |
| West Australia  | Perth         |         1096829 |      1096829 |
| South Australia | Adelaide      |          978100 |       978100 |
| Capital Region  | Canberra      |          322723 |       322723 |
| Tasmania        | Hobart        |          126118 |       126118 |
+-----------------+---------------+-----------------+--------------+

Este exemplo particiona as linhas por District , fornecendo o valor máximo para cada partição (distrito). Isso permite que você veja dados mais granulares, como a população de cada cidade, juntamente com a população da maior cidade do mesmo distrito.