sql >> Databasteknik >  >> RDS >> Database

SQL MAX() för nybörjare

I SQL, MAX() funktion är en aggregerad funktion som returnerar det maximala värdet i ett givet uttryck.

Nedan följer några grundläggande exempel för att visa hur det fungerar.

Exempeltabell

Anta att vi har följande tabell:

SELECT * FROM Products;

Resultat:

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

Exempel

Vi kan använda följande fråga för att få maxpriset från den tabellen.

SELECT MAX(ProductPrice)
FROM Products;

Resultat:

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

I det här fallet lagras prisinformation i ProductPrice kolumnen, och så skickar vi det som ett argument till MAX() funktion, som sedan beräknar och returnerar resultatet.

Använda kolumnalias

Du kommer att märka att de tidigare resultaten inte innehåller ett kolumnnamn. Vissa DBMS kan använda något som MAX(ProductPrice) som kolumnnamn. Detta är att förvänta, eftersom MAX() funktion returnerar inga kolumner. Du kan enkelt ange ett kolumnnamn genom att tilldela ett alias.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultat:

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

Filtrerade resultat

MAX() funktionen fungerar på raderna som returneras av frågan. Så om du filtrerar resultaten blir resultatet av MAX() kommer att återspegla det.

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

Resultat:

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

I det här fallet är 25,99 maxpriset av alla produkter som erbjuds av den angivna leverantören.

NULL Värden

MAX() funktionen ignorerar någon NULL värden. I vår exempeltabell ovan, produktnummer 6 har NULL i dess ProductPrice kolumn, men det ignorerades i vår MAX() exempel.

Beroende på ditt DBMS och dina inställningar kanske du ser en varning som NULL värden eliminerades i resultatuppsättningen.

Här är ett exempel på vad du kan se:

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultat:

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

Allt detta säger oss är att kolumnen innehöll minst en NULL värde, och att det ignorerades vid beräkning av resultaten.

Datum/tiddata

Du kan använda MAX() på datum/tidsvärden.

Anta att vi har följande tabell:

SELECT PetName, DOB 
FROM Pets;

Resultat:

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

Vi kan använda MAX() för att hitta det maximala födelsedatumet (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Resultat:

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

Detta skulle vara födelsedatumet för det yngsta husdjuret. Som nämnts ignorerar den alla NULL värden.

Teckendata

När den används med teckendatakolumner, MAX() hittar det värde som är högst i sorteringssekvensen.

Exempel:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Resultat:

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

DISTINCT Nyckelord

Din DBMS kan tillåta DISTINCT nyckelord som ska användas med MAX() fungera. Om så är fallet är detta förmodligen för att uppfylla ISO SQL-standarden.

Därför kanske du kan göra detta:

SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Resultat:

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

Men det kommer inte att påverka resultaten.

DISTINCT Nyckelordet kan vara mycket användbart när det används med andra sammanhang (t.ex. med COUNT() funktion), men den har ingen betydelse när den används med MAX() . DISTINCT nyckelordet tar bort dubbletter, men i fallet med MAX() det kommer inte att göra någon skillnad eftersom MAX() returnerar samma resultat oavsett hur många rader som delar samma maxvärde.

Fönsterfunktioner

Beroende på ditt DBMS kan du kanske använda en OVER sats med din MAX() funktion för att skapa en fönsterfunktion.

En fönsterfunktion utför en aggregatliknande operation på en uppsättning frågerader. Det ger ett resultat för varje frågerad. Detta till skillnad från en aggregerad operation, som grupperar frågerader i en enda resultatrad.

Här är ett exempel för att demonstrera konceptet.

Vi har redan sett Products tabell. Vår databas har också en Customers tabell och den innehåller följande data:

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

Vi kan hämta data från dessa tabeller och presentera dem som en resultatuppsättning genom att använda en join.

Vi kan också använda MAX() funktion med OVER sats för att tillämpa en fönsterfunktion på data.

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";

Resultat:

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

I det här fallet använde vi OVER sats med vår MAX() funktion för att partitionera resultatet efter leverantörsnamn.

Genom att göra detta kunde vi returnera prisinformation för varje produkt, såväl som maxpriset för alla produkter från den givna leverantören. Detta maxpris ändras när leverantören ändras (såvida inte flera leverantörer råkar ha samma maxpris), men förblir detsamma för alla produkter från samma leverantör.

Det här konceptet kan även tillämpas på andra aggregerade funktioner i SQL, såsom SUM() , MIN() , AVG() , och COUNT() .


  1. Alla användbara 11g dynamiska prestandavyer

  2. SQLServer vs StateServer för ASP.NET Session State Performance

  3. Använda ODBC med Salesforce och Okta Single Sign On (SSO)

  4. count(*) och count(column_name), vad är skillnaden?