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

SQL AVG() für Anfänger

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 unserem AVG() 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() , und COUNT() .