MySQL MIN()
hàm là một hàm tổng hợp trả về giá trị nhỏ 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ị nhỏ nhất từ các hàng được trả về. Nếu không có hàng nào phù hợp, MIN()
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ố ít nhất trong danh sách các thành phố.
Cú pháp
Cú pháp của MIN()
như sau:
MIN([DISTINCT] expr) [over_clause]
Ở đâu expr
là biểu thức mà bạn muốn có giá trị nhỏ 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 MIN()
hàm để tìm thành phố có dân số nhỏ nhất (tức là hàng có giá trị nhỏ nhất trong cột dân số của nó).
USE world; SELECT MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'THA';
Kết quả:
+---------------+ | Minimum Value | +---------------+ | 94100 | +---------------+
Mệnh đề GROUP BY
Chúng ta có thể sử dụng GROUP BY
mệnh đề liệt kê từng quận, cùng với dân số của thành phố nhỏ nhất của quận đó (theo dân số):
USE world; SELECT District, MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District;
Kết quả:
+-----------------+---------------+ | District | Minimum Value | +-----------------+---------------+ | New South Wales | 219761 | | Victoria | 125382 | | Queensland | 92273 | | 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, MIN(Population) AS 'Minimum Value' FROM City WHERE CountryCode = 'AUS' GROUP BY District ORDER BY `Minimum Value` ASC;
Kết quả:
+-----------------+---------------+ | District | Minimum Value | +-----------------+---------------+ | Queensland | 92273 | | Victoria | 125382 | | Tasmania | 126118 | | New South Wales | 219761 | | Capital Region | 322723 | | South Australia | 978100 | | West Australia | 1096829 | +-----------------+---------------+
Đ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 sắp xếp theo bí danh gồm nhiều từ (như `Minimum 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 thiểu
MIN()
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 MIN()
với các chức năng khác để trả về giá trị nhỏ 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 thiểu trong City
cột:
SELECT MIN(CHAR_LENGTH(Name)) AS 'Minimum Character Length' FROM city;
Kết quả:
+--------------------------+ | Minimum Character Length | +--------------------------+ | 3 | +--------------------------+
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 MIN()
chức năng):
SELECT Name, CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` LIMIT 10;
Kết quả:
+------+------------------+ | Name | Character Length | +------+------------------+ | Ome | 3 | | Yao | 3 | | Qom | 3 | | Itu | 3 | | Tsu | 3 | | Ube | 3 | | Ise | 3 | | Uji | 3 | | Ede | 3 | | Ota | 3 | +------+------------------+
Do nhiều thành phố có cùng độ dài ký tự, chúng tôi có thể điều chỉnh truy vấn này để chỉ trả về các giá trị riêng biệt:
SELECT DISTINCT CHAR_LENGTH(Name) AS 'Character Length' FROM city ORDER BY `Character Length` LIMIT 10;
Kết quả:
+------------------+ | Character Length | +------------------+ | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | | 11 | | 12 | +------------------+
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', MIN(Population) OVER(PARTITION BY District) AS 'District Minimum' FROM City WHERE CountryCode = 'AUS' ORDER BY `District Minimum` DESC;
Kết quả:
+-----------------+---------------+-----------------+------------------+ | District | City | City Population | District Minimum | +-----------------+---------------+-----------------+------------------+ | West Australia | Perth | 1096829 | 1096829 | | South Australia | Adelaide | 978100 | 978100 | | Capital Region | Canberra | 322723 | 322723 | | New South Wales | Sydney | 3276207 | 219761 | | New South Wales | Wollongong | 219761 | 219761 | | New South Wales | Newcastle | 270324 | 219761 | | New South Wales | Central Coast | 227657 | 219761 | | Tasmania | Hobart | 126118 | 126118 | | Victoria | Melbourne | 2865329 | 125382 | | Victoria | Geelong | 125382 | 125382 | | Queensland | Townsville | 109914 | 92273 | | Queensland | Brisbane | 1291117 | 92273 | | Queensland | Cairns | 92273 | 92273 | | Queensland | Gold Coast | 311932 | 92273 | +-----------------+---------------+-----------------+------------------+
Ví dụ này phân vùng các hàng theo District
, cung cấp giá trị tối thiểu 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ố nhỏ nhất (theo dân số) trong cùng một quận.