MySQL MAX()
hàm là một hàm tổng hợp trả về giá trị lớn nhất từ một biểu thức.
Thông thường, biểu thức sẽ là một dải giá trị được trả về dưới dạng các hàng riêng biệt trong một cột và bạn có thể sử dụng hàm này để tìm giá trị lớn nhất từ các hàng được trả về. Nếu không có hàng nào phù hợp, MAX()
trả về NULL
.
Ví dụ:bạn có thể sử dụng chức năng này để tìm ra thành phố nào có dân số đông nhất trong danh sách các thành phố.
Cú pháp
Cú pháp của MAX()
như sau:
MAX([DISTINCT] expr) [over_clause]
Ở đâu expr
là biểu thức mà bạn muốn có giá trị lớn nhất.
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ổ. 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.
(Tùy chọn) DISTINCT
từ khóa có thể được sử dụng để loại bỏ các giá trị trùng lặp.
Ví dụ cơ bản
Đầu tiên, đây là dữ liệu thô mà chúng tôi sẽ sử dụng trong ví dụ này:
USE world; SELECT Name, Population FROM City WHERE CountryCode = 'THA';
Kết quả:
+-------------------+------------+ | Name | Population | +-------------------+------------+ | Bangkok | 6320174 | | Nonthaburi | 292100 | | Nakhon Ratchasima | 181400 | | Chiang Mai | 171100 | | Udon Thani | 158100 | | Hat Yai | 148632 | | Khon Kaen | 126500 | | Pak Kret | 126055 | | Nakhon Sawan | 123800 | | Ubon Ratchathani | 116300 | | Songkhla | 94900 | | Nakhon Pathom | 94100 | +-------------------+------------+
Chúng ta có thể sử dụng MAX()
hàm để tìm thành phố có dân số lớn nhất (tức là hàng có giá trị lớn nhất trong cột dân số của nó).
USE world; SELECT MAX(Population) AS 'Maximum Value' FROM City WHERE CountryCode = 'THA';
Kết quả:
+---------------+ | Maximum Value | +---------------+ | 6320174 | +---------------+
Mệnh đề GROUP BY
Chúng ta có thể sử dụng GROUP BY
mệnh đề liệt kê từng quốc gia, cùng với dân số của thành phố lớn nhất của quốc gia đó (theo dân số):
USE world; SELECT District, MAX(Population) AS 'Max Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Kết quả:
+-----------------+-----------+ | District | Max Value | +-----------------+-----------+ | New South Wales | 3276207 | | Victoria | 2865329 | | Queensland | 1291117 | | 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:
USE world; SELECT District, MAX(Population) AS 'Max Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Max Value` ASC;
Kết quả:
+-----------------+-----------+ | District | Max Value | +-----------------+-----------+ | Tasmania | 126118 | | Capital Region | 322723 | | South Australia | 978100 | | West Australia | 1096829 | | Queensland | 1291117 | | Victoria | 2865329 | | New South Wales | 3276207 | +-----------------+-----------+
Điều này sắp xếp các kết quả theo thứ tự tăng dần, trong đó liệt kê giá trị nhỏ nhất trước tiên.
Lưu ý rằng, khi đặt hàng theo bí danh nhiều từ (như `Max Value`
), 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ự tối đa
MAX()
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 MAX()
với các chức năng khác để trả về giá trị lớn nhất trong các khu 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 giá trị có số ký tự tối đa trong City
cột:
SELECT MAX(CHAR_LENGTH(Name)) AS 'Maximum Character Length' FROM city;
Kết quả:
+--------------------------+ | Maximum Character Length | +--------------------------+ | 34 | +--------------------------+
Chúng tôi cũng có thể thấy điều này bằng cách sử dụng truy vấn sau (không liên quan đến MAX()
chức năng):
SELECT Name, CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` DESC LIMIT 10;
Kết quả:
+--------------------------------------+------------------+ | Name | Character Length | +--------------------------------------+------------------+ | Luxembourg [Luxemburg/Lëtzebuerg] | 34 | | Castellón de la Plana [Castell | 31 | | San Fernando del Valle de Cata | 30 | | Santo Domingo de los Colorados | 30 | | Thiruvananthapuram (Trivandrum | 30 | | [San Cristóbal de] la Laguna | 29 | | Ingraj Bazar (English Bazar) | 28 | | Soledad de Graciano Sánchez | 28 | | Valle de Chalco Solidaridad | 27 | | Machilipatnam (Masulipatam) | 27 | +--------------------------------------+------------------+
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. 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 AS 'City Population', MAX(Population) OVER(PARTITION BY District) AS 'District Max' FROM City WHERE CountryCode = 'AUS' ORDER BY `District Max` DESC;
Kết quả:
+-----------------+---------------+-----------------+--------------+ | District | City | City Population | District Max | +-----------------+---------------+-----------------+--------------+ | New South Wales | Sydney | 3276207 | 3276207 | | New South Wales | Wollongong | 219761 | 3276207 | | New South Wales | Newcastle | 270324 | 3276207 | | New South Wales | Central Coast | 227657 | 3276207 | | Victoria | Melbourne | 2865329 | 2865329 | | Victoria | Geelong | 125382 | 2865329 | | Queensland | Townsville | 109914 | 1291117 | | Queensland | Brisbane | 1291117 | 1291117 | | Queensland | Cairns | 92273 | 1291117 | | Queensland | Gold Coast | 311932 | 1291117 | | West Australia | Perth | 1096829 | 1096829 | | South Australia | Adelaide | 978100 | 978100 | | Capital Region | Canberra | 322723 | 322723 | | Tasmania | Hobart | 126118 | 126118 | +-----------------+---------------+-----------------+--------------+
Ví dụ này phân vùng các hàng theo District
, cung cấp giá trị lớn nhất 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ố của từng thành phố, cùng với dân số của thành phố lớn nhất trong cùng một quận.