Trong SQL, AVG()
hàm là một hàm tổng hợp trả về giá trị trung bình của tất cả các giá trị trong một biểu thức nhất định.
Nó cũng có thể được sử dụng để trả về giá trị trung bình của tất cả các giá trị khác biệt (duy nhất) trong một biểu thức.
Biểu thức phải là số (nó không thể là chuỗi ký tự, chuỗi bit hoặc ngày giờ).
Dưới đây là một số ví dụ cơ bản để chứng minh cách hoạt động của nó.
Bảng mẫu
Giả sử chúng ta có bảng sau:
SELECT * FROM Products;
Kết quả:
+ ------------- + ------------ + ------------------- -------------- + ---------------- + ------------------ ----------------------- + | ProductId | VendorId | ProductName | Sản phẩm Giá | Mô tả sản phẩm || ------------- + ------------ + -------------------- ------------- + ---------------- + ------------------- ---------------------- || 1 | 1001 | Tô vít tay trái | 25,99 | Màu tím. Bao gồm hộp đựng bên tay trái. || 2 | 1001 | Trọng lượng dài (màu xanh) | 14,75 | Bao gồm một thời gian dài chờ đợi. || 3 | 1001 | Trọng lượng dài (màu xanh lá cây) | 11,99 | Khoảng thời gian chờ khoảng 30 phút. || 4 | 1002 | Búa tạ | 33,49 | Tay cầm bằng gỗ. Ly rượu vang miễn phí. || 5 | 1003 | Cưa xích | 245,00 | Quả cam. Bao gồm các ngón tay dự phòng. || 6 | 1003 | Hộp Chó Rơm | NULL | Buộc bằng dây leo. Rất dễ nhai. || 7 | 1004 | Cốc Cà Phê Không Đáy (4 Gói) | 9,99 | Gốm nâu với tay cầm chắc chắn. || 8 | 1001 | Tuốc nơ vít thuận tay phải | 25,99 | Màu xanh da trời. Bao gồm hộp xách tay phải. | + ------------- + ------------ + --------------------- ------------ + ---------------- + -------------------- --------------------- +
Ví dụ
Chúng ta có thể sử dụng truy vấn sau để lấy giá trung bình của tất cả các mức giá.
SELECT AVG(ProductPrice)
FROM Products;
Kết quả:
+ -------------------- + | (Không có tên cột) || -------------------- || 52.457142 | + -------------------- +
Trong trường hợp này, thông tin giá được lưu trữ trong ProductPrice
và do đó chúng tôi chuyển nó làm đối số cho AVG()
hàm, sau đó sẽ tính giá trị trung bình và trả về kết quả.
Sử dụng bí danh cột
Bạn sẽ nhận thấy rằng các kết quả trước đó không bao gồm tên cột. Điều này được mong đợi, vì AVG()
hàm không trả về bất kỳ cột nào. Bạn có thể dễ dàng cung cấp tên cột bằng cách gán bí danh.
SELECT AVG(ProductPrice) AS Average
FROM Products;
Kết quả:
+ ----------- + | Trung bình || ----------- || 52.457142 | + ----------- +
Kết quả được lọc
AVG()
hàm hoạt động trên các hàng được trả về bởi truy vấn. Vì vậy, nếu bạn lọc kết quả, kết quả là AVG()
sẽ phản ánh điều đó.
SELECT AVG(ProductPrice) AS Average
FROM Products
WHERE VendorId = 1001;
Kết quả:
+ ----------- + | Trung bình || ----------- || 19.680000 | + ----------- +
Trong trường hợp này, 19.680000 là giá trung bình của tất cả các sản phẩm được cung cấp bởi nhà cung cấp được chỉ định.
NULL
Giá trị
AVG()
hàm bỏ qua bất kỳ NULL
nào các giá trị. Trong bảng mẫu của chúng tôi ở trên, số sản phẩm 6
đã có NULL
trong ProductPrice
của nó nhưng cột đó đã bị bỏ qua trong AVG()
của chúng tôi ví dụ.
Tùy thuộc vào DBMS và cài đặt của bạn, bạn có thể thấy hoặc không thấy cảnh báo rằng NULL
các giá trị đã bị loại bỏ trong tập kết quả.
Dưới đây là một ví dụ về những gì bạn có thể thấy:
SELECT AVG(ProductPrice) AS Average
FROM Products;
Kết quả:
+ ----------- + | Trung bình || ----------- || 52.457142 | + ----------- + Cảnh báo:Giá trị rỗng bị loại bỏ bởi phép toán tổng hợp hoặc SET khác.
Tất cả những gì điều này cho chúng ta biết là cột chứa ít nhất một NULL
và nó đã bị bỏ qua khi tính toán kết quả.
Dữ liệu ngày / giờ
AVG()
hàm không chấp nhận các biểu thức ngày / giờ.
Giả sử chúng ta có bảng sau:
SELECT PetName, DOB
FROM Pets;
Kết quả:
+ ----------- + ------------ + | PetName | DOB || ----------- + ------------ || Bông xù | 2020-11-20 || Tìm nạp | 2019-08-16 || Cào | 2018-10-01 || Wag | 2020-03-15 || Tweet | 2020-11-28 || Bông xù | 2020-09-17 || Vỏ cây | NULL || Meo meo | NULL | + ----------- + ------------ +
Nếu chúng tôi cố gắng sử dụng AVG()
trên DOB
, chúng tôi sẽ gặp lỗi.
SELECT AVG(DOB) AS Average
FROM Pets;
Kết quả:
Msg 8117, Level 16, State 1, Line 1Dữ liệu ký tự
AVG()
hàm cũng không chấp nhận các biểu thức chuỗi ký tự.Đây là những gì sẽ xảy ra nếu chúng tôi cố gắng sử dụng
AVG()
trênProductName
cộtProducts
của chúng tôi bảng (sử dụng kiểu dữ liệu varchar):SELECT AVG(ProductName) AS Average FROM Products;
Kết quả:
Msg 8117, Mức 16, Trạng thái 1, Dòng 1 Kiểu dữ liệu loại varchar không hợp lệ cho toán tử trung bình.
DISTINCT
Từ khóaBạn có thể sử dụng
DISTINCT
từ khóa vớiAVG()
để chỉ tính các giá trị riêng biệt. Nghĩa là, nếu có bất kỳ giá trị trùng lặp nào, chúng được coi là một giá trị.Ví dụ:
SELECT AVG(DISTINCT ProductPrice) AS DistinctAverage FROM Products;
Kết quả:
+ ------------------- + | Trung bình || ------------------- || 56.868333 | + ------------------- +Chúng ta có thể thấy rằng kết quả này cao hơn kết quả mà chúng ta nhận được khi không có
DISTINCT
từ khóa.Tóm lại, chúng tôi nhận được 52.457142 mà không có
DISTINCT
từ khóa và 56.868333 vớiDISTINCT
từ khóa.Điều này là do có hai mặt hàng có cùng mức giá (tuốc nơ vít thuận tay trái và tuốc nơ vít tay phải đều có giá 25,99). Do đó,
AVG()
, khi được sử dụng vớiDISTINCT
từ khóa, coi cả hai giá trị đó là một và tính toán kết quả của nó cho phù hợp.Chức năng cửa sổ
Tùy thuộc vào DBMS của bạn, bạn có thể sử dụng
OVER
vớiAVG()
của bạn chức năng tạo một chức năng cửa sổ.Một hàm cửa sổ thực hiện một hoạt động giống như tổng hợp trên một tập hợp các hàng truy vấn. Nó tạo ra một kết quả cho mỗi hàng truy vấn. Điều này trái ngược với hoạt động tổng hợp, nhóm các hàng truy vấn thành một hàng kết quả duy nhất.
Dưới đây là một ví dụ để chứng minh khái niệm này.
Chúng tôi đã thấy
Products
bàn. Cơ sở dữ liệu của chúng tôi cũng cóCustomers
và nó chứa dữ liệu sau:+ -------------- + ---------------------- + -------- ----------- + ------------ + ----------------- + ------- ----- + ----------- + ---------------- + | CustomerId | Tên khách hàng | Địa chỉ bưu điện | Thành phố | StateProvince | Mã ZipCode | Quốc gia | Điện thoại || -------------- + ---------------------- + --------- ---------- + ------------ + ----------------- + -------- ---- + ----------- + ---------------- + | 1001 | Palm Pantry | 20 Esplanade | Townsville | QLD | Năm 2040 | AUS | (308) 555-0100 || 1002 | Cao anh túc | 12 Đường chính | Columbus | OH | 43333 | Hoa Kỳ | (310) 657-0134 || 1003 | Sinh Vật Điên Cuồng | 10 vòng lặp vô hạn | 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 | Năm 2000 | AUD | (318) 777-0177 || 1006 | Hi-Five Solutionists | 5 Đường cao tốc | Tây Nguyên | CHÀO | 1254 | AUS | (415) 413-5182 | + -------------- + ---------------------- + ---- --------------- + ------------ + ----------------- + --- --------- + ----------- + ---------------- +Chúng tôi có thể truy xuất dữ liệu từ các bảng này và trình bày chúng dưới dạng một tập hợp kết quả bằng cách sử dụng phép nối.
Chúng tôi cũng có thể sử dụng
AVG()
chức năng vớiOVER
để áp dụng một hàm cửa sổ cho dữ liệu.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";
Kết quả:
+ --------------- + ------------------------------ --- + ---------------- + --------------------------- + | VendorName | ProductName | Sản phẩm Giá | Trung bình cho nhà cung cấp này || --------------- + ---------------------------- ----- + ---------------- + --------------------------- || Mèo con Katty | Cốc Cà Phê Không Đáy (4 Gói) | 9,99 | 9.990000 || Nguồn cung cấp Mars | Trọng lượng dài (màu xanh lá cây) | 11,99 | 19.680000 || Nguồn cung cấp Mars | Trọng lượng dài (màu xanh) | 14,75 | 19.680000 || Nguồn cung cấp Mars | Tuốc nơ vít thuận tay phải | 25,99 | 19.680000 || Nguồn cung cấp Mars | Tô vít tay trái | 25,99 | 19.680000 || Huy chương bàn đạp | Hộp Chó Rơm | NULL | 245.000000 || Huy chương bàn đạp | Cưa xích | 245,00 | 245.000000 || Tấm lợp Randy | Búa tạ | 33,49 | 33.490000 | + --------------- + ------------------------------- - + ---------------- + --------------------------- +Trong trường hợp này, chúng tôi đã sử dụng
OVER
vớiAVG()
của chúng tôi chức năng phân vùng kết quả theo tên nhà cung cấp.Bằng cách này, chúng tôi có thể trả lại thông tin giá cho từng sản phẩm, cũng như giá trung bình của tất cả các sản phẩm từ nhà cung cấp cụ thể đó. Giá trung bình thay đổi khi nhà cung cấp thay đổi (trừ khi nhiều nhà cung cấp có cùng mức giá trung bình), nhưng không đổi cho tất cả các sản phẩm từ cùng một nhà cung cấp.
Khái niệm này cũng có thể được áp dụng cho các hàm tổng hợp khác trong SQL, chẳng hạn như
SUM()
,MIN()
,MAX()
vàCOUNT()
.