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

SQL MAX() for begyndere

I SQL er MAX() funktion er en aggregeret funktion, der returnerer den maksimale værdi 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

Vi kan bruge følgende forespørgsel til at få den maksimale pris fra den tabel.

SELECT MAX(ProductPrice)
FROM Products;

Resultat:

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

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

Brug af kolonnealiaser

Du vil bemærke, at de tidligere resultater ikke indeholder et kolonnenavn. Nogle DBMS'er kan bruge noget som MAX(ProductPrice) som kolonnenavn. Dette kan forventes, fordi MAX() funktion returnerer ikke nogen kolonner. Du kan nemt angive et kolonnenavn ved at tildele et alias.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultat:

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

Filtrerede resultater

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

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

Resultat:

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

I dette tilfælde er 25,99 den maksimale pris for alle de produkter, der tilbydes af den angivne leverandør.

NULL Værdier

MAX() 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 MAX() 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 MAX(ProductPrice) AS MaximumPrice
FROM Products;

Resultat:

+----------------+
| MaximumPrice   |
|----------------|
| 245.00         |
+----------------+
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 MAX() 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 MAX() for at finde den maksimale fødselsdato (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Resultat:

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

Dette ville være fødselsdatoen for det yngste kæledyr. Som nævnt ignorerer den enhver NULL værdier.

Tegndata

Når det bruges sammen med tegndatakolonner, MAX() finder den værdi, der er højest i sorteringssekvensen.

Eksempel:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Resultat:

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

DISTINCT Søgeord

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

Derfor kan du muligvis gøre dette:

SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Resultat:

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

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 MAX() . DISTINCT søgeord fjerner dubletter, men i tilfælde af MAX() det vil ikke gøre nogen forskel, fordi MAX() returnerer det samme resultat, uanset hvor mange rækker der deler den samme maksimale værdi.

Vinduefunktioner

Afhængigt af dit DBMS, kan du muligvis bruge en OVER klausul med din MAX() 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 MAX() funktion med OVER klausul for at anvende en vinduesfunktion til dataene.

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

Resultat:

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

I dette tilfælde brugte vi OVER klausul med vores MAX() 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 maksimumprisen for alle produkter fra den pågældende leverandør. Denne maksimale pris ændres, efterhånden som leverandøren ændres (medmindre flere leverandører tilfældigvis har den samme maksimumpris), men forbliver den samme for alle produkter fra den samme leverandør.

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


  1. Sådan udtrækkes en understreng fra en streng i Oracle/SQLite

  2. Top 30 SQL Query-interviewspørgsmål, du skal praktisere i 2022

  3. dbms_lob.getlength() vs. length() for at finde klatstørrelse i oracle

  4. Bruger AT TIME ZONE til at rette en gammel rapport