Database
 sql >> база данни >  >> RDS >> Database

SQL MAX() за начинаещи

В SQL, MAX() функцията е агрегатна функция, която връща максималната стойност в даден израз.

По-долу са дадени няколко основни примера, за да демонстрирате как работи.

Примерна таблица

Да предположим, че имаме следната таблица:

SELECT * FROM Products;

Резултат:

+-------------+------------+---------------------------------+----------------+-----------------------------------------+
| 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.        |
+-------------+------------+---------------------------------+----------------+-----------------------------------------+

Пример

Можем да използваме следната заявка, за да получим максималната цена от тази таблица.

SELECT MAX(ProductPrice)
FROM Products;

Резултат:

+--------------------+
| (No column name)   |
|--------------------|
| 245.00             |
+--------------------+

В този случай информацията за цената се съхранява в ProductPrice колона и затова предаваме това като аргумент на MAX() функция, която след това изчислява и връща резултата.

Използване на псевдоними на колони

Ще забележите, че предишните резултати не включват име на колона. Някои СУБД могат да използват нещо като MAX(ProductPrice) като име на колоната. Това може да се очаква, тъй като MAX() функцията не връща никакви колони. Можете лесно да предоставите име на колона, като зададете псевдоним.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Резултат:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+

Филтрирани резултати

MAX() функцията работи с редовете, върнати от заявката. Така че, ако филтрирате резултатите, резултатът от MAX() ще отрази това.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products
WHERE VendorId = 1001;

Резултат:

+----------------+
| MaximumPrice   |
|----------------|
| 25.99          |
+----------------+

В този случай 25,99 е максималната цена от всички продукти, предлагани от посочения доставчик.

NULL Стойности

MAX() функцията игнорира всеки NULL стойности. В нашата примерна таблица по-горе продуктов номер 6 има NULL в неговия ProductPrice колона, но това беше игнорирано в нашия MAX() пример.

В зависимост от вашата СУБД и настройките ви може или не може да видите предупреждение, че NULL стойностите бяха елиминирани в набора от резултати.

Ето пример за това, което може да видите:

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Резултат:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+
Warning: Null value is eliminated by an aggregate or other SET operation.

Всичко това ни казва, че колоната съдържа поне един NULL стойност и че е била игнорирана при изчисляване на резултатите.

Данни за дата/час

Можете да използвате MAX() на стойности за дата/час.

Да предположим, че имаме следната таблица:

SELECT PetName, DOB 
FROM Pets;

Резултат:

+-----------+------------+
| 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       |
+-----------+------------+

Можем да използваме MAX() за да намерите максималната дата на раждане (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Резултат:

+------------+
| MaxDOB     |
|------------|
| 2020-11-28 |
+------------+

Това ще бъде датата на раждане на най-младия домашен любимец. Както споменахме, той игнорира всеки NULL стойности.

Данни за знаци

Когато се използва с колони с данни за знаци, MAX() намира стойността, която е най-висока в последователността за сортиране.

Пример:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Резултат:

+----------------------+
| MaximumProductName   |
|----------------------|
| Straw Dog Box        |
+----------------------+

DISTINCT Ключова дума

Вашата СУБД може да позволи DISTINCT ключова дума, която да се използва с MAX() функция. Ако е така, това вероятно е с цел спазване на стандарта ISO SQL.

Следователно може да успеете да направите това:

SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Резултат:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+

Но това няма да окаже влияние върху резултатите.

DISTINCT ключовата дума може да бъде много полезна, когато се използва с друг контекст (напр. с COUNT() функция), но няма значение, когато се използва с MAX() . DISTINCT ключова дума премахва дубликати, но в случай на MAX() няма да има никаква разлика, защото MAX() връща един и същ резултат, независимо от това колко реда споделят една и съща максимална стойност.

Функции на прозореца

В зависимост от вашата СУБД, може да сте в състояние да използвате OVER клауза с вашия MAX() функция за създаване на прозоречна функция.

Прозоречната функция изпълнява агрегатно-подобна операция върху набор от редове на заявка. Той произвежда резултат за всеки ред на заявката. Това е в контраст с агрегирана операция, която групира редовете на заявката в един ред с резултати.

Ето пример за демонстриране на концепцията.

Вече видяхме Products маса. Нашата база данни също има Customers таблица и съдържа следните данни:

+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+
| 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 |
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+

Можем да извлечем данни от тези таблици и да ги представим като един набор от резултати, като използваме присъединяване.

Можем също да използваме MAX() функция с OVER клауза за прилагане на прозоречна функция към данните.

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";

Резултат:

+---------------+---------------------------------+----------------+---------------------------------+
| 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                           |
+---------------+---------------------------------+----------------+---------------------------------+

В този случай използвахме OVER клауза с нашия MAX() функция за разделяне на резултата по име на доставчик.

По този начин успяхме да върнем информация за цените за всеки продукт, както и максималната цена за всички продукти от този доставчик. Тази максимална цена се променя при промяна на доставчика (освен ако няколко доставчици имат една и съща максимална цена), но остава една и съща за всички продукти от един и същ доставчик.

Тази концепция може да се приложи и към други агрегатни функции в SQL, като 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. SQL MAX() за начинаещи

  2. Трябва ли новите индексни колони да бъдат в ключа или да бъдат включени?

  3. Неочакван страничен ефект от добавянето на филтриран индекс

  4. MMO игри и дизайн на бази данни

  5. Пространството за таблици SYSMMGMTDATA е ПЪЛНО в хранилището за управление на грид инфраструктурата (MGMTDB)