sql >> Database >  >> RDS >> Database

SQL AVG() voor beginners

In SQL is de AVG() functie is een aggregatiefunctie die het gemiddelde van alle waarden in een bepaalde uitdrukking retourneert.

Het kan ook worden gebruikt om het gemiddelde van alle afzonderlijke (unieke) waarden in een uitdrukking te retourneren.

De uitdrukking moet numeriek zijn (het mag geen tekenreeks, bitreeks of datetime zijn).

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.        |
| 8           | 1001       | Right handed screwdriver        | 25.99          | Blue. Includes right handed carry box.  |
+-------------+------------+---------------------------------+----------------+-----------------------------------------+

Voorbeeld

We kunnen de volgende zoekopdracht gebruiken om het gemiddelde van alle prijzen te krijgen.

SELECT AVG(ProductPrice)
FROM Products;

Resultaat:

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

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

Kolomaliassen gebruiken

U zult merken dat de vorige resultaten geen kolomnaam bevatten. Dit is te verwachten, omdat de AVG() functie retourneert geen kolommen. U kunt eenvoudig een kolomnaam opgeven door een alias toe te wijzen.

SELECT AVG(ProductPrice) AS Average
FROM Products;

Resultaat:

+-----------+
| Average   |
|-----------|
| 52.457142 |
+-----------+

Gefilterde resultaten

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

SELECT AVG(ProductPrice) AS Average
FROM Products
WHERE VendorId = 1001;

Resultaat:

+-----------+
| Average   |
|-----------|
| 19.680000 |
+-----------+

In dit geval is 19.680000 de gemiddelde prijs van alle producten die door de opgegeven leverancier worden aangeboden.

NULL Waarden

De AVG() functie negeert elke NULL waarden. In onze voorbeeldtabel hierboven, productnummer 6 heeft NULL in zijn ProductPrice kolom, maar dat werd genegeerd in onze AVG() 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 AVG(ProductPrice) AS Average
FROM Products;

Resultaat:

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

De AVG() functie accepteert geen uitdrukkingen voor datum/tijd.

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

Als we AVG() . proberen te gebruiken op de DOB kolom, krijgen we een foutmelding.

SELECT AVG(DOB) AS Average
FROM Pets;

Resultaat:

Msg 8117, Level 16, State 1, Line 1
Operand data type date is invalid for avg operator.

Karaktergegevens

De AVG() functie accepteert ook geen tekenreeksuitdrukkingen.

Dit is wat er gebeurt als we AVG() proberen te gebruiken op de ProductName kolom van onze Products tabel (die het gegevenstype varchar gebruikt):

SELECT AVG(ProductName) AS Average
FROM Products;

Resultaat:

Msg 8117, Level 16, State 1, Line 1
Operand data type varchar is invalid for avg operator.

De DISTINCT Zoekwoord

U kunt de DISTINCT . gebruiken zoekwoord met AVG() om alleen verschillende waarden te berekenen. Dat wil zeggen, als er dubbele waarden zijn, worden deze als één waarde behandeld.

Voorbeeld:

SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage
FROM Products;

Resultaat:

+-------------------+
| DistinctAverage   |
|-------------------|
| 56.868333         |
+-------------------+

We kunnen zien dat dit resultaat hoger is dan het resultaat dat we kregen zonder de DISTINCT zoekwoord.

Om samen te vatten, we hebben 52.457142 zonder de DISTINCT zoekwoord, en 56.868333 met de DISTINCT zoekwoord.

Dit komt omdat er twee items zijn die dezelfde prijs delen (de linkshandige schroevendraaier en de rechtshandige schroevendraaier kosten beide 25,99). Daarom is de AVG() functie, indien gebruikt met de DISTINCT trefwoord, behandelt beide waarden als één en berekent het resultaat dienovereenkomstig.

Vensterfuncties

Afhankelijk van uw DBMS kunt u mogelijk een OVER . gebruiken clausule met uw AVG() 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 AVG() . gebruiken functie met de OVER clausule om een ​​vensterfunctie op de gegevens toe te passen.

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

Resultaat:

+---------------+---------------------------------+----------------+---------------------------+
| VendorName    | ProductName                     | ProductPrice   | Average For This Vendor   |
|---------------+---------------------------------+----------------+---------------------------|
| Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99           | 9.990000                  |
| Mars Supplies | Long Weight (green)             | 11.99          | 19.680000                 |
| Mars Supplies | Long Weight (blue)              | 14.75          | 19.680000                 |
| Mars Supplies | Right handed screwdriver        | 25.99          | 19.680000                 |
| Mars Supplies | Left handed screwdriver         | 25.99          | 19.680000                 |
| Pedal Medals  | Straw Dog Box                   | NULL           | 245.000000                |
| Pedal Medals  | Chainsaw                        | 245.00         | 245.000000                |
| Randy Roofers | Sledge Hammer                   | 33.49          | 33.490000                 |
+---------------+---------------------------------+----------------+---------------------------+

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

Door dit te doen, konden we prijsinformatie voor elk product retourneren, evenals de gemiddelde prijs van alle producten van die bepaalde leverancier. De gemiddelde prijs verandert als de leverancier verandert (tenzij meerdere leveranciers hetzelfde gemiddelde 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() , MAX() , en COUNT() .


  1. Hoe voeg ik cascadebeperkingen toe?

  2. Hoe op te lossen dat de coderingsfout niet kan worden gewijzigd bij het invoegen van XML in SQL Server

  3. ORA-28001:Het wachtwoord is verlopen

  4. De Chamilo MariaDB-database implementeren voor hoge beschikbaarheid