Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

SQL AVG() untuk Pemula

Dalam SQL, AVG() fungsi adalah fungsi agregat yang mengembalikan rata-rata semua nilai dalam ekspresi yang diberikan.

Ini juga dapat digunakan untuk mengembalikan rata-rata dari semua nilai (unik) yang berbeda dalam sebuah ekspresi.

Ekspresi harus numerik (tidak boleh berupa karakter string, bit string, atau datetime).

Berikut adalah beberapa contoh dasar untuk mendemonstrasikan cara kerjanya.

Tabel Contoh

Misalkan kita memiliki tabel berikut:

SELECT * FROM Products; 

Hasil:

+-------------+------------+------------------- --------------+----------------+------------------ -----------------------+| ID Produk | VendorId | Nama Produk | Harga Produk | Deskripsi Produk ||-------------+------------+-------------------- -------------+----------------+------------------- ----------------------|| 1 | 1001 | Obeng tangan kiri | 25,99 | Ungu. Termasuk kotak jinjing tangan kiri. || 2 | 1001 | Berat Panjang (biru) | 14,75 | Termasuk menunggu lama. || 3 | 1001 | Berat Panjang (hijau) | 11.99 | Perkiraan waktu tunggu 30 menit. || 4 | 1002 | palu godam | 33,49 | Pegangan kayu. Gelas anggur gratis. || 5 | 1003 | gergaji | 245.00 | Oranye. Termasuk jari cadangan. || 6 | 1003 | Kotak Anjing Jerami | NULL | Diikat dengan tanaman merambat. Sangat bisa dikunyah. || 7 | 1004 | Mug Kopi Tanpa Dasar (4 Bungkus) | 9,99 | Keramik coklat dengan pegangan kokoh. || 8 | 1001 | Obeng tangan kanan | 25,99 | Biru. Termasuk kotak jinjing tangan kanan. |+-------------+------------+--------------------- ------------+----------------+------------------- ---------------------+

Contoh

Kita dapat menggunakan kueri berikut untuk mendapatkan rata-rata dari semua harga.

SELECT AVG(ProductPrice)
FROM Products; 

Hasil:

+--------------------+| (Tanpa nama kolom)   ||--------------------|| 52.457142          |+--------------------+

Dalam hal ini, informasi harga disimpan di ProductPrice kolom, jadi kami meneruskannya sebagai argumen ke AVG() fungsi, yang kemudian menghitung rata-rata dan mengembalikan hasilnya.

Menggunakan Alias ​​Kolom

Anda akan melihat bahwa hasil sebelumnya tidak menyertakan nama kolom. Ini sudah diduga, karena AVG() fungsi tidak mengembalikan kolom apa pun. Anda dapat dengan mudah memberikan nama kolom dengan menetapkan alias.

SELECT AVG(ProductPrice) AS Average
FROM Products; 

Hasil:

+-----------+| Rata-rata   ||-----------|| 52.457142 |+-----------+

Hasil yang Difilter

AVG() fungsi beroperasi pada baris yang dikembalikan oleh kueri. Jadi jika Anda memfilter hasilnya, hasil AVG() akan mencerminkan hal itu.

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

Hasil:

+-----------+| Rata-rata   ||-----------|| 19.680000 |+-----------+

Dalam hal ini, 19.680000 adalah harga rata-rata dari semua produk yang ditawarkan oleh vendor tertentu.

NULL Nilai

AVG() fungsi mengabaikan NULL nilai-nilai. Dalam tabel contoh kami di atas, nomor produk 6 telah mendapat NULL dalam ProductPrice kolom, tapi itu diabaikan di AVG() . kami contoh.

Bergantung pada DBMS dan pengaturan Anda, Anda mungkin atau mungkin tidak melihat peringatan bahwa NULL nilai dieliminasi dalam kumpulan hasil.

Berikut ini contoh yang mungkin Anda lihat:

SELECT AVG(ProductPrice) AS Average
FROM Products; 

Hasil:

+-----------+| Rata-rata   ||-----------|| 52.457142 |+-----------+Peringatan:Nilai nol dihilangkan dengan operasi SET agregat atau lainnya.

Semua ini memberitahu kita bahwa kolom berisi setidaknya satu NULL nilai, dan diabaikan saat menghitung hasil.

Data Tanggal/Waktu

AVG() fungsi tidak menerima ekspresi tanggal/waktu.

Misalkan kita memiliki tabel berikut:

SELECT PetName, DOB 
FROM Pets; 

Hasil:

+-----------+------------+| Nama Hewan Peliharaan | DOB ||-----------+------------|| Halus | 2020-11-20 || Ambil | 16-08-2019 || Gores | 01-10-2018 || goyang | 15-03-2020 || Tweet | 28-11-2020 || Halus | 17-09-2020 || Kulit | NULL || meong | NULL |+------------+------------+

Jika kita mencoba menggunakan AVG() pada DOB kolom, kita akan mendapatkan kesalahan.

SELECT AVG(DOB) AS Average
FROM Pets; 

Hasil:

Msg 8117, Level 16, State 1, Line 1Operand tanggal tipe data tidak valid untuk operator rata-rata.

Data Karakter

AVG() fungsi juga tidak menerima ekspresi string karakter.

Inilah yang terjadi jika kita mencoba menggunakan AVG() pada ProductName kolom Products kami tabel (yang menggunakan tipe data varchar):

