Database
 sql >> Baza danych >  >> RDS >> Database

SQL AVG() dla początkujących

W SQL AVG() function to funkcja agregująca, która zwraca średnią wszystkich wartości w danym wyrażeniu.

Może być również używany do zwracania średniej wszystkich odrębnych (unikalnych) wartości w wyrażeniu.

Wyrażenie musi być numeryczne (nie może być ciągiem znaków, ciągiem bitów ani datą i godziną).

Poniżej znajduje się kilka podstawowych przykładów pokazujących, jak to działa.

Przykładowa tabela

Załóżmy, że mamy następującą tabelę:

SELECT * FROM Products;

Wynik:

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

Przykład

Możemy użyć następującego zapytania, aby uzyskać średnią wszystkich cen.

SELECT AVG(ProductPrice)
FROM Products;

Wynik:

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

W takim przypadku informacje o cenie są przechowywane w ProductPrice kolumna, więc przekazujemy to jako argument do AVG() funkcja, która następnie oblicza średnią i zwraca wynik.

Korzystanie z aliasów kolumn

Zauważysz, że poprzednie wyniki nie zawierają nazwy kolumny. Należy się tego spodziewać, ponieważ AVG() funkcja nie zwraca żadnych kolumn. Możesz łatwo podać nazwę kolumny, przypisując alias.

SELECT AVG(ProductPrice) AS Average
FROM Products;

Wynik:

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

Przefiltrowane wyniki

AVG() funkcja działa na wierszach zwróconych przez zapytanie. Więc jeśli filtrujesz wyniki, wynik AVG() odzwierciedli to.

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

Wynik:

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

W tym przypadku 19.680000 to średnia cena wszystkich produktów oferowanych przez określonego dostawcę.

NULL Wartości

AVG() funkcja ignoruje każdy NULL wartości. W naszej przykładowej tabeli powyżej numer produktu 6 ma NULL w swojej ProductPrice kolumna, ale zostało to zignorowane w naszej AVG() przykład.

W zależności od systemu DBMS i ustawień możesz, ale nie musisz, zobaczyć ostrzeżenie, że NULL wartości zostały wyeliminowane w zestawie wyników.

Oto przykład tego, co możesz zobaczyć:

SELECT AVG(ProductPrice) AS Average
FROM Products;

Wynik:

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

Wszystko to mówi nam, że kolumna zawierała co najmniej jeden NULL wartość i że została zignorowana podczas obliczania wyników.

Dane daty/godziny

AVG() funkcja nie akceptuje wyrażeń daty/czasu.

Załóżmy, że mamy następującą tabelę:

SELECT PetName, DOB 
FROM Pets;

Wynik:

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

Jeśli spróbujemy użyć AVG() na DOB kolumna, otrzymamy błąd.

SELECT AVG(DOB) AS Average
FROM Pets;

Wynik:

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

Dane postaci

AVG() funkcja nie akceptuje również wyrażeń w postaci ciągów znaków.

Oto, co się stanie, jeśli spróbujemy użyć AVG() na ProductName kolumna naszych Products tabela (która używa typu danych varchar):

SELECT AVG(ProductName) AS Average
FROM Products;

Wynik:

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

DISTINCT Słowo kluczowe

Możesz użyć DISTINCT słowo kluczowe z AVG() aby obliczyć tylko różne wartości. Oznacza to, że jeśli istnieją jakiekolwiek zduplikowane wartości, są one traktowane jako jedna wartość.

Przykład:

SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage
FROM Products;

Wynik:

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

Widzimy, że ten wynik jest wyższy niż wynik, który otrzymaliśmy bez DISTINCT słowo kluczowe.

Podsumowując, otrzymaliśmy 52.457142 bez DISTINCT słowo kluczowe i 56.868333 z DISTINCT słowo kluczowe.

Dzieje się tak, ponieważ istnieją dwa produkty, które mają tę samą cenę (dla leworęcznych śrubokrętów i praworęcznych śrubokręt wyceniony jest na 25,99). Dlatego AVG() funkcja, gdy jest używana z DISTINCT słowo kluczowe, traktuje obie te wartości jako jedną i odpowiednio oblicza wynik.

Funkcje okien

W zależności od DBMS, możesz użyć OVER klauzula z Twoją AVG() funkcji, aby utworzyć funkcję okna.

Funkcja okna wykonuje operację podobną do agregacji na zestawie wierszy zapytania. Daje wynik dla każdego wiersza zapytania. Jest to przeciwieństwo operacji agregującej, która grupuje wiersze zapytań w jeden wiersz wyników.

Oto przykład demonstrujący tę koncepcję.

Widzieliśmy już Products stół. Nasza baza danych zawiera również Customers tabeli i zawiera następujące dane:

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

Możemy pobrać dane z tych tabel i przedstawić je jako jeden zestaw wyników za pomocą złączenia.

Możemy również użyć AVG() funkcja z OVER klauzula, aby zastosować funkcję okna do danych.

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

Wynik:

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

W tym przypadku użyliśmy OVER klauzula z naszą AVG() funkcja podziału wyniku według nazwy dostawcy.

Dzięki temu byliśmy w stanie zwrócić informacje o cenie dla każdego produktu, a także średnią cenę wszystkich produktów od danego dostawcy. Średnia cena zmienia się wraz ze zmianą dostawcy (chyba że wielu dostawców ma tę samą średnią), ale pozostaje taka sama dla wszystkich produktów od tego samego dostawcy.

Ta koncepcja może być również zastosowana do innych funkcji agregujących w SQL, takich jak SUM() , MIN() , MAX() i COUNT() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chmura Alibaba

  2. Unikanie sortowania za pomocą łączenia łączenia przez scalanie

  3. Modele baz danych dla handlu elektronicznego Część 1:Biuletyn

  4. Podobieństwa i różnice między funkcjami RANK, DENSE_RANK i ROW_NUMBER

  5. Hekaton z niespodzianką:In-memory TVP – część 2