Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

SQL MAX () cho người mới bắt đầu

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()COUNT() .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tác động của phân mảnh đối với các kế hoạch thực thi

  2. Thủ tục được lưu trữ để xóa bản ghi trùng lặp trong bảng SQL

  3. Đổi tên cơ sở dữ liệu có thể cài đặt

  4. Mô hình dữ liệu để giao dịch cổ phiếu, quỹ và tiền điện tử

  5. Tránh sắp xếp bằng hợp nhất Nối kết nối