Khi sử dụng MySQL, bạn có thể sử dụng AVG()
hàm để tính toán giá trị trung bình từ một phạm vi giá trị.
Ví dụ:bạn có thể sử dụng chức năng này để tìm ra dân số trung bình của thành phố đối với một quốc gia hoặc tiểu bang nhất định. Với một quốc gia sẽ có nhiều thành phố, mỗi thành phố có dân số khác nhau, bạn có thể tìm ra giá trị trung bình giữa chúng. Một thành phố có thể có dân số 50.000, trong khi một thành phố khác có dân số 500.000. AVG()
hàm sẽ tính giá trị trung bình cho bạn.
Cú pháp
Cú pháp của AVG()
như sau:
AVG([DISTINCT] expr) [over_clause]
Ở đâu expr
là biểu thức mà bạn muốn có giá trị trung bình.
over_clause
là một mệnh đề tùy chọn hoạt động với các chức năng cửa sổ. Cách hoạt động của các hàm cửa sổ là, đối với mỗi hàng từ một truy vấn, hãy thực hiện một phép tính bằng cách sử dụng các hàng liên quan đến hàng đó. Trong trường hợp này, over_clause
chỉ định cách phân vùng các hàng truy vấn thành các nhóm để xử lý bởi hàm cửa sổ. Lưu ý rằng over_clause
chỉ có thể được sử dụng nếu bạn không sử dụng DISTINCT
từ khóa.
Dữ liệu thô
Đầu tiên, đây là dữ liệu thô mà chúng tôi sẽ sử dụng cho các ví dụ trên trang này:
SELECT Name, District, Population FROM City WHERE CountryCode = 'AUS';
Kết quả:
+---------------+-----------------+------------+ | Name | District | Population | +---------------+-----------------+------------+ | Sydney | New South Wales | 3276207 | | Melbourne | Victoria | 2865329 | | Brisbane | Queensland | 1291117 | | Perth | West Australia | 1096829 | | Adelaide | South Australia | 978100 | | Canberra | Capital Region | 322723 | | Gold Coast | Queensland | 311932 | | Newcastle | New South Wales | 270324 | | Central Coast | New South Wales | 227657 | | Wollongong | New South Wales | 219761 | | Hobart | Tasmania | 126118 | | Geelong | Victoria | 125382 | | Townsville | Queensland | 109914 | | Cairns | Queensland | 92273 | +---------------+-----------------+------------+
Ví dụ cơ bản
Như bạn có thể thấy từ dữ liệu thô ở trên, một số "Quận" có nhiều hơn một thành phố và mỗi thành phố có một dân số khác nhau. Chúng ta có thể sử dụng AVG()
hàm để tìm dân số trung bình của các thành phố trong mỗi quận:
SELECT District, AVG(Population) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Kết quả:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487.2500 | +-----------------+--------------------+
Vì vậy, chúng ta có thể thấy rằng New South Wales có dân số trung bình của thành phố là 998487.2500.
Làm tròn mức trung bình
Bạn có thể nhận thấy rằng kết quả từ ví dụ trước khá chính xác - nó trả về một kết quả đến bốn chữ số thập phân. Trong trường hợp của chúng tôi, điều này có lẽ là một chút quá nhiều. Chúng tôi không cần kết quả đến chữ số thập phân thứ tư. Do đó, chúng ta có thể sử dụng ROUND()
hàm để làm tròn nó thành số nguyên gần nhất (hoặc đến một số chữ số thập phân được chỉ định nếu chúng ta muốn).
Dưới đây là một ví dụ về việc làm tròn kết quả đến số nguyên gần nhất:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Kết quả:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | +-----------------+--------------------+
Theo mặc định, ROUND()
hàm làm tròn đến số nguyên gần nhất. Ngoài ra, chúng tôi có thể cung cấp đối số thứ hai để chỉ định một số vị trí thập phân, nhưng trong trường hợp này, chúng tôi không muốn điều đó.
Mệnh đề GROUP BY
Chúng ta có thể sử dụng GROUP BY
điều khoản liệt kê từng quận / tiểu bang, cùng với dân số thành phố trung bình của họ:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Kết quả:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | New South Wales | 998487 | | Victoria | 1495356 | | Queensland | 451309 | | West Australia | 1096829 | | South Australia | 978100 | | Capital Region | 322723 | | Tasmania | 126118 | +-----------------+--------------------+
Mệnh đề ORDER BY
Chúng tôi cũng có thể sử dụng ORDER BY
mệnh đề để chỉ định một cột để sắp xếp theo:
SELECT District, ROUND(AVG(Population)) AS 'Average Population' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Average Population`;
Kết quả:
+-----------------+--------------------+ | District | Average Population | +-----------------+--------------------+ | Tasmania | 126118 | | Capital Region | 322723 | | Queensland | 451309 | | South Australia | 978100 | | New South Wales | 998487 | | West Australia | 1096829 | | Victoria | 1495356 | +-----------------+--------------------+
Lưu ý rằng, khi sắp xếp theo bí danh nhiều từ (như `Average Population`
), bạn cần sử dụng ký tự hình nền (`
) thay vì dấu nháy đơn ('
) để bao quanh hai từ.
Tìm độ dài ký tự trung bình
AVG()
hàm không chỉ giới hạn ở các cột có dữ liệu số. Bạn cũng có thể kết hợp AVG()
với các chức năng khác để tìm mức trung bình trong các lĩnh vực khác.
Ví dụ:sử dụng dữ liệu mẫu của chúng tôi, chúng tôi có thể tìm thấy độ dài ký tự trung bình của tất cả các giá trị trong City
cột:
SELECT ROUND(AVG(CHAR_LENGTH(Name))) AS 'Average Character Length' FROM city WHERE CountryCode = 'AUS' AND District = 'New South Wales';
Kết quả:
+--------------------------+ | Average Character Length | +--------------------------+ | 10 | +--------------------------+
Sử dụng mệnh đề OVER
Như đã đề cập, cú pháp cho phép OVER
mệnh đề được bao gồm trong các truy vấn của bạn. Điều này có thể hơi phức tạp, nhưng về cơ bản, OVER
mệnh đề cho phép bạn chỉ định cách phân chia các hàng truy vấn thành các nhóm để xử lý bởi hàm cửa sổ.
Đây là một ví dụ:
SELECT District, Name AS City, Population, ROUND(AVG(Population) OVER(PARTITION BY District)) AS 'District Avg' FROM City WHERE CountryCode = 'AUS' ORDER BY District;
Kết quả:
+-----------------+---------------+------------+--------------+ | District | City | Population | District Avg | +-----------------+---------------+------------+--------------+ | Capital Region | Canberra | 322723 | 322723 | | New South Wales | Sydney | 3276207 | 998487 | | New South Wales | Wollongong | 219761 | 998487 | | New South Wales | Newcastle | 270324 | 998487 | | New South Wales | Central Coast | 227657 | 998487 | | Queensland | Townsville | 109914 | 451309 | | Queensland | Brisbane | 1291117 | 451309 | | Queensland | Cairns | 92273 | 451309 | | Queensland | Gold Coast | 311932 | 451309 | | South Australia | Adelaide | 978100 | 978100 | | Tasmania | Hobart | 126118 | 126118 | | Victoria | Melbourne | 2865329 | 1495356 | | Victoria | Geelong | 125382 | 1495356 | | West Australia | Perth | 1096829 | 1096829 | +-----------------+---------------+------------+--------------+
Ví dụ này phân vùng các hàng theo District
, cung cấp giá trị trung bình cho mỗi phân vùng (quận). Điều này cho phép bạn xem dữ liệu chi tiết hơn, chẳng hạn như dân số thành phố, cùng với dân số trung bình của quận mà nó thuộc về.