sql >> Databasteknik >  >> RDS >> Database

SQL MIN() för nybörjare

I SQL, MIN() funktion är en aggregerad funktion som returnerar minimivärdet i ett givet uttryck.

Nedan följer några grundläggande exempel för att visa hur det fungerar.

Exempeltabell

Anta att vi har följande tabell:

SELECT * FROM Products;

Resultat:

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

Exempel

Här är ett enkelt exempel att visa.

SELECT MIN(ProductPrice)
FROM Products;

Resultat:

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

I det här fallet lagras prisinformation i ProductPrice kolumnen, och så skickar vi det som ett argument till MIN() funktion, som sedan beräknar och returnerar resultatet.

Använda kolumnalias

Du kommer att märka att de tidigare resultaten inte innehåller ett kolumnnamn. Detta är förväntat eftersom MIN() funktion returnerar inga kolumner. Du kan enkelt ange ett kolumnnamn genom att tilldela ett alias.

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Resultat:

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

Filtrerade resultat

MIN() funktionen fungerar på raderna som returneras av frågan. Så om du filtrerar resultaten blir resultatet av MIN() kommer att återspegla det.

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

Resultat:

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

I det här fallet är 11,99 minimipriset av alla produkter som erbjuds av den angivna leverantören.

NULL Värden

MIN() funktionen ignorerar någon NULL värden. I vår exempeltabell ovan, produktnummer 6 har NULL i dess ProductPrice kolumn, men det ignorerades i vår MIN() exempel.

Beroende på ditt DBMS och dina inställningar kanske du ser en varning som NULL värden eliminerades i resultatuppsättningen.

Här är ett exempel på vad du kan se:

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Resultat:

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

Allt detta säger oss är att kolumnen innehöll minst en NULL värde, och att det ignorerades vid beräkning av resultaten.

Datum/tiddata

Du kan använda MIN() på datum/tidsvärden.

Anta att vi har följande tabell:

SELECT PetName, DOB 
FROM Pets;

Resultat:

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

Vi kan använda MIN() för att hitta det lägsta födelsedatumet (DOB ).

SELECT MIN(DOB) AS MinDOB
FROM Pets;

Resultat:

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

Återigen ignorerar den NULL värden.

Teckendata

När den används med teckendatakolumner, MIN() hittar det värde som är lägst i sorteringssekvensen.

Exempel:

SELECT MIN(ProductName) AS MinimumProductName
FROM Products;

Resultat:

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

DISTINCT Nyckelord

Din DBMS kan tillåta DISTINCT nyckelord som ska användas med MIN() fungera. Om så är fallet är detta förmodligen för att uppfylla ISO SQL-standarden.

Därför kanske du kan göra detta:

SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;

Resultat:

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

Men det kommer inte att påverka resultaten.

DISTINCT Nyckelordet kan vara mycket användbart när det används med andra sammanhang (t.ex. med COUNT() funktion), men den har ingen betydelse när den används med MIN() . DISTINCT nyckelordet tar bort dubbletter, men i fallet med MIN() det kommer inte att göra någon skillnad eftersom MIN() returnerar samma resultat oavsett hur många rader som delar samma minimivärde.

Fönsterfunktioner

Beroende på ditt DBMS kan du kanske använda en OVER sats med din MIN() funktion för att skapa en fönsterfunktion.

En fönsterfunktion utför en aggregatliknande operation på en uppsättning frågerader. Det ger ett resultat för varje frågerad. Detta till skillnad från en aggregerad operation, som grupperar frågerader i en enda resultatrad.

Här är ett exempel för att demonstrera konceptet.

Vi har redan sett Products tabell. Vår databas har också en Customers tabell och den innehåller följande data:

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

Vi kan hämta data från dessa tabeller och presentera dem som en resultatuppsättning genom att använda en join.

Vi kan också använda MIN() funktion med OVER sats för att tillämpa en fönsterfunktion på data.

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

Resultat:

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

I det här fallet använde vi OVER sats med vår MIN() funktion för att partitionera resultatet efter leverantörsnamn.

Genom att göra detta kunde vi returnera prisinformation för varje produkt, såväl som minimipriset för alla produkter från den givna leverantören. Detta minimipris ändras när leverantören ändras (såvida inte flera leverantörer råkar ha samma minimipris), men förblir detsamma för alla produkter från samma leverantör.

Det här konceptet kan också tillämpas på andra aggregerade funktioner i SQL, såsom SUM() , AVG() , MAX() och COUNT() .


  1. PostgreSQL-agent i SQL Standard Committee igen

  2. Fördunkla känsliga uppgifter i dina genomförandeplaner

  3. Varför skulle ett IN-villkor vara långsammare än =i sql?

  4. Infoga data i tabeller länkade med främmande nyckel