In SQL der AVG()
Funktion ist eine Aggregatfunktion, die den Durchschnitt aller Werte in einem bestimmten Ausdruck zurückgibt.
Es kann auch verwendet werden, um den Durchschnitt aller unterschiedlichen (eindeutigen) Werte in einem Ausdruck zurückzugeben.
Der Ausdruck muss numerisch sein (er darf keine Zeichenkette, Bitkette oder Datumszeit sein).
Nachfolgend finden Sie einige grundlegende Beispiele, um zu demonstrieren, wie es funktioniert.
Beispieltabelle
Angenommen, wir haben die folgende Tabelle:
SELECT * FROM Products;
Ergebnis:
+-------------+------------+-------------- --------------+----------------+------------- -----------------------+| Produkt-ID | Anbieter-ID | Produktname | Produktpreis | Produktbeschreibung ||-------------+------------+-------------------- -------------+-----------+------------------- ----------------------|| 1 | 1001 | Linkshänder-Schraubendreher | 25,99 | Lila. Inklusive Tragebox für Linkshänder. || 2 | 1001 | Langes Gewicht (blau) | 14,75 | Inklusive langer Wartezeit. || 3 | 1001 | Langes Gewicht (grün) | 11,99 | Ungefähr 30 Minuten Wartezeit. || 4 | 1002 | Vorschlaghammer | 33,49 | Holzgriff. Kostenlose Weingläser. || 5 | 1003 | Kettensäge | 245,00 | Orange. Inklusive Ersatzfinger. || 6 | 1003 | Hundebox aus Stroh | NULL | Gebunden mit Reben. Sehr kaubar. || 7 | 1004 | Bodenlose Kaffeetassen (4 Stück) | 9,99 | Braune Keramik mit massivem Griff. || 8 | 1001 | Rechtshänder-Schraubendreher | 25,99 | Blau. Inklusive Tragebox für Rechtshänder. |+-------------+------------+--------------------- -------------+-----------+-------------------- ---------------------+
Beispiel
Wir können die folgende Abfrage verwenden, um den Durchschnitt aller Preise zu erhalten.
SELECT AVG(ProductPrice)
FROM Products;
Ergebnis:
+--------------------+| (Kein Spaltenname) ||--------------------|| 52.457142 |+--------------------+
In diesem Fall werden Preisinformationen im ProductPrice
gespeichert Spalte, und wir übergeben das als Argument an AVG()
Funktion, die dann den Durchschnitt berechnet und das Ergebnis zurückgibt.
Spaltenaliase verwenden
Sie werden feststellen, dass die vorherigen Ergebnisse keinen Spaltennamen enthalten. Dies ist zu erwarten, da AVG()
Funktion gibt keine Spalten zurück. Sie können ganz einfach einen Spaltennamen angeben, indem Sie einen Alias zuweisen.
SELECT AVG(ProductPrice) AS Average
FROM Products;
Ergebnis:
+-----------+| Durchschnitt ||-----------|| 52.457142 |+-----------+
Gefilterte Ergebnisse
Der AVG()
Die Funktion arbeitet mit den von der Abfrage zurückgegebenen Zeilen. Wenn Sie also die Ergebnisse filtern, wird das Ergebnis von AVG()
angezeigt wird das widerspiegeln.
SELECT AVG(ProductPrice) AS Average
FROM Products
WHERE VendorId = 1001;
Ergebnis:
+-----------+| Durchschnitt ||-----------|| 19,680000 |+-----------+
In diesem Fall ist 19,680000 der Durchschnittspreis aller vom angegebenen Anbieter angebotenen Produkte.
NULL
Werte
Der AVG()
Funktion ignoriert jeden NULL
Werte. In unserer Beispieltabelle oben, Produktnummer 6
hat NULL
in seinem ProductPrice
Spalte, aber das wurde in unserem AVG()
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 AVG(ProductPrice) AS Average
FROM Products;
Ergebnis:
+-----------+| Durchschnitt ||-----------|| 52.457142 |+-----------+Warnung:Nullwert wird durch eine Aggregat- oder andere SET-Operation eliminiert.
All dies sagt uns, dass die Spalte mindestens einen NULL
enthielt Wert, und dass er bei der Berechnung der Ergebnisse ignoriert wurde.
Datums-/Uhrzeitdaten
Der AVG()
Funktion akzeptiert keine Datums-/Zeitausdrücke.
Angenommen, wir haben die folgende Tabelle:
SELECT PetName, DOB
FROM Pets;
Ergebnis:
+-----------+------------+| Haustiername | Geburtsdatum ||-----------+------------|| Flauschig | 2020-11-20 || Holen | 2019-08-16 || Kratzer | 01.10.2018 || Wackeln | 2020-03-15 || Twittern | 2020-11-28 || Flauschig | 2020-09-17 || Rinde | NULL || Miau | NULL |+-----------+------------+
Wenn wir versuchen, AVG()
zu verwenden auf dem DOB
Spalte erhalten wir einen Fehler.
SELECT AVG(DOB) AS Average
FROM Pets;
Ergebnis:
Msg 8117, Level 16, State 1, Line 1Operandendatentyp date ist ungültig für avg operator.
Charakterdaten
Der AVG()
Die Funktion akzeptiert auch keine Zeichenkettenausdrücke.
Folgendes passiert, wenn wir versuchen, AVG()
zu verwenden auf ProductName
Spalte unserer Products
Tabelle (die den Datentyp varchar verwendet):
SELECT AVG(ProductName) AS Average
FROM Products;
Ergebnis:
Msg 8117, Level 16, State 1, Line 1Operand data type varchar is invalid for avg operator.
Der DISTINCT
Schlüsselwort
Sie können den DISTINCT
verwenden Stichwort mit AVG()
nur unterschiedliche Werte zu berechnen. Das heißt, wenn doppelte Werte vorhanden sind, werden sie als ein Wert behandelt.
Beispiel:
SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage
FROM Products;
Ergebnis:
+-------------------+| DistinctAverage ||-------------------|| 56.868333 |+-------------------------------+
Wir können sehen, dass dieses Ergebnis höher ist als das Ergebnis, das wir ohne DISTINCT
erhalten haben Schlüsselwort.
Um es noch einmal zusammenzufassen, wir haben 52.457142 ohne den DISTINCT
erhalten Schlüsselwort und 56.868333 mit dem DISTINCT
Schlüsselwort.
Dies liegt daran, dass es zwei Artikel gibt, die den gleichen Preis haben (der Schraubendreher für Linkshänder und der Schraubendreher für Rechtshänder kosten beide 25,99). Daher der AVG()
Funktion, wenn sie mit DISTINCT
verwendet wird Schlüsselwort, behandelt beide Werte als einen und berechnet das Ergebnis entsprechend.
Fensterfunktionen
Abhängig von Ihrem DBMS können Sie möglicherweise einen OVER
verwenden -Klausel mit Ihrem AVG()
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:
+--------------+---------------------+-------- -----------+------------+----+------- -----+-----------+----------------+| Kunden-ID | Kundenname | Postanschrift | Stadt | StaatProvinz | Postleitzahl | Land | Telefon ||--------------+----------------------+--------- ----------------------+-----------------+-------- ----+-----------+----------------+| 1001 | Palm Speisekammer | 20 Esplanade | Stadtville | QLD | 2040 | AUS | (308) 555-0100 || 1002 | Großer Mohn | 12 Hauptstraße | Kolumbus | OH | 43333 | USA | (310) 657-0134 || 1003 | Verrückte Viecher | 10 Endlosschleifen | Steinhaufen | QLD | 4870 | AUS | (418) 555-0143 || 1004 | Hoppla Medien | 4 Strandweg | Perth | WA | 1234 | AUS | (405) 443-5987 || 1005 | Seltsame Namen Inc. | 789 George Street | Sydney | NSW | 2000 | Euro | (318) 777-0177 || 1006 | Hi-Five Solutionisten | Hauptstraße 5 | Hochland | HALLO | 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 AVG()
verwenden Funktion mit dem OVER
-Klausel, um eine Fensterfunktion auf die Daten anzuwenden.
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
AVG(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Average For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Average For This Vendor";
Ergebnis:
+---------------+------------------------------ ---+-----------+---------------------------+| Anbietername | Produktname | Produktpreis | Durchschnitt für diesen Anbieter ||----------+-------------------------------- -----+----------------+--------------------------- || Katty Kätzchen | Bodenlose Kaffeetassen (4 Stück) | 9,99 | 9,990000 || Mars-Vorräte | Langes Gewicht (grün) | 11,99 | 19.680000 || Mars-Vorräte | Langes Gewicht (blau) | 14.75 | 19.680000 || Mars-Vorräte | Rechtshänder-Schraubendreher | 25,99 | 19.680000 || Mars-Vorräte | Linkshänder-Schraubendreher | 25,99 | 19.680000 || Pedalmedaillen | Hundebox aus Stroh | NULL | 245,000000 || Pedalmedaillen | Kettensäge | 245,00 | 245,000000 || Randy Dachdecker | Vorschlaghammer | 33.49 | 33.490000 |+---------------+------------------------------- --+-----------+--------------------------+In diesem Fall haben wir den
OVER
verwendet -Klausel mit unseremAVG()
Funktion, um das Ergebnis nach Herstellernamen zu partitionieren.Auf diese Weise konnten wir Preisinformationen für jedes Produkt sowie den Durchschnittspreis aller Produkte von diesem bestimmten Anbieter zurückgeben. Der Durchschnittspreis ändert sich, wenn sich der Anbieter ändert (es sei denn, mehrere Anbieter haben denselben Durchschnitt), bleibt aber für alle Produkte desselben Anbieters gleich.
Dieses Konzept lässt sich auch auf andere Aggregatfunktionen in SQL anwenden, wie z. B.
SUM()
,MIN()
,MAX()
, undCOUNT()
.