sql >> Base de Datos >  >> RDS >> Database

SQL MAX() para principiantes

En SQL, MAX() función es una función agregada que devuelve el valor máximo en una expresión dada.

A continuación se muestran algunos ejemplos básicos para demostrar cómo funciona.

Tabla de muestra

Supongamos que tenemos la siguiente tabla:

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.        |
+-------------+------------+---------------------------------+----------------+-----------------------------------------+

Ejemplo

Podemos usar la siguiente consulta para obtener el precio máximo de esa tabla.

SELECT MAX(ProductPrice)
FROM Products;

Resultado:

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

En este caso, la información de precios se almacena en el ProductPrice columna, y así lo pasamos como argumento a MAX() función, que luego calcula y devuelve el resultado.

Uso de alias de columna

Notará que los resultados anteriores no incluyen un nombre de columna. Algunos DBMS pueden usar algo como MAX(ProductPrice) como el nombre de la columna. Esto es de esperar, porque MAX() La función no devuelve ninguna columna. Puede proporcionar fácilmente un nombre de columna asignando un alias.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultado:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+

Resultados filtrados

El MAX() opera en las filas devueltas por la consulta. Entonces, si filtra los resultados, el resultado de MAX() reflejará eso.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products
WHERE VendorId = 1001;

Resultado:

+----------------+
| MaximumPrice   |
|----------------|
| 25.99          |
+----------------+

En este caso, 25,99 es el precio máximo de todos los productos ofrecidos por el proveedor especificado.

NULL Valores

El MAX() la función ignora cualquier NULL valores. En nuestra tabla de ejemplo anterior, número de producto 6 tiene NULL en su ProductPrice columna, pero eso fue ignorado en nuestro MAX() ejemplo.

Dependiendo de su DBMS y su configuración, es posible que vea o no una advertencia de que NULL los valores fueron eliminados en el conjunto de resultados.

Este es un ejemplo de lo que podrías ver:

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultado:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Todo esto nos dice que la columna contenía al menos un NULL valor, y que se ignoró al calcular los resultados.

Datos de fecha/hora

Puedes usar MAX() en valores de fecha/hora.

Supongamos que tenemos la siguiente tabla:

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 la fecha máxima de nacimiento (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Resultado:

+------------+
| MaxDOB     |
|------------|
| 2020-11-28 |
+------------+

Esta sería la fecha de nacimiento de la mascota más joven. Como se mencionó, ignora cualquier NULL valores.

Datos del personaje

Cuando se usa con columnas de datos de caracteres, MAX() encuentra el valor más alto en la secuencia de clasificación.

Ejemplo:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Resultado:

+----------------------+
| MaximumProductName   |
|----------------------|
| Straw Dog Box        |
+----------------------+

El DISTINCT Palabra clave

Su DBMS puede permitir el DISTINCT palabra clave que se usará con MAX() función. Si es así, probablemente sea para cumplir con el estándar ISO SQL.

Por lo tanto, es posible que pueda hacer esto:

SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Resultado:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+

Pero no tendrá ningún impacto en los resultados.

El DISTINCT La palabra clave puede ser muy útil cuando se usa con otros contextos (por ejemplo, con COUNT() función), pero no tiene significado cuando se usa con MAX() . El DISTINCT palabra clave elimina los duplicados, pero en el caso de MAX() no hará ninguna diferencia porque MAX() devuelve el mismo resultado independientemente de cuántas filas compartan el mismo valor máximo.

Funciones de ventana

Dependiendo de su DBMS, es posible que pueda usar un OVER cláusula con su MAX() para crear una función de ventana.

Una función de ventana realiza una operación similar a un agregado en un conjunto de filas de consulta. Produce un resultado para cada fila de consulta. Esto contrasta con una operación agregada, que agrupa las filas de consulta en una sola fila de resultados.

Aquí hay un ejemplo para demostrar el concepto.

Ya hemos visto los Products mesa. Nuestra base de datos también tiene un Customers tabla, y contiene los siguientes datos:

+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
| 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 datos de estas tablas y presentarlos como un conjunto de resultados usando una unión.

También podemos usar el MAX() función con OVER cláusula para aplicar una función de ventana a los datos.

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                           |
+---------------+---------------------------------+----------------+---------------------------------+

En este caso usamos el OVER cláusula con nuestro MAX() función para particionar el resultado por nombre de proveedor.

Al hacer esto, pudimos devolver la información del precio de cada producto, así como el precio máximo de todos los productos de ese proveedor determinado. Este precio máximo cambia a medida que cambia el proveedor (a menos que varios proveedores tengan el mismo precio máximo), pero sigue siendo el mismo para todos los productos del mismo proveedor.

Este concepto también se puede aplicar a otras funciones agregadas en SQL, como SUM() , MIN() , AVG() y COUNT() .