Cùng lặn vào thế giới của cực trị trong dữ liệu — tìm giá trị nhỏ nhất và lớn nhất. Đừng lo, SQL không bắt bạn học gì quá mới đâu, nhưng tụi mình sẽ biết cách tìm giá trị lớn nhất và nhỏ nhất trong bảng. Mấy hàm này dùng khắp nơi luôn: từ phân tích rating phim trên IMDb tới tính nhiệt độ thấp nhất trên Sao Hỏa.
MIN() và MAX() là các hàm tổng hợp trả về giá trị nhỏ nhất và lớn nhất từ một tập dữ liệu. Chúng hoạt động như những thợ săn cực trị: MIN() tìm phần tử nhỏ nhất, còn MAX() thì ngược lại, tìm phần tử lớn nhất. Không chỉ dùng cho số đâu nhé: bạn còn có thể tìm chuỗi nhỏ nhất/lớn nhất hoặc ngày tháng nữa.
-- Dạng tổng quát của hàm MIN và MAX
SELECT
MIN(column_name) AS min_value,
MAX(column_name) AS max_value
FROM table_name;
Dễ ẹc luôn! Giờ thì xem thử mấy phép màu này hoạt động thế nào trong các trường hợp khác nhau nha.
Cú pháp và ví dụ cơ bản
Dữ liệu số
Giả sử tụi mình có bảng employees, trong đó có cột lương nhân viên (salary).
Tụi mình muốn biết lương nhỏ nhất và lớn nhất là bao nhiêu.
Bảng employees
| id | name | salary |
|---|---|---|
| 1 | Anna Song | 45000 |
| 2 | Otto Art | 30000 |
| 3 | Maria Chi | 120000 |
| 4 | Alex Lin | 90000 |
| 5 | Eva Tan | 60000 |
-- Ví dụ cho dữ liệu số
SELECT
MIN(salary) AS min_salary,
MAX(salary) AS max_salary
FROM employees;
Kết quả
| min_salary | max_salary |
|---|---|
| 30000 | 120000 |
Dữ liệu văn bản
Bạn có thể dùng MIN() và MAX() với dữ liệu dạng text luôn nha.
Chúng so sánh theo thứ tự chữ cái (đúng rồi, chữ cái cũng có "nhỏ nhất" và "lớn nhất" đó).
Giả sử có bảng students, trong cột name lưu tên sinh viên.
Bảng students
| id | name |
|---|---|
| 1 | Anna |
| 2 | Otto |
| 3 | Maria |
| 4 | Ben |
| 5 | Zoe |
-- Ví dụ cho dữ liệu text
SELECT
MIN(name) AS first_name_in_order,
MAX(name) AS last_name_in_order
FROM students;
Kết quả
| first_name_in_order | last_name_in_order |
|---|---|
| Anna | Zoe |
Ngày tháng và thời gian
Tìm ngày sớm nhất và muộn nhất trong bảng events.
Bảng events
| id | event_name | event_date |
|---|---|---|
| 1 | New Year Party | 2023-01-01 |
| 2 | Summer Fest | 2023-06-15 |
| 3 | Halloween Bash | 2023-10-31 |
| 4 | Year End Gala | 2023-12-31 |
-- Ví dụ cho ngày tháng
SELECT
MIN(event_date) AS earliest_date,
MAX(event_date) AS latest_date
FROM events;
Kết quả
| earliest_date | latest_date |
|---|---|
| 2023-01-01 | 2023-12-31 |
Dùng MIN() và MAX() với bảng có giá trị NULL
Nếu trong cột có giá trị NULL, bạn cứ yên tâm: SQL sẽ bỏ qua chúng khi tính toán.
Nghĩa là MIN() và MAX() chỉ làm việc với giá trị "bình thường" thôi.
Bảng employees_with_null
| id | name | salary |
|---|---|---|
| 1 | Otto | 30000 |
| 2 | Maria | NULL |
| 3 | Anna | 120000 |
| 4 | John | NULL |
-- Bảng có NULL
SELECT
MIN(salary) AS min_salary,
MAX(salary) AS max_salary
FROM employees_with_null;
Nếu trong cột salary có dòng NULL, chúng sẽ bị bỏ qua thôi.
| min_salary | max_salary |
|---|---|
| 30000 | 120000 |
Nhưng nếu TOÀN BỘ cột đều là NULL, kết quả sẽ là NULL.
Ví dụ dùng MIN() và MAX() trong thực tế
Xác định nhân viên lớn tuổi nhất và trẻ nhất
Bảng employees
| id | name | birth_date |
|---|---|---|
| 1 | Otto | 1980-05-10 |
| 2 | Maria | 1990-11-20 |
| 3 | Anna | 1975-03-15 |
| 4 | John | 2000-08-01 |
Trong bảng employees có trường birth_date lưu ngày sinh nhân viên. Xác định ai lớn tuổi nhất và ai trẻ nhất nhé.
SELECT
MIN(birth_date) AS oldest_employee,
MAX(birth_date) AS youngest_employee
FROM employees;
Kết quả:
| oldest_employee | youngest_employee |
|---|---|
| 1975-03-15 | 2000-08-01 |
Phân tích doanh số
| id | amount |
|---|---|
| 1 | 150.00 |
| 2 | 75.50 |
| 3 | 200.00 |
| 4 | 120.00 |
| 5 | 500.00 |
| 6 | 90.00 |
Trong bảng sales có trường amount lưu số tiền bán hàng. Tìm giá trị nhỏ nhất và lớn nhất của đơn hàng nhé.
SELECT
MIN(amount) AS smallest_sale,
MAX(amount) AS largest_sale
FROM sales;
Kết quả truy vấn
| smallest_sale | largest_sale |
|---|---|
| 75.50 | 500.00 |
Tìm đơn hàng đầu tiên và cuối cùng
Nếu bạn có bảng orders với trường order_date, có thể dễ dàng biết ngày đặt hàng đầu tiên và cuối cùng.
Bảng gốc orders
| order_id | customer_id | order_date | amount |
|---|---|---|---|
| 101 | 1 | 2023-01-15 10:23:00 | 250.00 |
| 102 | 2 | 2023-02-10 14:45:00 | 150.00 |
| 103 | 3 | 2023-01-05 09:10:00 | 300.00 |
| 104 | 1 | 2023-03-22 16:30:00 | 500.00 |
| 105 | 4 | 2023-01-25 11:00:00 | 120.00 |
SELECT
MIN(order_date) AS first_order,
MAX(order_date) AS last_order
FROM orders;
Kết quả truy vấn:
| first_order | last_order |
|---|---|
| 2023-01-05 09:10:00 | 2023-03-22 16:30:00 |
Đặc điểm của MIN() và MAX()
So sánh chuỗi: khi làm việc với chuỗi, MIN() và MAX() so sánh theo thứ tự chữ cái.
Làm việc với NULL: NULL sẽ bị bỏ qua nếu trong cột còn giá trị khác. Nhưng nếu tất cả đều NULL, kết quả là NULL.
So sánh ngày tháng: SQL xét cả năm, tháng, ngày, giờ, phút luôn nha.
GO TO FULL VERSION