SELECT AVG(ProductName) AS Average
FROM Products; 

Hasil:

Msg 8117, Level 16, State 1, Line 1Operand tipe data varchar tidak valid untuk operator rata-rata.

Yang DISTINCT Kata kunci

Anda dapat menggunakan DISTINCT kata kunci dengan AVG() untuk menghitung hanya nilai yang berbeda. Artinya, jika ada nilai duplikat, mereka diperlakukan sebagai satu nilai.

Contoh:

SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage
FROM Products; 

Hasil:

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

Kita dapat melihat bahwa hasil ini lebih tinggi daripada hasil yang kita dapatkan tanpa DISTINCT kata kunci.

Untuk rekap, kami mendapat 52,457142 tanpa DISTINCT kata kunci, dan 56.868333 dengan DISTINCT kata kunci.

Ini karena ada dua item yang memiliki harga yang sama (obeng kiri dan obeng kanan sama-sama dihargai 25,99). Oleh karena itu, AVG() fungsi, bila digunakan dengan DISTINCT kata kunci, memperlakukan kedua nilai tersebut sebagai satu, dan menghitung hasilnya sesuai dengan itu.

Fungsi Jendela

Bergantung pada DBMS Anda, Anda mungkin dapat menggunakan OVER klausa dengan AVG() . Anda fungsi untuk membuat fungsi jendela.

Fungsi jendela melakukan operasi seperti agregat pada sekumpulan baris kueri. Ini menghasilkan hasil untuk setiap baris kueri. Ini berbeda dengan operasi agregat, yang mengelompokkan baris kueri ke dalam satu baris hasil.

Berikut adalah contoh untuk mendemonstrasikan konsep tersebut.

Kami telah melihat Products meja. Basis data kami juga memiliki Customers tabel, dan berisi data berikut:

+-------------+------------+-------- -----------+------------+-----------------+------- -----+-----------+----------------+| ID Pelanggan | Nama Pelanggan | Alamat Pos | Kota | NegaraProvinsi | Kode Pos | Negara | Telepon ||--------------+------------+--------- ----------+------------+-------+-------- ----+-----------+----------------+| 1001 | Pantry Kelapa | 20 Esplanade | Townsville | QLD | 2040 | Australia | (308) 555-0100 || 1002 | Poppy Tinggi | 12 Jalan Utama | Colombus | OH | 43333 | Amerika Serikat | (310) 657-0134 || 1003 | Makhluk Gila | 10 Loop Tak Terbatas | Cairns | QLD | 4870 | Australia | (418) 555-0143 || 1004 | Ups Media | 4 Drive Tepi Pantai | Perth | WA | 1234 | Australia | (405) 443-5987 || 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 || 1006 | Hi-Five Solutionist | 5 Jalan Raya | Dataran Tinggi | hai | 1254 | Australia | (415) 413-5182 |+--------------+----------------------+---- ---------------+------------+-------+--- ---------+-------+----------------+

Kami dapat mengambil data dari tabel ini dan menyajikannya sebagai satu set hasil dengan menggunakan gabungan.

Kita juga dapat menggunakan AVG() fungsi dengan OVER klausa untuk menerapkan fungsi jendela ke 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"; 

Hasil:

+---------------+------------------------------ ---+----------------+-----------------------+| Nama Penjual    | Nama Produk                     | Harga Produk   | Rata-Rata Untuk Vendor Ini   ||---------------+----------------- -----+----------------+---------------------------- || Kucing Katty | Mug Kopi Tanpa Dasar (4 Bungkus) | 9,99           | 9.990000                  || Persediaan Mars | Berat Panjang (hijau)             | 11.99          | 19.680000                 || Persediaan Mars | Berat Panjang (biru)              | 14,75          | 19.680000                 || Persediaan Mars | Obeng tangan kanan        | 25,99          | 19.680000                 || Persediaan Mars | Obeng tangan kiri         | 25,99          | 19.680000                 || Medali Pedal  | Kotak Anjing Jerami                   | NULL           | 245.000.000                || Medali Pedal  | Gergaji mesin                        | 245.00         | 245.000.000                || Randy Roofers | Palu Goyang                   | 33,49          | 33.490000                 |+---------------+------------------------------- --+----------------+---------------------------+ 

Dalam hal ini kami menggunakan OVER klausa dengan AVG() . kami berfungsi untuk mempartisi hasil berdasarkan nama vendor.

Dengan melakukan ini, kami dapat menampilkan informasi harga untuk setiap produk, serta harga rata-rata semua produk dari vendor tersebut. Harga rata-rata berubah seiring perubahan vendor (kecuali beberapa vendor kebetulan memiliki rata-rata yang sama), namun tetap sama untuk semua produk dari vendor yang sama.

Konsep ini juga dapat diterapkan ke fungsi agregat lainnya dalam SQL, seperti SUM() , MIN() , MAX() , dan 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. Pelajari Cara Menangani Pengecualian Di PL/SQL

  2. Menskalakan Basis Data Deret Waktu Anda - Cara Mudah Menskalakan TimescaleDB

  3. SQL Pilih Berbeda

  4. SQL GROUP BY- 3 Tips Mudah untuk Mengelompokkan Hasil Seperti Pro

  5. Cara Menggabungkan Beberapa (3+) Tabel dalam Satu Pernyataan