Funkce serveru SQL
V databázových systémech obecně a na SQL Serveru konkrétně jsou funkce kusy kódu, které berou nula nebo jeden vstup a vracejí jeden výstup nebo pole.
Funkce s hodnotou tabulky, které jsou obvykle definované uživatelem, mohou vrátit pole, ale vestavěné funkce serveru SQL Server jsou obvykle funkce s hodnotou skalární. Třetí třídou funkcí v SQL Server jsou agregované funkce. Funkce MIN a MAX SQL Server jsou agregované funkce.
Funkce okna jsou relativně novou třídou. Provádějí výpočty jako agregační funkce, ale provádějí to přes sadu řádků souvisejících s aktuálním řádkem. Zatímco agregační funkce pravděpodobně poskytne jeden výsledek při práci na sloupci, funkce okna s větší pravděpodobností poskytne výsledek pro každý řádek.
Klasifikace funkcí serveru SQL může také vycházet z datového typu – funkce řetězců, číselné funkce a funkce data. Můžeme odvodit, že funkce řetězce pracují s hodnotami řetězce, např. LENGTH().
MIN A MAX
Funkce MIN a MAX jsou velmi jednoduché agregační funkce. Přesto mohou odpovědět na širokou škálu otázek v závislosti na souboru dat, se kterým se zabýváme.
Když například zadáme příkaz SELECT, položíme SQL Serveru otázku . Proto říkáme, že provádíme dotaz . Chcete-li se serveru SQL Server zeptat na minimální a maximální hodnoty ve sloupci, používáme následující syntaxi:
SELECT MIN(column_name) FROM table_name;
SELECT MAX(column_name) FROM table_name;
Když použijeme tuto syntaxi, SQL Server vrátí jednu hodnotu. Můžeme tedy uvažovat funkce MIN() a MAX() Skalárně hodnotné funkce.
Výpis 1 zobrazuje jednoduchý výpis pro odvození minimální a maximální hodnoty hmotnosti nákladu z Sales.Orders tabulka TSQLV4 Itzika Bengana databáze:
-- Listing 1: Basic MIN() and MAX() Function Queries
USE TSQLV4
GO
SELECT * FROM [Sales].[Orders];
-- Without Column Aliases
SELECT MIN(freight) FROM [Sales].[Orders];
SELECT MAX(freight) FROM [Sales].[Orders];
-- Without Column Aliases
SELECT MIN(freight) min_freight FROM [Sales].[Orders];
SELECT MAX(freight) max_freight FROM [Sales].[Orders];
GROUP BY
„Jaké jsou minimální a maximální hmotnosti nákladu v jednotlivých zemích?“ K zodpovězení této otázky potřebujeme GROUP BY doložka. Příklad je ve výpisu 2 níže.
Dotaz nejprve seskupuje data podle země odeslání, a poté vrátí minimální a maximální hmotnosti nákladu pro každou zemi. Můžeme to potvrdit zadáním posledního dotazu ve výpisu (validace).
-- Listing 2: MIN and MAX Freight By Country
-- Minimum by Country
SELECT shipcountry, MIN(freight) min_freight FROM [Sales].[Orders]
GROUP BY shipcountry;
-- Maximum by Country
SELECT shipcountry, MAX(freight) max_freight FROM [Sales].[Orders]
GROUP BY shipcountry;
-- Validation
SELECT * FROM [Sales].[Orders] WHERE shipcountry='Finland'
ORDER BY freight;
-- Listing 2: MIN and MAX Freight by Country
-- Minimum by Customer
SELECT custid, MIN(freight) min_freight FROM [Sales].[Orders]
GROUP BY custid;
-- Maximum by Customer
SELECT custid, MAX(freight) max_freight FROM [Sales].[Orders]
GROUP BY custid;
-- Validation
SELECT * FROM [Sales].[Orders] WHERE custid='23'
ORDER BY freight;
Obrázek 3 ukazuje výsledky. Něco podobného můžeme udělat s dalším sloupcem – custid sloupec. V tomto případě odpovídáme na otázku „Jaké je minimální a maximální zděšení pro každého zákazníka?“
Další otázky
Údaje můžeme dále zkoumat, abychom zjistili, které země mají hmotnost nákladu menší než 1 nebo větší než 800. To provedeme pomocí MÁT klauzule, která filtruje sady výsledků segmentované do skupin podle GROUP BY doložka.
-- Listing 3: Introducing the HAVING Clause
SELECT shipcountry, MIN(freight) min_freight FROM [Sales].[Orders]
GROUP BY shipcountry
HAVING MIN(freight)<1;
SELECT shipcountry, MAX(freight) max_freight FROM [Sales].[Orders]
GROUP BY shipcountry
HAVING MAX(freight)>800;
Práce s daty
Při použití funkcí MIN() a MAX() na data očekáváme, že uvidíme nejstarší a nejnovější data resp. Podívejte se na příklady – data jsou interně na SQL Serveru uložena jako celá čísla.
-- Listing 4: Working with Dates
SELECT MIN(orderdate) earliest_date FROM [Sales].[Orders];
SELECT MAX(orderdate) latest_date FROM [Sales].[Orders];
Můžeme jít hlouběji, když se zeptáme, který zákazník provedl první objednávku a který poslední. K tomu používáme kód ve výpisu 5. Obrázek 6 ukazuje, že custid 85 zákazníků provedlo nejdříve objednávku, zatímco custid 9 zákazníků zadalo poslední objednávku.
-- Listing 5: Customer Order Dates
SELECT custid, MIN(orderdate) earliest_date FROM [Sales].[Orders]
GROUP BY custid
ORDER BY earliest_date;
SELECT custid, MAX(orderdate) latest_date FROM [Sales].[Orders]
GROUP BY custid
ORDER BY latest_date desc;
Závěr
V tomto článku jsme stručně demonstrovali použití agregačních funkcí MIN() a MAX() na serveru SQL Server. Úlohou těchto funkcí je vracet minimální a maximální hodnoty pro daný rozsah uložené ve sloupci tabulky.
Pomocí těchto funkcí můžeme odpovědět na další otázky tím, že je zkombinujeme s dalšími příkazy T-SQL, jako jsou klauzule GROUP BY, ORDER BY a HAVING.
Spousta nástrojů zjednodušuje a urychluje takové plnění úkolů a můžete si vybrat jakékoli řešení, které vyhovuje vašim požadavkům. Mezi nimi SQL Complete od Devart provádí všechny potřebné manipulace a poskytuje přímou funkci SSMS Grid Aggregate, která vypočítává MIN, MAX a AVG vybraných hodnot v mřížce.