Database
 sql >> Baza danych >  >> RDS >> Database

SQL MAX() dla początkujących

W SQL MAX() function to funkcja agregująca, która zwraca maksymalną wartość w danym wyrażeniu.

Poniżej znajduje się kilka podstawowych przykładów pokazujących, jak to działa.

Przykładowa tabela

Załóżmy, że mamy następującą tabelę:

SELECT * FROM Products;

Wynik:

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

Przykład

Możemy użyć następującego zapytania, aby uzyskać maksymalną cenę z tej tabeli.

SELECT MAX(ProductPrice)
FROM Products;

Wynik:

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

W takim przypadku informacje o cenie są przechowywane w ProductPrice kolumna, więc przekazujemy to jako argument do MAX() funkcja, która następnie oblicza i zwraca wynik.

Korzystanie z aliasów kolumn

Zauważysz, że poprzednie wyniki nie zawierają nazwy kolumny. Niektóre DBMS mogą używać czegoś takiego jak MAX(ProductPrice) jako nazwę kolumny. Należy się tego spodziewać, ponieważ MAX() funkcja nie zwraca żadnych kolumn. Możesz łatwo podać nazwę kolumny, przypisując alias.

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Wynik:

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

Przefiltrowane wyniki

MAX() funkcja działa na wierszach zwróconych przez zapytanie. Więc jeśli filtrujesz wyniki, wynik MAX() odzwierciedli to.

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

Wynik:

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

W tym przypadku 25,99 to maksymalna cena spośród wszystkich produktów oferowanych przez określonego dostawcę.

NULL Wartości

MAX() funkcja ignoruje każdy NULL wartości. W naszej przykładowej tabeli powyżej numer produktu 6 ma NULL w swojej ProductPrice kolumna, ale zostało to zignorowane w naszej MAX() przykład.

W zależności od systemu DBMS i ustawień możesz, ale nie musisz, zobaczyć ostrzeżenie, że NULL wartości zostały wyeliminowane w zestawie wyników.

Oto przykład tego, co możesz zobaczyć:

SELECT MAX(ProductPrice) AS MaximumPrice
FROM Products;

Wynik:

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

Wszystko to mówi nam, że kolumna zawierała co najmniej jeden NULL wartość i że została zignorowana podczas obliczania wyników.

Dane dotyczące daty/godziny

Możesz użyć MAX() o wartościach daty/czasu.

Załóżmy, że mamy następującą tabelę:

SELECT PetName, DOB 
FROM Pets;

Wynik:

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

Możemy użyć MAX() aby znaleźć maksymalną datę urodzenia (DOB ).

SELECT MAX(DOB) AS MaxDOB
FROM Pets;

Wynik:

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

Byłaby to data urodzenia najmłodszego zwierzaka. Jak wspomniano, ignoruje każdy NULL wartości.

Dane postaci

W przypadku użycia z kolumnami danych znakowych MAX() znajduje najwyższą wartość w kolejności zestawiania.

Przykład:

SELECT MAX(ProductName) AS MaximumProductName
FROM Products;

Wynik:

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

DISTINCT Słowo kluczowe

Twój DBMS może zezwalać na DISTINCT słowo kluczowe do użycia z MAX() funkcjonować. Jeśli tak, prawdopodobnie jest to zgodne ze standardem ISO SQL.

Dlatego możesz to zrobić:

SELECT MAX(DISTINCT ProductPrice) AS MaximumPrice
FROM Products;

Wynik:

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

Ale nie będzie to miało wpływu na wyniki.

DISTINCT słowo kluczowe może być bardzo przydatne w innych kontekstach (np. z COUNT() funkcja), ale nie ma znaczenia, gdy jest używany z MAX() . DISTINCT słowo kluczowe usuwa duplikaty, ale w przypadku MAX() nie zrobi to żadnej różnicy, ponieważ MAX() zwraca ten sam wynik, niezależnie od tego, ile wierszy ma tę samą maksymalną wartość.

Funkcje okien

W zależności od systemu DBMS możesz użyć OVER klauzula z Twoją MAX() funkcji, aby utworzyć funkcję okna.

Funkcja okna wykonuje operację podobną do agregacji na zestawie wierszy zapytania. Daje wynik dla każdego wiersza zapytania. Jest to przeciwieństwo operacji agregującej, która grupuje wiersze zapytań w jeden wiersz wyników.

Oto przykład demonstrujący tę koncepcję.

Widzieliśmy już Products stół. Nasza baza danych zawiera również Customers tabeli i zawiera następujące dane:

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

Możemy pobrać dane z tych tabel i przedstawić je jako jeden zestaw wyników za pomocą złączenia.

Możemy również użyć MAX() funkcja z OVER klauzula, aby zastosować funkcję okna do danych.

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

Wynik:

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

W tym przypadku użyliśmy OVER klauzula z naszą MAX() funkcja podziału wyniku według nazwy dostawcy.

Dzięki temu byliśmy w stanie zwrócić informacje o cenie każdego produktu, a także maksymalną cenę wszystkich produktów od danego dostawcy. Ta maksymalna cena zmienia się wraz ze zmianą dostawcy (chyba że wielu dostawców ma tę samą cenę maksymalną), ale pozostaje taka sama dla wszystkich produktów od tego samego dostawcy.

Ta koncepcja może być również zastosowana do innych funkcji agregujących w SQL, takich jak SUM() , MIN() , AVG() i 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. Zrozumienie sortowania na poziomie bazy danych i wpływu jego zmiany na bazę danych

  2. Zapal się z Apache Spark – część 1

  3. Podłączanie 32-bitowej aplikacji do jBASE

  4. Statystyka szarpnięcia kolanem :CXPACKET

  5. Jak znaleźć średnią kolumny numerycznej w SQL?