Cú pháp
Sử dụng subquery với hàm MIN() trong mệnh đề WHERE:
SELECT * FROM ten_bang WHERE ten_cot = (SELECT MIN(ten_cot) FROM ten_bang);
Ví dụ: Tìm sản phẩm giá rẻ nhất
1. Tạo bảng
mysql> CREATE TABLE MinValueDemo ( -> ProductId INT, -> ProductName VARCHAR(100), -> ProductPrice INT -> ); Query OK, 0 rows affected (0.77 sec)
2. Chèn dữ liệu
mysql> INSERT INTO MinValueDemo VALUES(1,'product-1',4500); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO MinValueDemo VALUES(2,'product-2',4340); Query OK, 1 row affected (0.22 sec) mysql> INSERT INTO MinValueDemo VALUES(3,'product-3',4110); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO MinValueDemo VALUES(4,'product-4',4344); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO MinValueDemo VALUES(5,'product-5',4103); Query OK, 1 row affected (0.13 sec)
3. Dữ liệu gốc
mysql> SELECT * FROM MinValueDemo;
+-----------+-------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+-------------+--------------+ | 1 | product-1 | 4500 | | 2 | product-2 | 4340 | | 3 | product-3 | 4110 | | 4 | product-4 | 4344 | | 5 | product-5 | 4103 | +-----------+-------------+--------------+ 5 rows in set (0.00 sec)
4. Tìm sản phẩm giá thấp nhất
mysql> SELECT * FROM MinValueDemo -> WHERE ProductPrice = (SELECT MIN(ProductPrice) FROM MinValueDemo);
+-----------+-------------+--------------+ | ProductId | ProductName | ProductPrice | +-----------+-------------+--------------+ | 5 | product-5 | 4103 | +-----------+-------------+--------------+ 1 row in set (0.08 sec)
Các phương pháp thay thế
ORDER BY + LIMIT 1 (Đơn giản, hiệu quả)
SELECT * FROM ten_bang ORDER BY ten_cot ASC LIMIT 1;
JOIN với subquery (Cho phép lấy thêm thông tin)
SELECT t.* FROM ten_bang t INNER JOIN (SELECT MIN(ten_cot) AS min_val FROM ten_bang) m ON t.ten_cot = m.min_val;
Window Function (MySQL 8.0+)
SELECT * FROM (
SELECT *, MIN(ten_cot) OVER() AS min_val FROM ten_bang
) t WHERE ten_cot = min_val;
So sánh
| Phương pháp | Ưu điểm | Nhược điểm | Phù hợp |
|---|---|---|---|
| WHERE = (SELECT MIN...) | Chuẩn SQL, rõ ràng | 2 lần quét bảng/ index | Bảng nhỏ, truy vấn ad-hoc |
| ORDER BY ... LIMIT 1 | Nhanh, dùng index | Chỉ lấy 1 hàng (nếu tie) | Khuyên dùng cho hiệu năng |
| JOIN subquery | Lấy được nhiều hàng cùng min | Phức tạp hơn | Cần toàn bộ hàng có giá trị min |
| Window Function | Linh hoạt, 1 lần quét | Chỉ MySQL 8.0+ | Phân tích nâng cao |
Xử lý trường hợp nhiều hàng cùng giá trị MIN
-- Lấy tất cả hàng có giá trị nhỏ nhất SELECT * FROM ten_bang WHERE ten_cot = (SELECT MIN(ten_cot) FROM ten_bang);
Lưu ý
- Index trên cột so sánh (ProductPrice) quan trọng cho hiệu năng
- NULL không được coi là giá trị nhỏ nhất bởi MIN()
- Kết hợp với các cột khác trong SELECT để lấy thông tin đầy đủ