sql >> Database >  >> RDS >> Database

SQL MAX() voor beginners

In SQL is de MAX() functie is een aggregatiefunctie die de maximale waarde in een bepaalde uitdrukking retourneert.

Hieronder staan ​​enkele basisvoorbeelden om te laten zien hoe het werkt.

Voorbeeldtabel

Stel dat we de volgende tabel hebben:

SELECT * FROM Products;

Resultaat:

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

Voorbeeld

We kunnen de volgende zoekopdracht gebruiken om de maximale prijs uit die tabel te halen.

SELECT MAX(ProductPrice)
FROM Products;

Resultaat:

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

In dit geval wordt prijsinformatie opgeslagen in de ProductPrice kolom, en dus geven we dat door als argument aan de MAX() functie, die vervolgens het resultaat berekent en retourneert.

Kolomaliassen gebruiken

U zult merken dat de vorige resultaten geen kolomnaam bevatten. Sommige DBMS'en gebruiken mogelijk iets als MAX(ProductPrice) als de kolomnaam. Dit is te verwachten, omdat de MAX() functie retourneert geen kolommen. U kunt eenvoudig een kolomnaam opgeven door een alias toe te wijzen.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultaat:

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

Gefilterde resultaten

De MAX() functie werkt op de rijen die door de query worden geretourneerd. Dus als u de resultaten filtert, wordt het resultaat van MAX() zal dat weerspiegelen.

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

Resultaat:

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

In dit geval is 25,99 de maximale prijs van alle producten die door de opgegeven leverancier worden aangeboden.

NULL Waarden

De MAX() functie negeert elke NULL waarden. In onze voorbeeldtabel hierboven, productnummer 6 heeft NULL in zijn ProductPrice kolom, maar dat werd genegeerd in onze MAX() voorbeeld.

Afhankelijk van uw DBMS en uw instellingen, ziet u mogelijk wel of niet een waarschuwing dat NULL waarden zijn geëlimineerd in de resultatenset.

Hier is een voorbeeld van wat je zou kunnen zien:

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultaat:

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

Dit alles vertelt ons dat de kolom ten minste één NULL . bevatte waarde, en dat deze werd genegeerd bij het berekenen van de resultaten.

Datum-/tijdgegevens

U kunt MAX() . gebruiken op datum/tijd-waarden.

Stel dat we de volgende tabel hebben:

SELECT PetName, DOB 
FROM Pets;

Resultaat:

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

We kunnen MAX() . gebruiken om de maximale geboortedatum te vinden (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Resultaat:

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

Dit zou de geboortedatum van het jongste huisdier zijn. Zoals vermeld, negeert het elke NULL waarden.

Karaktergegevens

Bij gebruik met karaktergegevenskolommen, MAX() vindt de waarde die het hoogst is in de sorteervolgorde.

Voorbeeld:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Resultaat:

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

De DISTINCT Zoekwoord

Uw DBMS kan de DISTINCT . toestaan trefwoord dat moet worden gebruikt met de MAX() functie. Zo ja, dan is dit waarschijnlijk om te voldoen aan de ISO SQL-standaard.

Daarom kunt u dit mogelijk doen:

SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Resultaat:

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

Maar het heeft geen invloed op de resultaten.

De DISTINCT trefwoord kan erg handig zijn bij gebruik met andere contexten (bijv. met de COUNT() functie), maar het heeft geen betekenis bij gebruik met MAX() . De DISTINCT trefwoord verwijdert duplicaten, maar in het geval van MAX() het maakt geen verschil omdat MAX() geeft hetzelfde resultaat, ongeacht hoeveel rijen dezelfde maximale waarde delen.

Vensterfuncties

Afhankelijk van uw DBMS kunt u mogelijk een OVER . gebruiken clausule met uw MAX() functie om een ​​vensterfunctie te creëren.

Een vensterfunctie voert een aggregatie-achtige bewerking uit op een set queryrijen. Het produceert een resultaat voor elke queryrij. Dit in tegenstelling tot een aggregatiebewerking, waarbij queryrijen worden gegroepeerd in een enkele resultaatrij.

Hier is een voorbeeld om het concept te demonstreren.

We hebben de Products al gezien tafel. Onze database heeft ook een Customers tabel, en het bevat de volgende gegevens:

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

We kunnen gegevens uit deze tabellen halen en ze presenteren als één resultaatset door een join te gebruiken.

We kunnen ook de MAX() . gebruiken functie met de OVER clausule om een ​​vensterfunctie op de gegevens toe te passen.

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

Resultaat:

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

In dit geval gebruikten we de OVER clausule met onze MAX() functie om het resultaat te partitioneren op naam van de leverancier.

Door dit te doen, konden we prijsinformatie voor elk product retourneren, evenals de maximale prijs voor alle producten van die bepaalde leverancier. Deze maximumprijs verandert als de leverancier verandert (tenzij meerdere leveranciers dezelfde maximumprijs hebben), maar blijft hetzelfde voor alle producten van dezelfde leverancier.

Dit concept kan ook worden toegepast op andere statistische functies in SQL, zoals SUM() , MIN() , AVG() , en COUNT() .


  1. Kruisende tijdspannes afvlakken

  2. Een array doorgeven aan een query met behulp van een WHERE-component

  3. Database hoge beschikbaarheid voor Camunda BPM met MySQL of MariaDB Galera Cluster

  4. Verbind SQL Server met SugarCRM