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

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

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

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

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

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

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 MIN(ProductPrice)
FROM Products;

Резултат:

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

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

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

Ще забележите, че предишните резултати не включват име на колона. Това може да се очаква, тъй като MIN() функцията не връща никакви колони. Можете лесно да предоставите име на колона, като зададете псевдоним.

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Резултат:

+----------------+
| MinimumPrice   |
|----------------|
| 9.99           |
+----------------+

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

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

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products
WHERE VendorId = 1001;

Резултат:

+----------------+
| MinimumPrice   |
|----------------|
| 11.99          |
+----------------+

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

NULL Стойности

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

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

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

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Резултат:

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

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

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

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

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

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

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

SELECT MIN(DOB) AS MinDOB
FROM Pets;

Резултат:

+------------+
| MinDOB     |
|------------|
| 2018-10-01 |
+------------+

Отново игнорира NULL стойности.

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

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

Пример:

SELECT MIN(ProductName) AS MinimumProductName
FROM Products;

Резултат:

+---------------------------------+
| MinimumProductName              |
|---------------------------------|
| Bottomless Coffee Mugs (4 Pack) |
+---------------------------------+

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

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

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

SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;

Резултат:

+----------------+
| MinimumPrice   |
|----------------|
| 9.99           |
+----------------+

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

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

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

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

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

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

Вече видяхме 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 |
+--------------+----------------------+-------------------+------------+-----------------+------------+-----------+----------------+

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

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

SELECT 
    v.VendorName,
    p.ProductName,
    p.ProductPrice,
    MIN(ProductPrice) OVER (PARTITION BY v.VendorName) AS "Minimum Price For This Vendor"
FROM Products p 
INNER JOIN Vendors v 
ON v.VendorId = p.VendorId
ORDER BY VendorName, ProductPrice, "Minimum Price For This Vendor";

Резултат:

+---------------+---------------------------------+----------------+---------------------------------+
| VendorName    | ProductName                     | ProductPrice   | Minimum Price For This Vendor   |
|---------------+---------------------------------+----------------+---------------------------------|
| Katty Kittens | Bottomless Coffee Mugs (4 Pack) | 9.99           | 9.99                            |
| Mars Supplies | Long Weight (green)             | 11.99          | 11.99                           |
| Mars Supplies | Long Weight (blue)              | 14.75          | 11.99                           |
| Mars Supplies | Left handed screwdriver         | 25.99          | 11.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 клауза с нашия MIN() функция за разделяне на резултата по име на доставчик.

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

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

  2. Решения за предизвикателство за генератор на числови серии – част 5

  3. Групиран агрегатен избутване

  4. Пич, кой притежава тази #temp маса?

  5. Мигриране от AnswerHub към WordPress:Приказка за 10 технологии