sql >> Database teknologi >  >> RDS >> Database

SQL MIN() for begyndere

I SQL er MIN() funktion er en aggregeret funktion, der returnerer minimumsværdien i et givet udtryk.

Nedenfor er nogle grundlæggende eksempler for at demonstrere, hvordan det virker.

Eksempeltabel

Antag, at vi har følgende tabel:

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

Eksempel

Her er et simpelt eksempel at demonstrere.

SELECT MIN(ProductPrice)
FROM Products;

Resultat:

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

I dette tilfælde gemmes prisoplysninger i ProductPrice kolonne, og så sender vi det som et argument til MIN() funktion, som derefter beregner og returnerer resultatet.

Brug af kolonnealiaser

Du vil bemærke, at de tidligere resultater ikke indeholder et kolonnenavn. Dette kan forventes, fordi MIN() funktion returnerer ikke nogen kolonner. Du kan nemt angive et kolonnenavn ved at tildele et alias.

SELECT MIN(ProductPrice) AS MinimumPrice
FROM Products;

Resultat:

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

Filtrerede resultater

MIN() funktionen fungerer på de rækker, der returneres af forespørgslen. Så hvis du filtrerer resultaterne, er resultatet af MIN() vil afspejle det.

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

Resultat:

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

I dette tilfælde er 11,99 minimumsprisen ud af alle de produkter, der tilbydes af den angivne leverandør.

NULL Værdier

MIN() funktionen ignorerer enhver NULL værdier. I vores eksempeltabel ovenfor, produktnummer 6 har fået NULL i dens ProductPrice kolonne, men det blev ignoreret i vores MIN() eksempel.

Afhængigt af dit DBMS og dine indstillinger kan du muligvis se en advarsel, der NULL værdier blev elimineret i resultatsættet.

Her er et eksempel på, hvad 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.

Alt dette fortæller os er, at kolonnen indeholdt mindst én NULL værdi, og at den blev ignoreret ved beregning af resultaterne.

Data-/tidsdata

Du kan bruge MIN() på dato/tidsværdier.

Antag, at vi har følgende tabel:

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 bruge MIN() for at finde minimumsfødselsdatoen (DOB ).

SELECT MIN(DOB) AS MinDOB
FROM Pets;

Resultat:

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

Igen ignorerer den NULL værdier.

Tegndata

Når det bruges sammen med tegndatakolonner, MIN() finder den værdi, der er lavest i sorteringssekvensen.

Eksempel:

SELECT MIN(ProductName) AS MinimumProductName
FROM Products;

Resultat:

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

DISTINCT Søgeord

Dit DBMS tillader muligvis DISTINCT nøgleord, der skal bruges sammen med MIN() fungere. Hvis det er tilfældet, er dette sandsynligvis for at overholde ISO SQL-standarden.

Derfor kan du muligvis gøre dette:

SELECT MIN(DISTINCT ProductPrice) AS MinimumPrice
FROM Products;

Resultat:

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

Men det vil ikke have nogen indflydelse på resultaterne.

DISTINCT Nøgleord kan være meget nyttigt, når det bruges sammen med andre sammenhænge (f.eks. med COUNT() funktion), men den har ingen betydning, når den bruges sammen med MIN() . DISTINCT søgeord fjerner dubletter, men i tilfælde af MIN() det vil ikke gøre nogen forskel, fordi MIN() returnerer det samme resultat, uanset hvor mange rækker der deler den samme minimumsværdi.

Vinduefunktioner

Afhængigt af dit DBMS, kan du muligvis bruge en OVER klausul med din MIN() funktion for at oprette en vinduesfunktion.

En vinduesfunktion udfører en aggregatlignende operation på et sæt forespørgselsrækker. Det producerer et resultat for hver forespørgselsrække. Dette er i modsætning til en aggregeret operation, som grupperer forespørgselsrækker i en enkelt resultatrække.

Her er et eksempel for at demonstrere konceptet.

Vi har allerede set Products bord. Vores database har også en Customers tabel, og den indeholder følgende 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 hente data fra disse tabeller og præsentere dem som ét resultatsæt ved at bruge en join.

Vi kan også bruge MIN() funktion med OVER klausul for at anvende en vinduesfunktion til dataene.

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 dette tilfælde brugte vi OVER klausul med vores MIN() funktion til at opdele resultatet efter leverandørnavn.

Ved at gøre dette var vi i stand til at returnere prisoplysninger for hvert produkt, såvel som minimumsprisen for alle produkter fra den pågældende leverandør. Denne minimumspris ændres, efterhånden som leverandøren ændres (medmindre flere leverandører tilfældigvis har den samme minimumspris), men forbliver den samme for alle produkter fra samme leverandør.

Dette koncept kan også anvendes på andre aggregerede funktioner i SQL, såsom SUM() , AVG() , MAX() , og COUNT() .


  1. Sådan udtrækkes ugenummer i sql

  2. Automatisering af den tabelformede modelbehandling af SSAS-databaser i SQL Server

  3. Kan ikke opdatere række i Sqlite i Android, men giver ingen fejl

  4. SQLite INSERT - PÅ DUBLIKAT NØGLEOPDATERING (UPSERT)