Database
 sql >> Datenbank >  >> RDS >> Database

SQL MAX() für Anfänger

In SQL das MAX() Funktion ist eine Aggregatfunktion, die den Maximalwert in einem gegebenen Ausdruck zurückgibt.

Nachfolgend finden Sie einige grundlegende Beispiele, um zu demonstrieren, wie es funktioniert.

Beispieltabelle

Angenommen, wir haben die folgende Tabelle:

SELECT * FROM Products;

Ergebnis:

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

Beispiel

Wir können die folgende Abfrage verwenden, um den Höchstpreis aus dieser Tabelle zu erhalten.

SELECT MAX(ProductPrice)
FROM Products;

Ergebnis:

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

In diesem Fall werden Preisinformationen im ProductPrice gespeichert Spalte, und wir übergeben das als Argument an MAX() Funktion, die dann das Ergebnis berechnet und zurückgibt.

Spaltenaliase verwenden

Sie werden feststellen, dass die vorherigen Ergebnisse keinen Spaltennamen enthalten. Einige DBMSs verwenden möglicherweise etwas wie MAX(ProductPrice) als Spaltenname. Dies ist zu erwarten, da MAX() Funktion gibt keine Spalten zurück. Sie können ganz einfach einen Spaltennamen angeben, indem Sie einen Alias ​​zuweisen.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Ergebnis:

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

Gefilterte Ergebnisse

Der MAX() Die Funktion arbeitet mit den von der Abfrage zurückgegebenen Zeilen. Wenn Sie also die Ergebnisse filtern, das Ergebnis von MAX() wird das widerspiegeln.

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

Ergebnis:

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

In diesem Fall ist 25,99 der Höchstpreis aller vom angegebenen Anbieter angebotenen Produkte.

NULL Werte

Der MAX() Funktion ignoriert jeden NULL Werte. In unserer Beispieltabelle oben, Produktnummer 6 hat NULL in seinem ProductPrice Spalte, aber das wurde in unserem MAX() ignoriert Beispiel.

Abhängig von Ihrem DBMS und Ihren Einstellungen sehen Sie möglicherweise eine Warnung, dass NULL Werte wurden in der Ergebnismenge eliminiert.

Hier ist ein Beispiel dafür, was Sie sehen könnten:

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Ergebnis:

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

All dies sagt uns, dass die Spalte mindestens einen NULL enthielt Wert, und dass er bei der Berechnung der Ergebnisse ignoriert wurde.

Datums-/Uhrzeitdaten

Sie können MAX() verwenden auf Datums-/Uhrzeitwerten.

Angenommen, wir haben die folgende Tabelle:

SELECT PetName, DOB 
FROM Pets;

Ergebnis:

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

Wir können MAX() verwenden um das höchste Geburtsdatum zu finden (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Ergebnis:

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

Dies wäre das Geburtsdatum des jüngsten Haustieres. Wie bereits erwähnt, ignoriert es alle NULL Werte.

Charakterdaten

Bei Verwendung mit Zeichendatenspalten MAX() findet den höchsten Wert in der Sortierfolge.

Beispiel:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Ergebnis:

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

Der DISTINCT Schlüsselwort

Ihr DBMS erlaubt möglicherweise den DISTINCT Schlüsselwort, das mit MAX() verwendet werden soll Funktion. Wenn ja, geschieht dies wahrscheinlich, um dem ISO-SQL-Standard zu entsprechen.

Daher können Sie Folgendes tun:

SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Ergebnis:

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

Aber es wird keinen Einfluss auf die Ergebnisse haben.

Der DISTINCT Schlüsselwort kann sehr nützlich sein, wenn es mit anderen Kontexten verwendet wird (z. B. mit dem COUNT() Funktion), aber es hat keine Bedeutung, wenn es mit MAX() verwendet wird . Der DISTINCT Schlüsselwort entfernt Duplikate, aber im Fall von MAX() es macht keinen Unterschied, weil MAX() gibt dasselbe Ergebnis zurück, unabhängig davon, wie viele Zeilen denselben Maximalwert haben.

Fensterfunktionen

Abhängig von Ihrem DBMS können Sie möglicherweise einen OVER verwenden -Klausel mit Ihrem MAX() Funktion zum Erstellen einer Fensterfunktion.

Eine Fensterfunktion führt eine aggregierte Operation für eine Reihe von Abfragezeilen aus. Es erzeugt ein Ergebnis für jede Abfragezeile. Dies steht im Gegensatz zu einer Aggregatoperation, die Abfragezeilen in einer einzigen Ergebniszeile gruppiert.

Hier ist ein Beispiel, um das Konzept zu demonstrieren.

Wir haben uns bereits die Products angesehen Tisch. Unsere Datenbank hat auch einen Customers Tabelle, und sie enthält die folgenden Daten:

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

Wir können Daten aus diesen Tabellen abrufen und sie mithilfe eines Joins als eine Ergebnismenge darstellen.

Wir können auch den MAX() verwenden Funktion mit dem OVER -Klausel, um eine Fensterfunktion auf die Daten anzuwenden.

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

Ergebnis:

+---------------+---------------------------------+----------------+---------------------------------+
| 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 diesem Fall haben wir den OVER verwendet -Klausel mit unserem MAX() -Funktion, um das Ergebnis nach Herstellernamen zu partitionieren.

Auf diese Weise konnten wir Preisinformationen für jedes Produkt sowie den Höchstpreis für alle Produkte dieses bestimmten Anbieters zurückgeben. Dieser Höchstpreis ändert sich, wenn sich der Anbieter ändert (es sei denn, mehrere Anbieter haben denselben Höchstpreis), bleibt jedoch für alle Produkte desselben Anbieters gleich.

Dieses Konzept kann auch auf andere Aggregatfunktionen in SQL angewendet werden, wie z. B. SUM() , MIN() , AVG() , und COUNT() .