V SQL, AVG()
funkce je agregační funkce, která vrací průměr všech hodnot v daném výrazu.
Lze jej také použít k vrácení průměru všech odlišných (jedinečných) hodnot ve výrazu.
Výraz musí být číselný (nesmí to být znakový řetězec, bitový řetězec nebo datum a čas).
Níže je uvedeno několik základních příkladů, které demonstrují, jak to funguje.
Ukázková tabulka
Předpokládejme, že máme následující tabulku:
SELECT * FROM Products;
Výsledek:
+-------------+------------+------------------- --------------+----------------+------------------ ------------------------+| ProductId | VendorId | Název produktu | Cena produktu | Popis produktu ||-------------+------------+-------------------- -------------+----------------+-------------------- -----------------------|| 1 | 1001 | Šroubovák pro levou ruku | 25,99 | Nachový. Včetně přepravního boxu pro levou ruku. || 2 | 1001 | Dlouhá hmotnost (modrá) | 14,75 | Zahrnuje dlouhé čekání. || 3 | 1001 | Dlouhá hmotnost (zelená) | 11,99 | Čekací doba cca 30 minut. || 4 | 1002 | Sáňkařské kladivo | 33,49 | Dřevěná rukojeť. Skleničky na víno zdarma. || 5 | 1003 | Motorová pila | 245,00 | Oranžový. Včetně náhradních prstů. || 6 | 1003 | Box pro psy ze slámy | NULL | Svázané vinnou révou. Velmi žvýkací. || 7 | 1004 | Hrnky na kávu bez dna (4 balení) | 9,99 | Hnědá keramika s pevnou rukojetí. || 8 | 1001 | Pravý šroubovák | 25,99 | Modrý. Obsahuje přepravní box pro pravou ruku. |+-------------+------------+---------------------- ------------+----------------+--------------------- ---------------------+
Příklad
K získání průměru všech cen můžeme použít následující dotaz.
SELECT AVG(ProductPrice)
FROM Products;
Výsledek:
+---------------------+| (Žádný název sloupce) ||--------------------|| 52,457142 |+---------------------+
V tomto případě jsou informace o ceně uloženy v ProductPrice
a tak to předáme jako argument do AVG()
funkce, která pak vypočítá průměr a vrátí výsledek.
Použití aliasů sloupců
Všimnete si, že předchozí výsledky neobsahují název sloupce. To se dá očekávat, protože AVG()
funkce nevrací žádné sloupce. Název sloupce můžete snadno zadat přiřazením aliasu.
SELECT AVG(ProductPrice) AS Average
FROM Products;
Výsledek:
+------------+| Průměr ||-----------|| 52,457142 |+-----------+
Filtrované výsledky
AVG()
funkce pracuje na řádcích vrácených dotazem. Pokud tedy filtrujete výsledky, výsledek AVG()
to bude odrážet.
SELECT AVG(ProductPrice) AS Average
FROM Products
WHERE VendorId = 1001;
Výsledek:
+------------+| Průměr ||-----------|| 19,680000 |+-----------+
V tomto případě je 19,680000 průměrná cena všech produktů nabízených uvedeným prodejcem.
NULL
Hodnoty
AVG()
funkce ignoruje všechny NULL
hodnoty. V naší vzorové tabulce výše číslo produktu 6
má NULL
v jeho ProductPrice
sloupec, ale to bylo v našem AVG()
ignorováno příklad.
V závislosti na vašem DBMS a vašem nastavení se může nebo nemusí zobrazit varování, že NULL
hodnoty byly ze sady výsledků vyloučeny.
Zde je příklad toho, co můžete vidět:
SELECT AVG(ProductPrice) AS Average
FROM Products;
Výsledek:
+------------+| Průměr ||-----------|| 52.457142 |+-----------+Upozornění:Hodnota Null je eliminována agregací nebo jinou operací SET.
To vše nám říká, že sloupec obsahoval alespoň jeden NULL
hodnotu a že byla při výpočtu výsledků ignorována.
Datum/čas
AVG()
funkce nepřijímá výrazy data/času.
Předpokládejme, že máme následující tabulku:
SELECT PetName, DOB
FROM Pets;
Výsledek:
+-----------+------------+| Jméno mazlíčka | DOB ||-----------+------------|| Načechraný | 2020-11-20 || Načíst | 2019-08-16 || Škrábnout | 2018-10-01 || Wag | 2020-03-15 || Tweet | 2020-11-28 || Načechraný | 2020-09-17 || Kůra | NULL || Mňau | NULL |+-----------+------------+
Pokud se pokusíme použít AVG()
na DOB
sloupec, zobrazí se chyba.
SELECT AVG(DOB) AS Average
FROM Pets;
Výsledek:
Zpráva 8117, Úroveň 16, Stav 1, Řádek 1 Datum datového typu operandu je pro operátora avg neplatné.
Údaje o postavách
AVG()
funkce také nepřijímá výrazy řetězce znaků.
Zde je to, co se stane, když se pokusíme použít AVG()
na ProductName
sloupec našich Products
tabulka (která používá datový typ varchar):
SELECT AVG(ProductName) AS Average
FROM Products;
Výsledek:
Zpráva 8117, úroveň 16, stav 1, řádek 1Operand datový typ varchar je pro operátor avg neplatný.
DISTINCT
Klíčové slovo
Můžete použít DISTINCT
klíčové slovo s AVG()
vypočítat pouze odlišné hodnoty. To znamená, že pokud existují nějaké duplicitní hodnoty, jsou považovány za jednu hodnotu.
Příklad:
SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage
FROM Products;
Výsledek:
+-------------------+| DistinctAverage ||-------------------|| 56,868333 |+--------------------+
Vidíme, že tento výsledek je vyšší než výsledek, který jsme získali bez DISTINCT
klíčové slovo.
Abychom to shrnuli, dostali jsme 52,457142 bez DISTINCT
klíčové slovo a 56.868333 s DISTINCT
klíčové slovo.
Je to proto, že existují dvě položky, které sdílejí stejnou cenu (levý šroubovák a šroubovák pro pravou ruku mají oba cenu 25,99). Proto AVG()
při použití s funkcí DISTINCT
klíčové slovo, považuje obě tyto hodnoty za jednu a podle toho vypočítá svůj výsledek.
Funkce okna
V závislosti na vašem DBMS možná budete moci použít OVER
klauzule s vaším AVG()
funkce pro vytvoření funkce okna.
Funkce okna provádí operaci podobnou agregaci na sadě řádků dotazu. Vytváří výsledek pro každý řádek dotazu. To je na rozdíl od agregované operace, která seskupuje řádky dotazu do jednoho řádku výsledku.
Zde je příklad pro demonstraci konceptu.
Již jsme viděli Products
stůl. Naše databáze má také Customers
tabulka a obsahuje následující údaje:
+--------------+----------------------+-------- -----------+------------+-----------------+------- -----+-----------+----------------+| Číslo zákazníka | Jméno zákazníka | PoštovníAdresa | Město | StateProvince | PSČ | Země | Telefon ||--------------+----------------------+---------- ----------+------------+-----------------+--------- ----+-----------+----------------+| 1001 | Palmová spíž | 20 Esplanáda | Townsville | QLD | 2040 | AUS | (308) 555-0100 || 1002 | Vysoký Mák | 12 Hlavní silnice | Kolumbus | OH | 43333 | USA | (310) 657-0134 || 1003 | Crazy Critters | 10 nekonečných smyček | Cairns | QLD | 4870 | AUS | (418) 555-0143 || 1004 | Jejda média | 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 | Vysočina | ahoj | 1254 | AUS | (415) 413-5182 |+--------------+----------------------+---- ---------------+------------+------------------+--- ---------+-----------+----------------+
Můžeme načíst data z těchto tabulek a prezentovat je jako jednu sadu výsledků pomocí spojení.
Můžeme také použít AVG()
funkce s OVER
klauzule k aplikaci funkce okna na data.
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";
Výsledek:
+---------------+------------------------------ ---+----------------+---------------------------+| Název dodavatele | Název produktu | Cena produktu | Průměr pro tohoto dodavatele ||---------------+---------------------------- -----+----------------+---------------------------- || Katty Koťátka | Hrnky na kávu bez dna (4 balení) | 9,99 | 9,990000 || Dodávky Mars | Dlouhá váha (zelená) | 11,99 | 19,680000 || Dodávky Mars | Dlouhá váha (modrá) | 14,75 | 19,680000 || Dodávky Mars | Šroubovák pro pravou ruku | 25,99 | 19,680000 || Dodávky Mars | Šroubovák pro levou ruku | 25,99 | 19,680000 || Medaile pedálů | Box pro slaměné psy | NULL | 245 000 000 || Medaile pedálů | Motorová pila | 245,00 | 245 000 000 || Randy Roofers | Sáňkařské kladivo | 33,49 | 33,490000 |+---------------+-------------------------------- --+----------------+---------------------------+V tomto případě jsme použili
OVER
klauzule s našímAVG()
funkce k rozdělení výsledku podle názvu dodavatele.Díky tomu jsme byli schopni vrátit informace o ceně pro každý produkt a také průměrnou cenu všech produktů od daného dodavatele. Průměrná cena se mění podle toho, jak se mění dodavatel (pokud náhodou nemá více dodavatelů stejný průměr), ale zůstává stejná pro všechny produkty od stejného dodavatele.
Tento koncept lze také aplikovat na další agregační funkce v SQL, jako je
SUM()
,MIN()
,MAX()
aCOUNT()
.