Trong SQL, MAX()
hàm là một hàm tổng hợp trả về giá trị lớn nhất trong một biểu thức nhất định.
Dưới đây là một số ví dụ cơ bản để chứng minh cách hoạt động của nó.
Bảng mẫu
Giả sử chúng ta có bảng sau:
SELECT * FROM Products;
Kết quả:
+-------------+------------+---------------------------------+----------------+-----------------------------------------+ | ProductId | VendorId | ProductName | ProductPrice | ProductDescription | |-------------+------------+---------------------------------+----------------+-----------------------------------------| | 1 | 1001 | Left handed screwdriver | 25.99 | Purple. Includes left handed carry box. | | 2 | 1001 | Long Weight (blue) | 14.75 | Includes a long wait. | | 3 | 1001 | Long Weight (green) | 11.99 | Approximate 30 minute waiting period. | | 4 | 1002 | Sledge Hammer | 33.49 | Wooden handle. Free wine glasses. | | 5 | 1003 | Chainsaw | 245.00 | Orange. Includes spare fingers. | | 6 | 1003 | Straw Dog Box | NULL | Tied with vines. Very chewable. | | 7 | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | Brown ceramic with solid handle. | +-------------+------------+---------------------------------+----------------+-----------------------------------------+
Ví dụ
Chúng tôi có thể sử dụng truy vấn sau để nhận giá tối đa từ bảng đó.
SELECT MAX(ProductPrice)
FROM Products;
Kết quả:
+--------------------+ | (No column name) | |--------------------| | 245.00 | +--------------------+
Trong trường hợp này, thông tin giá được lưu trữ trong ProductPrice
và do đó chúng tôi chuyển nó làm đối số cho MAX()
hàm, sau đó sẽ tính toán và trả về kết quả.
Sử dụng bí danh cột
Bạn sẽ nhận thấy rằng các kết quả trước đó không bao gồm tên cột. Một số DBMS có thể sử dụng một số thứ như MAX(ProductPrice)
như tên cột. Điều này được mong đợi, vì MAX()
hàm không trả về bất kỳ cột nào. Bạn có thể dễ dàng cung cấp tên cột bằng cách gán bí danh.
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;
Kết quả:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+
Kết quả được lọc
MAX()
hàm hoạt động trên các hàng được trả về bởi truy vấn. Vì vậy, nếu bạn lọc kết quả, kết quả là MAX()
sẽ phản ánh điều đó.
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products
WHERE VendorId = 1001;
Kết quả:
+----------------+ | MaximumPrice | |----------------| | 25.99 | +----------------+
Trong trường hợp này, 25,99 là giá tối đa của tất cả các sản phẩm được cung cấp bởi nhà cung cấp được chỉ định.
NULL
Giá trị
MAX()
hàm bỏ qua bất kỳ NULL
nào các giá trị. Trong bảng mẫu của chúng tôi ở trên, số sản phẩm 6
đã có NULL
trong ProductPrice
của nó nhưng cột đó đã bị bỏ qua trong MAX()
của chúng tôi ví dụ.
Tùy thuộc vào DBMS và cài đặt của bạn, bạn có thể thấy hoặc không thấy cảnh báo rằng NULL
các giá trị đã bị loại bỏ trong tập kết quả.
Dưới đây là một ví dụ về những gì bạn có thể thấy:
SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;
Kết quả:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+ Warning: Null value is eliminated by an aggregate or other SET operation.
Tất cả những gì điều này cho chúng ta biết là cột chứa ít nhất một NULL
và nó đã bị bỏ qua khi tính toán kết quả.
Dữ liệu ngày / giờ
Bạn có thể sử dụng MAX()
về giá trị ngày / giờ.
Giả sử chúng ta có bảng sau:
SELECT PetName, DOB
FROM Pets;
Kết quả:
+-----------+------------+ | PetName | DOB | |-----------+------------| | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +-----------+------------+
Chúng tôi có thể sử dụng MAX()
để tìm ngày sinh tối đa (DOB
).
SELECT MAX(DOB) AS MaxDOB
FROM Pets;
Kết quả:
+------------+ | MaxDOB | |------------| | 2020-11-28 | +------------+
Đây sẽ là ngày sinh của thú cưng nhỏ tuổi nhất. Như đã đề cập, nó bỏ qua bất kỳ NULL
nào giá trị.
Dữ liệu ký tự
Khi được sử dụng với các cột dữ liệu ký tự, MAX()
tìm giá trị cao nhất trong chuỗi đối chiếu.
Ví dụ:
SELECT MAX(ProductName) AS MaximumProductName
FROM Products;
Kết quả:
+----------------------+ | MaximumProductName | |----------------------| | Straw Dog Box | +----------------------+
DISTINCT
Từ khóa
DBMS của bạn có thể cho phép DISTINCT
từ khóa được sử dụng với MAX()
hàm số. Nếu vậy, điều này có thể là để tuân thủ tiêu chuẩn ISO SQL.
Do đó, bạn có thể làm được điều này:
SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;
Kết quả:
+----------------+ | MaximumPrice | |----------------| | 245.00 | +----------------+
Nhưng nó sẽ không ảnh hưởng đến kết quả.
DISTINCT
từ khóa có thể rất hữu ích khi được sử dụng với các ngữ cảnh khác (ví dụ:với COUNT()
hàm), nhưng nó không có nghĩa khi được sử dụng với MAX()
. DISTINCT
từ khóa loại bỏ các bản sao, nhưng trong trường hợp MAX()
nó sẽ không tạo ra sự khác biệt nào vì MAX()
trả về cùng một kết quả bất kể có bao nhiêu hàng có cùng giá trị lớn nhất.
Chức năng cửa sổ
Tùy thuộc vào DBMS của bạn, bạn có thể sử dụng OVER
mệnh đề với MAX()
của bạn chức năng tạo một chức năng cửa sổ.
Một hàm cửa sổ thực hiện một hoạt động giống như tổng hợp trên một tập hợp các hàng truy vấn. Nó tạo ra một kết quả cho mỗi hàng truy vấn. Điều này trái ngược với hoạt động tổng hợp, nhóm các hàng truy vấn thành một hàng kết quả duy nhất.
Dưới đây là một ví dụ để chứng minh khái niệm này.
Chúng tôi đã thấy Products
bàn. Cơ sở dữ liệu của chúng tôi cũng có Customers
và nó chứa dữ liệu sau:
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | CustomerId | CustomerName | PostalAddress | City | StateProvince | ZipCode | Country | Phone | |--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+ | 1001 | Palm Pantry | 20 Esplanade | Townsville | QLD | 2040 | AUS | (308) 555-0100 | | 1002 | Tall Poppy | 12 Main Road | Columbus | OH | 43333 | USA | (310) 657-0134 | | 1003 | Crazy Critters | 10 Infinite Loops | Cairns | QLD | 4870 | AUS | (418) 555-0143 | | 1004 | Oops Media | 4 Beachside Drive | Perth | WA | 1234 | AUS | (405) 443-5987 | | 1005 | Strange Names Inc. | 789 George Street | Sydney | NSW | 2000 | AUD | (318) 777-0177 | | 1006 | Hi-Five Solutionists | 5 High Street | Highlands | HI | 1254 | AUS | (415) 413-5182 | +--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
Chúng tôi có thể truy xuất dữ liệu từ các bảng này và trình bày chúng dưới dạng một tập hợp kết quả bằng cách sử dụng phép nối.
Chúng tôi cũng có thể sử dụng MAX()
chức năng với OVER
để áp dụng một hàm cửa sổ cho dữ liệu.
SELECT
v.VendorName,
p.ProductName,
p.ProductPrice,
MAX(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Maximum Price For This Vendor"
FROM Products p
INNER JOIN Vendors v
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Maximum Price For This Vendor";
Kết quả:
+---------------+---------------------------------+----------------+---------------------------------+ | VendorName | ProductName | ProductPrice | Maximum Price For This Vendor | |---------------+---------------------------------+----------------+---------------------------------| | Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99 | 9.99 | | Mars Supplies | Long Weight (green) | 11.99 | 25.99 | | Mars Supplies | Long Weight (blue) | 14.75 | 25.99 | | Mars Supplies | Left handed screwdriver | 25.99 | 25.99 | | Pedal Medals | Straw Dog Box | NULL | 245.00 | | Pedal Medals | Chainsaw | 245.00 | 245.00 | | Randy Roofers | Sledge Hammer | 33.49 | 33.49 | +---------------+---------------------------------+----------------+---------------------------------+
Trong trường hợp này, chúng tôi đã sử dụng OVER
với MAX()
của chúng tôi chức năng phân vùng kết quả theo tên nhà cung cấp.
Bằng cách này, chúng tôi có thể trả lại thông tin giá cho từng sản phẩm, cũng như giá tối đa cho tất cả các sản phẩm từ nhà cung cấp nhất định đó. Giá tối đa này thay đổi khi nhà cung cấp thay đổi (trừ khi nhiều nhà cung cấp có cùng mức giá tối đa), nhưng không đổi cho tất cả các sản phẩm từ cùng một nhà cung cấp.
Khái niệm này cũng có thể được áp dụng cho các hàm tổng hợp khác trong SQL, chẳng hạn như SUM()
, MIN()
, AVG()
và COUNT()
.