Ms sql agregační funkce pro řádky. Aggregační funkce SQL - SUM, MIN, MAX, AVG, COUNT

Následující pododdíly popisují další klauzule příkazu SELECT, které lze použít v dotazech, a také agregační funkce a sady příkazů. Pro připomenutí, v tomto bodě jsme se podívali na použití klauzule WHERE a v tomto článku se podíváme na klauzule GROUP BY, ORDER BY a HAVING a uvedeme některé příklady použití těchto klauzulí v kombinaci s agregací funkce, které jsou podporovány v Transact-SQL.

klauzule GROUP BY

Nabídka GROUP BY seskupuje vybranou sadu řádků za účelem vytvoření sady souhrnných řádků podle hodnot jednoho nebo více sloupců nebo výrazů. Jednoduchý případ použití klauzule GROUP BY je znázorněn v příkladu níže:

POUŽÍVEJTE SampleDb; SELECT Job FROM Works_On GROUP BY Job;

Tento příklad vybírá a seskupuje pozice zaměstnanců.

Ve výše uvedeném příkladu klauzule GROUP BY vytvoří samostatnou skupinu pro všechny možné hodnoty (včetně hodnoty NULL) pro sloupec Job.

Použití sloupců v klauzuli GROUP BY musí splňovat určité podmínky. Konkrétně se každý sloupec ve výběrovém seznamu dotazu musí objevit také v klauzuli GROUP BY. Tento požadavek se nevztahuje na konstanty a sloupce, které jsou součástí agregační funkce. (Agregační funkce jsou popsány v další podkapitole.) To dává smysl, protože Pouze u sloupců v klauzuli GROUP BY je zaručeno, že budou mít jednu hodnotu na skupinu.

Tabulku můžete seskupit podle libovolné kombinace jejích sloupců. Níže uvedený příklad ukazuje seskupení řádků tabulky Works_on do dvou sloupců:

POUŽÍVEJTE SampleDb; SELECT ProjectNumber, Job FROM Works_On GROUP BY ProjectNumber, Job;

Výsledek tohoto dotazu:

Na základě výsledků dotazu můžete vidět, že existuje devět skupin s různými kombinacemi čísla projektu a pozice. Posloupnost názvů sloupců v klauzuli GROUP BY nemusí být stejná jako v seznamu sloupců v SELECTu.

Agregační funkce

Agregační funkce se používají k získání celkových hodnot. Všechny agregační funkce lze rozdělit do následujících kategorií:

    běžné agregační funkce;

    statistické agregační funkce;

    uživatelsky definované agregační funkce;

    analytické agregační funkce.

Zde se podíváme na první tři typy agregačních funkcí.

Společné agregační funkce

Transact-SQL podporuje následujících šest agregačních funkcí: MIN, MAX, SOUČET, AVG, POČÍTAT, COUNT_BIG.

Všechny agregační funkce provádějí výpočty s jedním argumentem, kterým může být sloupec nebo výraz. (Jedinou výjimkou je druhý tvar dvou funkcí: COUNT a COUNT_BIG, konkrétně COUNT(*) a COUNT_BIG(*). Výsledkem výpočtu jakékoli agregační funkce je konstantní hodnota zobrazená v samostatném sloupci výsledků.

Agregační funkce jsou specifikovány v seznamu sloupců příkazu SELECT, který může také obsahovat klauzuli GROUP BY. Pokud v příkazu SELECT není klauzule GROUP BY a seznam vybraných sloupců obsahuje alespoň jednu agregační funkci, pak nesmí obsahovat jednoduché sloupce (kromě sloupců, které slouží jako argumenty agregační funkce). Proto je kód v níže uvedeném příkladu nesprávný:

POUŽÍVEJTE SampleDb; SELECT Příjmení, MIN(Id) FROM Zaměstnanec;

Zde by sloupec Příjmení v tabulce Zaměstnanec neměl být v seznamu pro výběr sloupců, protože to není argument agregační funkce. Na druhé straně může seznam pro výběr sloupců obsahovat názvy sloupců, které nejsou argumenty agregační funkce, pokud jsou tyto sloupce argumenty klauzule GROUP BY.

Argumentu agregační funkce může předcházet jedno ze dvou možných klíčových slov:

VŠE

Určuje, že výpočty se provádějí se všemi hodnotami ve sloupci. Toto je výchozí hodnota.

ODLIŠNÝ

Určuje, že pro výpočty se používají pouze jedinečné hodnoty sloupců.

Agregační funkce MIN a MAX

Agregační funkce MIN a MAX vypočítají nejmenší a největší hodnotu sloupce. Pokud dotaz obsahuje klauzuli WHERE, funkce MIN a MAX vrátí nejmenší a největší hodnoty řádků, které odpovídají zadaným podmínkám. Níže uvedený příklad ukazuje použití agregační funkce MIN:

POUŽÍVEJTE SampleDb; -- Vraťte 2581 SELECT MIN(Id) AS "Minimální hodnota ID" FROM Zaměstnanec;

Výsledek vrácený ve výše uvedeném příkladu není příliš informativní. Například není známo příjmení zaměstnance, který toto číslo vlastní. Toto příjmení však není možné získat obvyklým způsobem, protože, jak již bylo zmíněno, není povoleno explicitně zadat sloupec Příjmení. Aby bylo možné získat i příjmení tohoto zaměstnance spolu s nejnižším osobním číslem zaměstnance, je použit poddotaz. Níže uvedený příklad ukazuje použití takového poddotazu, kde poddotaz obsahuje příkaz SELECT z předchozího příkladu:

Výsledek požadavku:

Použití agregační funkce MAX je znázorněno v příkladu níže:

Funkce MIN a MAX mohou také přijímat řetězce a data jako argumenty. V případě řetězcového argumentu se hodnoty porovnávají pomocí skutečného pořadí řazení. U všech argumentů časových dat typu "date" je nejmenší hodnotou sloupce nejstarší datum a hodnota největšího sloupce je nejnovější.

Klíčové slovo DISTINCT můžete použít s funkcemi MIN a MAX. Před použitím agregačních funkcí MIN a MAX jsou všechny hodnoty NULL odstraněny ze sloupců argumentů.

Agregační funkce SUM

Agregát Funkce SUM vypočítá celkový součet hodnot sloupce. Argumentem této agregační funkce musí být vždy číselný datový typ. Použití agregační funkce SUM je znázorněno v příkladu níže:

POUŽÍVEJTE SampleDb; SELECT SUM (Rozpočet) "Celkový rozpočet" FROM Project;

Tento příklad vypočítá celkovou částku rozpočtů pro všechny projekty. Výsledek požadavku:

V tomto příkladu agregační funkce seskupuje všechny hodnoty rozpočtu projektu a určuje jejich celkovou částku. Z tohoto důvodu dotaz obsahuje implicitní seskupovací funkci (stejně jako všechny podobné dotazy). Implicitní seskupovací funkce z výše uvedeného příkladu může být specifikována explicitně, jak ukazuje příklad níže:

POUŽÍVEJTE SampleDb; SELECT SUM (Rozpočet) "Celkový rozpočet" FROM Project GROUP BY();

Použití parametru DISTINCT odstraní všechny duplicitní hodnoty ve sloupci před použitím funkce SUM. Podobně jsou před použitím této agregační funkce odstraněny všechny hodnoty NULL.

Agregační funkce AVG

Agregát Funkce AVG vrátí aritmetický průměr všech hodnot ve sloupci. Argumentem této agregační funkce musí být vždy číselný datový typ. Před použitím funkce AVG jsou z jejího argumentu odstraněny všechny hodnoty NULL.

Použití agregační funkce AVG je znázorněno v příkladu níže:

POUŽÍVEJTE SampleDb; -- Návrat 133833 SELECT AVG (Rozpočet) "Průměrný rozpočet pro projekt" FROM Project;

Zde se vypočítá aritmetický průměr hodnoty rozpočtu pro všechny rozpočty.

Souhrnné funkce COUNT a COUNT_BIG

Agregát Funkce COUNT má dvě různé podoby:

COUNT(název_sloupce) COUNT(*)

První forma funkce počítá počet hodnot ve sloupci col_name. Pokud dotaz používá klíčové slovo DISTINCT, budou před použitím funkce COUNT odstraněny všechny duplicitní hodnoty ve sloupci. Tato forma funkce COUNT nebere v úvahu hodnoty NULL při počítání počtu hodnot ve sloupci.

Použití první formy agregační funkce COUNT je znázorněno v příkladu níže:

POUŽÍVEJTE SampleDb; SELECT ProjectNumber, COUNT(DISTINCT Job) "Práce v projektu" FROM Works_on GROUP BY ProjectNumber;

Zde se počítá počet různých pozic pro každý projekt. Výsledek tohoto dotazu:

Jak můžete vidět z příkladu dotazu, funkce COUNT nezohlednila hodnoty NULL. (Součet všech hodnot ve sloupci pozice se ukázal být 7, nikoli 11, jak by měl být.)

Druhá forma funkce COUNT, tzn. Funkce COUNT(*) počítá počet řádků v tabulce. A pokud příkaz SELECT dotazu s funkcí COUNT(*) obsahuje klauzuli WHERE s podmínkou, vrátí funkce počet řádků, které splňují zadanou podmínku. Na rozdíl od první verze funkce COUNT druhý formulář neignoruje hodnoty NULL, protože tato funkce pracuje s řádky, nikoli se sloupci. Níže uvedený příklad ukazuje použití funkce COUNT(*):

POUŽÍVEJTE SampleDb; SELECT Job AS "Typ práce", COUNT(*) "Potřebuji pracovníky" FROM Works_on GROUP BY Job;

Zde se počítá počet pozic ve všech projektech. Výsledek požadavku:

Funkce COUNT_BIG podobně jako funkce COUNT. Jediný rozdíl mezi nimi je typ výsledku, který vracejí: funkce COUNT_BIG vždy vrací hodnoty typu BIGINT, zatímco funkce COUNT vrací datové hodnoty typu INTEGER.

Statistické agregační funkce

Následující funkce tvoří skupinu statistických agregačních funkcí:

VAR

Vypočítá statistický rozptyl všech hodnot reprezentovaných ve sloupci nebo výrazu.

VARP

Vypočítá statistický rozptyl populace všech hodnot reprezentovaných ve sloupci nebo výrazu.

STDEV

Vypočítá směrodatnou odchylku (která se vypočítá jako druhá odmocnina odpovídajícího rozptylu) všech hodnot ve sloupci nebo výrazu.

SMODCH

Vypočítá směrodatnou odchylku základního souboru všech hodnot ve sloupci nebo výrazu.

Uživatelsky definované agregační funkce

Database Engine také podporuje implementaci uživatelsky definovaných funkcí. Tato schopnost umožňuje uživatelům rozšířit systémové agregační funkce o funkce, které mohou implementovat a nainstalovat sami. Tyto funkce představují speciální třídu uživatelsky definovaných funkcí a budou podrobně popsány později.

MÁME nabídku

Ve větě MÍT definuje podmínku, která platí pro skupinu řádků. Tato klauzule má tedy pro skupiny řádků stejný význam jako klauzule WHERE pro obsah odpovídající tabulky. Syntaxe klauzule HAVING je:

MÍT podmínku

Parametr podmínky zde představuje podmínku a obsahuje agregační funkce nebo konstanty.

Použití klauzule HAVING ve spojení s agregační funkcí COUNT(*) je ilustrováno v příkladu níže:

POUŽÍVEJTE SampleDb; -- Vrátí "p3" SELECT ProjectNumber FROM Works_on GROUP BY ProjectNumber HAVING COUNT(*)

V tomto příkladu systém seskupí všechny řádky podle hodnot sloupce ProjectNumber pomocí klauzule GROUP BY. Poté se spočítá počet řádků v každé skupině a vyberou se skupiny obsahující méně než čtyři řádky (tři nebo méně).

Klauzuli HAVING lze také použít bez agregačních funkcí, jak ukazuje příklad níže:

POUŽÍVEJTE SampleDb; -- Vrátí "Consultant" SELECT Job FROM Works_on GROUP BY Job HAVING Job LIKE "K%";

Tento příklad seskupuje řádky tabulky Works_on podle názvu úlohy a eliminuje ty úlohy, které nezačínají písmenem "K".

Klauzuli HAVING lze použít i bez klauzule GROUP BY, i když to není běžná praxe. V tomto případě jsou všechny řádky tabulky vráceny v jedné skupině.

doložka ORDER BY

Nabídka OBJEDNAT PODLE určuje pořadí řazení řádků v sadě výsledků vrácených dotazem. Tato věta má následující syntaxi:

Pořadí řazení je specifikováno v parametru col_name. Parametr col_number je alternativní indikátor pořadí řazení, který identifikuje sloupce podle pořadí, ve kterém se objevují ve výběrovém seznamu příkazu SELECT (1 je první sloupec, 2 je druhý sloupec atd.). Parametr ASC určuje řazení ve vzestupném pořadí a Parametr DESC- směrem dolů. Výchozí hodnota je ASC.

Názvy sloupců v klauzuli ORDER BY nemusí být v seznamu vybraných sloupců. To se ale netýká dotazů jako SELECT DISTINCT, protože v takových dotazech musí být názvy sloupců uvedené v klauzuli ORDER BY uvedeny také v seznamu vybraných sloupců. Kromě toho tato klauzule nemůže obsahovat názvy sloupců z tabulek, které nejsou uvedeny v klauzuli FROM.

Jak můžete vidět ze syntaxe klauzule ORDER BY, sadu výsledků lze třídit podle více sloupců. Toto řazení je znázorněno na příkladu níže:

V tomto příkladu jsou čísla oddělení a jména zaměstnanců vybrána pro zaměstnance, jejichž osobní číslo je menší než 20 000, a seřazena podle příjmení a jména. Výsledek tohoto dotazu:

Sloupce v klauzuli ORDER BY mohou být specifikovány nikoli svými názvy, ale jejich pořadím ve výběrovém seznamu. Větu ve výše uvedeném příkladu lze tedy přepsat takto:

Tato alternativní metoda určení sloupců podle pozice namísto podle názvu se používá, pokud kritérium řazení obsahuje agregační funkci. (Dalším způsobem je použití názvů sloupců, které se pak objeví v klauzuli ORDER BY.) V klauzuli ORDER BY se však doporučuje specifikovat sloupce jejich názvy, nikoli čísly, aby bylo snazší aktualizovat dotaz pokud je třeba přidat nebo odebrat sloupce z výběrového seznamu. Určení sloupců v klauzuli ORDER BY jejich čísly je znázorněno v příkladu níže:

POUŽÍVEJTE SampleDb; SELECT ProjectNumber, COUNT(*) "Počet zaměstnanců" FROM Works_on GROUP BY ProjectNumber ORDER BY 2 DESC;

Zde se pro každý projekt vybere číslo projektu a počet zaměstnanců, kteří se na něm podílejí, přičemž výsledek seřadí sestupně podle počtu zaměstnanců.

Transact-SQL umisťuje hodnoty NULL na začátek seznamu při seřazení ve vzestupném pořadí a na konec seznamu při řazení v sestupném pořadí.

Použití klauzule ORDER BY k stránkování výsledků

Zobrazení výsledků dotazu na aktuální stránce lze implementovat buď v uživatelské aplikaci, nebo k tomu můžete dát pokyn databázovému serveru. V prvním případě jsou všechny řádky databáze odeslány do aplikace, jejímž úkolem je vybrat požadované řádky a zobrazit je. Ve druhém případě jsou na straně serveru vybrány a zobrazeny pouze řádky požadované pro aktuální stránku. Jak můžete očekávat, vytváření stránek na straně serveru obvykle poskytuje lepší výkon, protože... Klientovi jsou odeslány pouze řádky potřebné pro zobrazení.

Pro podporu vytváření stránek na straně serveru SQL Server 2012 zavádí dvě nové klauzule SELECT: OFFSET a FETCH. Použití těchto dvou vět je demonstrováno na příkladu níže. Zde se z databáze AdventureWorks2012 (kterou najdete ve zdroji) získávají obchodní ID, pracovní pozice a narozeniny všech zaměstnankyň a výsledek seřadí vzestupně podle pracovní pozice. Výsledná sada řádků se rozdělí na 10řádkové stránky a zobrazí se třetí stránka:

Ve větě OFFSET určuje počet řádků výsledku, které se mají v zobrazeném výsledku přeskočit. Toto číslo se vypočítá po seřazení řádků pomocí klauzule ORDER BY. Ve větě NAČÍST DALŠÍ určuje počet řádků, které splňují podmínku WHERE a jsou seřazeny, aby byly vráceny. Parametrem této klauzule může být konstanta, výraz nebo výsledek jiného dotazu. Klauzule FETCH NEXT je podobná klauzuli NEJDŘÍVE PŘINÁŠEJTE.

Hlavním cílem při vytváření stránek na straně serveru je umět implementovat běžné formuláře stránek pomocí proměnných. Tento úkol lze provést pomocí balíčku SQL Server.

SELECT příkaz a vlastnost IDENTITY

vlastnost IDENTITY umožňuje definovat hodnoty pro konkrétní sloupec tabulky ve formě automaticky rostoucího počítadla. Tuto vlastnost mohou mít číselné sloupce datových typů, jako jsou TINYINT, SMALLINT, INT a BIGINT. Pro takový sloupec tabulky Database Engine automaticky vytvoří sekvenční hodnoty počínaje zadanou počáteční hodnotou. Vlastnost IDENTITY lze tedy použít k vytvoření jednociferných číselných hodnot pro vybraný sloupec.

Tabulka může obsahovat pouze jeden sloupec s vlastností IDENTITY. Vlastník tabulky má možnost zadat počáteční hodnotu a přírůstek, jak ukazuje příklad níže:

POUŽÍVEJTE SampleDb; CREATE TABLE Product (Id INT IDENTITY(10000, 1) NOT NULL, Name NVARCHAR(30) NOT NULL, Price MONEY) INSERT INTO Product(Name, Price) VALUES ("Product1", 10), ("Product2", 15) , ("Produkt 3", 8), ("Produkt4", 15), ("Produkt5", 40); -- Vrátí 10004 SELECT IDENTITYCOL FROM Product WHERE Name = "Product5"; -- Podobně jako u předchozího příkazu SELECT $identity FROM Product WHERE Name = "Product5";

Tento příklad nejprve vytvoří tabulku produktu, která obsahuje sloupec ID s vlastností IDENTITY. Hodnoty ve sloupci Id jsou vytvářeny automaticky systémem, počínaje 10 000 a zvyšujícími se v jednotkových přírůstcích pro každou následující hodnotu: 10 000, 10 001, 10 002 atd.

S vlastností IDENTITY je spojeno několik systémových funkcí a proměnných. Například používá ukázkový kód $systémová proměnná identity. Jak můžete vidět z výstupu tohoto kódu, tato proměnná automaticky odkazuje na vlastnost IDENTITY. Místo toho můžete také použít systémovou funkci IDENTITYCOL.

Počáteční hodnotu a přírůstek sloupce s vlastností IDENTITY lze zjistit pomocí funkcí IDENT_SEED A IDENT_INCR respektive. Tyto funkce se používají následovně:

POUŽÍVEJTE SampleDb; SELECT IDENT_SEED("Produkt"), IDENT_INCR("Produkt")

Jak již bylo zmíněno, hodnoty IDENTITY nastavuje systém automaticky. Uživatel však může explicitně zadat své hodnoty pro určité řádky přiřazením parametru IDENTITY_INSERT Hodnota ON před vložením explicitní hodnoty:

SET IDENTITY INSERT název tabulky ON

Protože parametr IDENTITY_INSERT můžete použít k nastavení sloupce s vlastností IDENTITY na libovolnou hodnotu, včetně duplicitní hodnoty, vlastnost IDENTITY obecně nevynucuje jedinečnost hodnot sloupce. Chcete-li tedy vynutit jedinečnost hodnot sloupců, měli byste použít omezení UNIQUE nebo PRIMARY KEY.

Když vložíte hodnoty do tabulky po nastavení IDENTITY_INSERT na on, systém vytvoří další hodnotu sloupce IDENTITY zvýšením největší aktuální hodnoty tohoto sloupce.

příkaz CREATE SEQUENCE

Použití vlastnosti IDENTITY má několik významných nevýhod, z nichž nejvýznamnější jsou následující:

    použití vlastnosti je omezeno na uvedenou tabulku;

    novou hodnotu sloupce nelze získat jiným způsobem než jejím použitím;

    vlastnost IDENTITY lze zadat pouze při vytváření sloupce.

Z těchto důvodů SQL Server 2012 zavádí sekvence, které mají stejnou sémantiku jako vlastnost IDENTITY, ale bez výše uvedených nevýhod. V tomto kontextu je sekvence databázová funkce, která vám umožňuje zadat hodnoty čítačů pro různé databázové objekty, jako jsou sloupce a proměnné.

Sekvence se vytvářejí pomocí instrukcí VYTVOŘTE SEKVENCI. Příkaz CREATE SEQUENCE je definován ve standardu SQL a je podporován jinými systémy relačních databází, jako jsou IBM DB2 a Oracle.

Níže uvedený příklad ukazuje, jak vytvořit sekvenci v SQL Server:

POUŽÍVEJTE SampleDb; CREATE SEQUENCE dbo.Sequence1 AS INT ZAČÁTE O 1 PŘÍRŮST O 5 MINVALUE 1 MAXVALUE 256 CYCLE;

Ve výše uvedeném příkladu jsou hodnoty Sequence1 vytvořeny automaticky systémem, počínaje hodnotou 1 a zvyšující se 5 pro každou následující hodnotu. Tedy v Nabídka START je uvedena počáteční hodnota a v NAVÍCOVÁ nabídka- krok. (Krok může být kladný nebo záporný.)

V dalších dvou nepovinných větách MIN A MAX Je určena minimální a maximální hodnota objektu sekvence. (Všimněte si, že hodnota MINVALUE musí být menší nebo rovna počáteční hodnotě a hodnota MAXVALUE nemůže být větší než horní limit datového typu určeného pro sekvenci.) V klauzuli CYKLUS označuje, že sekvence se opakuje od začátku, když je překročena maximální (nebo minimum u sekvence se záporným krokem) hodnota. Ve výchozím nastavení je tato klauzule nastavena na NO CYCLE, což znamená, že překročení maximální nebo minimální hodnoty sekvence vyvolá výjimku.

Hlavním rysem sekvencí je jejich nezávislost na tabulkách, tzn. lze je použít s libovolnými databázovými objekty, jako jsou sloupce tabulky nebo proměnné. (Tato vlastnost má pozitivní vliv na úložiště a tím i výkon. Konkrétní sekvenci není nutné ukládat, ukládá se pouze její poslední hodnota.)

Nové sekvenční hodnoty se vytvářejí pomocí DALŠÍ HODNOTA PRO výrazy, jehož použití je uvedeno v příkladu níže:

POUŽÍVEJTE SampleDb; -- Return 1 SELECT NEXT VALUE FOR dbo.sequence1; -- Vrátí 6 (další krok) SELECT NEXT VALUE FOR dbo.sequence1;

Výraz NEXT VALUE FOR můžete použít k přiřazení výsledku sekvence k proměnné nebo buňce sloupce. Níže uvedený příklad ukazuje, jak použít tento výraz k přiřazení výsledků ke sloupci:

POUŽÍVEJTE SampleDb; CREATE TABLE Product (Id INT NOT NULL, Name NVARCHAR(30) NOT NULL, Price MONEY) INSERT INTO Product VALUES (NEXT VALUE FOR dbo.sequence1, "Product1", 10); INSERT INTO Product VALUES (NEXT VALUE FOR dbo.sequence1, "Product2", 15); --...

Ve výše uvedeném příkladu nejprve vytvoříme tabulku Produkt sestávající ze čtyř sloupců. Dále dva příkazy INSERT vloží dva řádky do této tabulky. První dvě buňky prvního sloupce budou mít hodnoty 11 a 16.

Níže uvedený příklad ukazuje použití zobrazení adresáře sys.sekvence pro zobrazení aktuální hodnoty sekvence bez jejího použití:

Příkaz NEXT VALUE FOR se obvykle používá v příkazu INSERT, aby systém vložil vygenerované hodnoty. Tento výraz lze také použít jako součást víceřádkového dotazu pomocí klauzule OVER.

Chcete-li změnit vlastnost existující sekvence, použijte příkaz ALTER SEQUENCE. Jedno z nejdůležitějších použití tohoto příkazu je s volbou RESTART WITH, která resetuje zadanou sekvenci. Níže uvedený příklad ukazuje použití ALTER SEQUENCE k resetování téměř všech vlastností Sequence1:

POUŽÍVEJTE SampleDb; ALTER SEQUENCE dbo.sequence1 RESTARTUJTE SE 100 PŘÍRŮSTKY O 50 MINVALUE 50 MAXVALUE 200 ŽÁDNÝ CYKLUS;

Vymazání sekvence pomocí instrukce DROP SEQUENCE.

Nastavte operátory

Kromě operátorů diskutovaných výše podporuje Transact-SQL další tři operátory sady: UNION, INTERSECT a EXCEPT.

operátor UNION

operátor UNION kombinuje výsledky dvou nebo více dotazů do jediné sady výsledků, která zahrnuje všechny řádky patřící všem dotazům v unii. Výsledkem spojení dvou tabulek je tedy nová tabulka obsahující všechny řádky obsažené v jedné z původních tabulek nebo v obou těchto tabulkách.

Obecná forma operátoru UNION vypadá takto:

select_1 UNION select_2 ( select_3])...

Parametry select_1, select_2, ... jsou příkazy SELECT, které vytvářejí spojení. Pokud je použita volba VŠECHNY, zobrazí se všechny řádky, včetně duplikátů. V operátoru UNION má parametr ALL stejný význam jako ve výběrovém seznamu SELECT, ale s jedním rozdílem: pro výběrový seznam SELECT se tento parametr používá standardně, ale pro operátor UNION musí být specifikován explicitně.

Databáze SampleDb ve své původní podobě není vhodná pro demonstraci použití operátoru UNION. Proto tato sekce vytvoří novou tabulku EmployeeEnh, která je identická se stávající tabulkou Zaměstnanci, ale má další sloupec Město. Tento sloupec uvádí místo bydliště zaměstnanců.

Vytvoření tabulky EmployeeEnh nám poskytuje dobrou příležitost prokázat použití klauzule DO v příkazu SELECT. Příkaz SELECT INTO provádí dvě operace. Nejprve se vytvoří nová tabulka se sloupci uvedenými v seznamu SELECT. Poté se řádky z původní tabulky vloží do nové tabulky. Název nové tabulky je uveden v klauzuli INTO a název zdrojové tabulky je uveden v klauzuli FROM.

Níže uvedený příklad ukazuje, jak vytvořit tabulku EmployeeEnh z tabulky Zaměstnanci:

POUŽÍVEJTE SampleDb; SELECT * INTO EmployeeEnh FROM Employee; ALTER TABLE EmployeeEnh ADD City NCHAR(40) NULL;

V tomto příkladu příkaz SELECT INTO vytvoří tabulku EmployeeEnh, vloží do ní všechny řádky ze zdrojové tabulky Employee a poté příkaz ALTER TABLE přidá sloupec City do nové tabulky. Přidaný sloupec Město však žádné hodnoty neobsahuje. Hodnoty v tomto sloupci lze vložit pomocí Management Studio nebo pomocí následujícího kódu:

POUŽÍVEJTE SampleDb; UPDATE EmployeeEnh SET City = "Kazan" WHERE Id = 2581; UPDATE EmployeeEnh SET City = "Moskva" WHERE Id = 9031; UPDATE EmployeeEnh SET Město = "Jekatěrinburg" WHERE Id = 10102; UPDATE EmployeeEnh SET City = "St. Petersburg" WHERE Id = 18316; UPDATE EmployeeEnh SET City = "Krasnodar" WHERE Id = 25348; UPDATE EmployeeEnh SET City = "Kazan" WHERE Id = 28559; UPDATE EmployeeEnh SET Město = "Perm" WHERE Id = 29346;

Nyní jsme připraveni předvést použití instrukce UNION. Níže uvedený příklad ukazuje dotaz na vytvoření spojení mezi tabulkami EmployeeEnh a Department pomocí tohoto příkazu:

POUŽÍVEJTE SampleDb; SELECT City AS "City" FROM EmployeeEnh UNION SELECT Location FROM Department;

Výsledek tohoto dotazu:

Pomocí příkazu UNION lze spojit pouze kompatibilní tabulky. Kompatibilními tabulkami rozumíme, že oba seznamy vybraných sloupců musí obsahovat stejný počet sloupců a odpovídající sloupce musí mít kompatibilní datové typy. (Pokud jde o kompatibilitu, datové typy INT a SMALLINT nejsou kompatibilní.)

Výsledek spojení lze seřadit pouze pomocí klauzule ORDER BY v posledním příkazu SELECT, jak je znázorněno v příkladu níže. Klauzule GROUP BY a HAVING lze použít s jednotlivými příkazy SELECT, ale ne v rámci samotného spojení.

Dotaz v tomto příkladu vybírá zaměstnance, kteří buď pracují v oddělení d1, nebo na projektu začali pracovat před 1. lednem 2008.

Operátor UNION podporuje parametr ALL. Použití této možnosti neodstraní duplikáty ze sady výsledků. Operátor OR můžete použít místo operátoru UNION, pokud všechny příkazy SELECT spojené jedním nebo více operátory UNION odkazují na stejnou tabulku. V tomto případě je sada příkazů SELECT nahrazena jedním příkazem SELECT se sadou operátorů OR.

Operátory INTERSECT a EXCEPT

Dva další operátoři pro práci se sadami, INTERSECT A KROMĚ, určit průsečík a rozdíl, resp. Pod průsečíkem je v tomto kontextu sada řádků, které patří do obou tabulek. A rozdíl mezi dvěma tabulkami je definován jako všechny hodnoty, které patří do první tabulky a nejsou přítomny ve druhé. Níže uvedený příklad ukazuje použití operátoru INTERSECT:

Transact-SQL nepodporuje použití parametru ALL s operátorem INTERSECT ani EXCEPT. Použití operátoru EXCEPT je znázorněno v příkladu níže:

Pamatujte, že tyto tři množinové operátory mají různé priority provádění: operátor INTERSECT má nejvyšší prioritu, následovaný operátorem EXCEPT a operátor UNION má nejnižší prioritu. Pokud nebudete věnovat pozornost prioritě provádění při použití více různých operátorů sady, může to vést k neočekávaným výsledkům.

CASE výrazy

Při programování databázových aplikací je někdy nutné upravit reprezentaci dat. Lidé mohou být například rozděleni kódováním podle jejich sociální třídy pomocí hodnot 1, 2 a 3, které označují muže, ženy a děti. Tato programovací technika může zkrátit čas potřebný k implementaci programu. výraz CASE Jazyk Transact-SQL usnadňuje implementaci tohoto typu kódování.

Na rozdíl od většiny programovacích jazyků CASE není příkaz, ale výraz. Proto lze výraz CASE použít téměř kdekoli, kde Transact-SQL umožňuje výrazy. Výraz CASE má dvě podoby:

    jednoduchý výraz CASE;

    hledaný výraz CASE.

Syntaxe jednoduchého výrazu CASE je:

Příkaz s jednoduchým výrazem CASE nejprve prohledá seznam všech výrazů v klauzule WHEN první výraz, který odpovídá výrazu_1, pak provede odpovídající PAK klauzule. Pokud v seznamu WHEN není žádný odpovídající výraz, klauzule ELSE.

Syntaxe vyhledávacího výrazu CASE je následující:

Tím se vyhledá první odpovídající podmínka a poté se provede odpovídající klauzule THEN. Pokud žádná z podmínek nesplňuje požadavky, je provedena klauzule ELSE. Použití vyhledávacího výrazu CASE je znázorněno v příkladu níže:

POUŽÍVEJTE SampleDb; SELECT ProjectName, CASE WHEN Budget > 0 AND Budget 100000 AND Budget 150000 AND Budget

Výsledek tohoto dotazu:

Tento příklad zváží rozpočty všech projektů a poté zobrazí jejich vypočítané váhy spolu s odpovídajícími názvy projektů.

Níže uvedený příklad ukazuje další způsob použití výrazu CASE, kde klauzule WHEN obsahuje poddotazy, které tvoří součást výrazu:

POUŽÍVEJTE SampleDb; SELECT ProjectName, CASE WHEN p1.Budget (SELECT AVG(p2.Budget) FROM Project p2) THEN "nadprůměrné" END "Kategorie rozpočtu" FROM Project p1;

Výsledek tohoto dotazu je následující:

Norma ISO definuje následujících pět agregační funkce:

POČÍTAT– vrátí počet hodnot v zadaném sloupci;

SOUČET– vrátí součet hodnot v zadaném sloupci;

AVG– vrátí průměrnou hodnotu v zadaném sloupci;

MIN– vrátí minimální hodnotu v zadaném sloupci;

MAX– vrátí maximální hodnotu v zadaném sloupci.

Všechny tyto funkce pracují s hodnotami v jednom sloupci tabulky a vracejí jedinou hodnotu. Funkce COUNT, MIN a MAX platí pro numerická i nenumerická pole, zatímco funkce SUM a AVG lze použít pouze pro numerická pole. S výjimkou COUNT(*) jsou při vyhodnocování výsledků libovolné funkce nejprve odstraněny všechny hodnoty null a poté je požadovaná operace aplikována pouze na zbývající neprázdné hodnoty ve sloupci. Volba COUNT(*) je speciální případ použití funkce COUNT – jejím účelem je spočítat všechny řádky v tabulce bez ohledu na to, zda obsahuje hodnoty null, duplikáty nebo jakékoli jiné hodnoty. Pokud chcete vyloučit duplicitní hodnoty před použitím agregační funkce, musíte před název sloupce v definici funkce zadat klíčové slovo DISTINCT. Norma ISO umožňuje použití klíčového slova ALL k explicitnímu označení, že vyloučení duplicitní hodnoty není vyžadováno, ačkoli toto klíčové slovo je implicitně implicitní, pokud není zadán žádný jiný kvalifikátor. Klíčové slovo DISTINCT nemá pro funkce MIN a MAX žádný význam. Jeho použití však může ovlivnit výsledky funkcí SUM a AVG, proto byste měli předem zvážit, zda má být v každém konkrétním případě přítomen. Kromě toho lze klíčové slovo DISTINCT zadat v každém požadavku pouze jednou.

Je třeba poznamenat, že agregační funkce lze použít pouze v seznamu SELECT a v klauzuli HAVING (viz oddíl 5.3.4). Ve všech ostatních případech je použití těchto funkcí nepřijatelné. Pokud seznam SELECT obsahuje agregační funkci a tělo dotazu neobsahuje klauzuli GROUP BY umožňující seskupování dat, pak žádný z prvků seznamu SELECT nemůže obsahovat žádné odkazy na sloupce, pokud sloupec není použit jako parametr agregační funkce. Například následující dotaz je nesprávný:

VYBRATzaměstnanciNe,POČÍTAT (plat)

ZPersonál;

Chyba je v tom, že v tomto požadavku není žádná konstrukce GROUP BY a sloupec staffNo v seznamu SELECT je přístupný bez použití agregační funkce.

Příklad 13: Použití funkce COUNT(*).Určete, kolik nemovitostí k pronájmu má nájem vyšší než 350 GBP měsíčně,

VYBERTE POČET(*) Počet AS

ZPropertyForRent

KDEnájem > 350;

Omezení započítávání pouze těch nemovitostí k pronájmu, jejichž nájemné je vyšší než 350 GBP za měsíc, je implementováno pomocí klauzule WHERE. Celkový počet nemovitostí k pronájmu, které splňují zadanou podmínku, lze určit pomocí agregační funkce COUNT. Výsledky dotazu jsou uvedeny v tabulce. 23.

Tabulka 23

počítat

Příklad 14. Pomocí funkce COUNT(DISTINCT).Zjistěte, kolik různých nemovitostí k pronájmu si zákazníci prohlíželi v květnu 2001.

VYBRAT POČET(ODDÍLpropertyNo) AS počet

ZProhlížení

Opět platí, že omezení výsledků dotazu pouze na ty nemovitosti k pronájmu, které byly zkontrolovány v květnu 2001, je dosaženo použitím klauzule WHERE. Celkový počet zkoumaných objektů, které splňují zadanou podmínku, lze určit pomocí agregační funkce COUNT. Protože však stejný objekt mohou různí klienti prohlížet několikrát, je nutné v definici funkce zadat klíčové slovo DISTINCT – to umožní vyloučit z výpočtu duplicitní hodnoty. Výsledky dotazu jsou uvedeny v tabulce. 24.

Tabulka 24

Příklad 16. Použití funkcí MIN, MAXnAVG.Spočítejte si minimální, maximální a průměrnou mzdu.

ZVOLTE MIN(plat) AS min, MAX(plat) AS max, AVG(plat) AS prům

ZPersonál;

V tomto příkladu potřebujete zpracovat informace o všech zaměstnancích společnosti, takže nemusíte používat klauzuli WHERE. Požadované hodnoty lze vypočítat pomocí funkcí MIN, MAX a AVG aplikovaných na sloupec platů v tabulce Zaměstnanci. Výsledky dotazu jsou uvedeny v tabulce. 26.

Tabulka 26.

Výsledek požadavku

min max prům
9000.00 30000.00 17000.00

Výsledky seskupení (konstrukt GROUP BY). Výše uvedené příklady souhrnných údajů jsou podobné řádkům souhrnu, které se obvykle nacházejí na konci sestav. V důsledku toho jsou všechna podrobná data sestavy komprimována do jednoho souhrnného řádku. Velmi často je však nutné v reportech generovat mezisoučty. Pro tento účel lze v příkazu SELECT zadat klauzuli GROUP BY. Je volán dotaz, který obsahuje klauzuli GROUP BY žádost o seskupení, protože seskupuje data vyplývající z operace SELECT a poté vytváří jeden celkový řádek pro každou jednotlivou skupinu. Volají se sloupce uvedené v klauzuli GROUP BY seskupené sloupce. Norma ISO vyžaduje, aby klauzule SELECT a GROUP BY úzce souvisely. Při použití klauzule GROUP BY v příkazu SELECT musí mít každý prvek seznamu v seznamu SELECT jediný význam pro celou skupinu. Kromě toho může klauzule SELECT obsahovat pouze následující typy prvků:

Názvy sloupců;

agregační funkce;

Konstanty;

Výrazy, které obsahují kombinace prvků uvedených výše.

Všechny názvy sloupců, které se objevují v seznamu SELECT, se musí také objevit v klauzuli GROUP BY, pokud není název sloupce použit pouze v agregační funkci. Opak není vždy pravdou – klauzule GROUP BY může obsahovat názvy sloupců, které nejsou v seznamu SELECT. Pokud je klauzule WHERE použita ve spojení s klauzulí GROUP BY, je zpracována jako první a seskupeny jsou pouze ty řádky, které splňují podmínku vyhledávání. Norma ISO specifikuje, že při seskupování jsou všechny chybějící hodnoty považovány za stejné. Pokud dva řádky tabulky ve stejném sloupci seskupení obsahují hodnoty NULL a identické hodnoty ve všech ostatních sloupcích seskupení bez hodnoty null, jsou umístěny do stejné skupiny.

Příklad 17: Použití konstrukce GROUP BY.Určete počet zaměstnanců pracujících v jednotlivých odděleních společnosti a také jejich celkové mzdy.

VYBRATčíslo pobočky, POČÍTAT(personál č.) AS počítat, SOUČET(plat) AS součet

ZPersonál

GROUP BYpobočka č

OBJEDNAT PODLEčíslo pobočky;

Do seznamu prvků GROUP BY není nutné uvádět názvy sloupců staffNo a plat, protože se objevují pouze v seznamu SELECT s agregačními funkcemi. Zároveň sloupec branchNo v seznamu klauzule SELECT není spojen s žádnou agregační funkcí az tohoto důvodu musí být uveden v klauzuli GROUP BY. Výsledky dotazu jsou uvedeny v tabulce. 27.

Tabulka 27

Výsledek požadavku

pobočka č Počítat Součet
B003 54000.00
B005 39000.00
B007 9000.00

Koncepčně se při zpracování tohoto požadavku provádějí následující akce:

1. Řádky tabulky Zaměstnanci jsou rozděleny do skupin podle hodnot ve sloupci čísla oddělení společnosti. V každé skupině jsou údaje o všech zaměstnancích jednoho z oddělení společnosti. V našem příkladu budou vytvořeny tři skupiny, jak je znázorněno na Obr. 1.

2. Pro každou skupinu se vypočítá celkový počet řádků, který se rovná počtu zaměstnanců v oddělení, a také součet hodnot ve sloupci plat, což je součet platů všech zaměstnanců v oddělení, které nás zajímá. Pro celou skupinu zdrojových řádků se pak vygeneruje jeden souhrnný řádek.

3. Výsledné řádky výsledné tabulky jsou seřazeny vzestupně podle čísla pobočky uvedeného ve sloupci branchNo.

pobočka č personál č Plat
В00 З SG37 12000.00
В00 З SG14 18000.00
В00 З SG5 24000.00
B005 SL21 30000.00
B005 SL41 9000.00
B007 SA9 9000.00
POČET(personál č.) SUM(plat)
54000.00
39000.00
9000.00

Rýže. 1. Tři skupiny záznamů vytvořené při provádění dotazu

Standard SQL umožňuje umístit vnořené dotazy do seznamu SELECT. Takže výše uvedený dotaz může být také reprezentován takto:

VYBRATčíslo pobočky, (VYBRAT POČET(číslo personálu)AS počítat

ZZaměstnanci s

KDEs.branchNo = b.branchNo),

(SELECT SUM(plat) JAKO součet

ZZaměstnanci s

KDEs.branchNo = b.branchNo)

ZPobočka b

OBJEDNAT PODLEčíslo pobočky;

Tato verze dotazu však vytváří dva výsledky agregační funkce pro každou z poboček společnosti popsaných v tabulce Poboček, takže v některých případech je možné vidět řádky obsahující hodnoty null.

Omezení provádění seskupování (konstrukt HAVING). Klauzule HAVING je určena k použití ve spojení s klauzulí GROUP BY k nastavení omezení specifikovaných za účelem výběru těch skupiny, který bude umístěn do výsledné tabulky dotazu. Přestože klauzule HAVING a WHERE mají podobnou syntaxi, jejich účel je odlišný. Klauzule WHERE se používá k výběru jednotlivých řádků k naplnění výsledné tabulky dotazů a klauzule HAVING se používá k výběru skupiny, umístěn ve výsledné tabulce dotazů. Norma ISO vyžaduje, aby se názvy sloupců použité v klauzuli HAVING objevily v seznamu prvků GROUP BY nebo byly použity v agregačních funkcích. V praxi vyhledávací termíny v klauzuli HAVING vždy obsahují alespoň jednu agregační funkci; jinak musí být tyto hledané výrazy umístěny do klauzule WHERE a použity k výběru jednotlivých řádků. (Pamatujte, že agregační funkce nelze použít v klauzuli WHERE.) Klauzule HAVING není nezbytnou součástí jazyka SQL – jakýkoli dotaz napsaný pomocí klauzule HAVING lze napsat v jiné formě, aniž byste ji použili.

Příklad 18. Použití konstruktu HAVING.Pro každou pobočku firmy s více osobami určete počet zaměstnanců a výši jejich mezd.

VYBRATčíslo pobočky, COUN T (č. personálu) AS počítat, SOUČET(plat) AS součet

ZPersonál

GROUP BYpobočka č

POČÍTAT(číslo personálu) > 1

OBJEDNAT PODLEčíslo pobočky;

Tento příklad je podobný předchozímu, ale používá další omezení indikující, že nás zajímají pouze informace o těch odděleních společnosti, která zaměstnávají více než jednu osobu. Podobný požadavek platí pro skupiny, takže dotaz by měl používat konstrukci HAVING. Výsledky dotazu jsou uvedeny v tabulce. 28.

Tabulka 28

branchNo count sum
В00 З 3 54000,00
В005 2 39000,00

Dílčí dotazy. V této části probereme použití úplných příkazů SELECT vložených do těla jiného příkazu SELECT. Externí(Druhý) příkaz SELECT používá výsledek provedení vnitřní(prvního) operátora k určení obsahu konečného výsledku celé operace. Vnitřní dotazy lze nalézt v klauzulích WHERE a HAVING vnějšího příkazu SELECT – v tomto případě se nazývají dílčí dotazy, nebo vnořené dotazy. Vnitřní příkazy SELECT lze navíc použít v příkazech INSERT, UPDATE a DELETE . Existují tři typy poddotazů.

Skalární poddotaz vrátí hodnotu vybranou z průsečíku jednoho sloupce s jedním řádkem, tzn. jediný význam. V zásadě lze skalární poddotaz použít všude tam, kde je vyžadována jediná hodnota. Varianty skalárních dílčích dotazů jsou uvedeny v příkladech 13 a 14.

Řetězcový poddotaz vrátí hodnoty více sloupců tabulky, ale jako jeden řádek. Řetězcový poddotaz lze použít kdekoli, kde se používá konstruktor hodnot řetězce, obvykle predikáty. Varianta poddotazu řetězce je uvedena v příkladu 15.

Poddotaz tabulky vrátí hodnoty jednoho nebo více sloupců tabulky ve více než jednom řádku. Poddotaz tabulky lze použít všude tam, kde lze zadat tabulku, například jako operand k predikátu IN.

Příklad 19: Použití poddotazu s testem rovnosti. Komponovat seznam zaměstnanců pracujících v pobočce společnosti na adrese 463 Main St1.

VYBRAT

ZPersonál

KDEčíslo větve = (VYBRAT číslo větve

ZVětev

KDEulice = "163 Main St");

Interní příkaz SELECT (SELECT branchNo FROM Branch ...) je určen k určení čísla firemní pobočky umístěné na adrese "163 Main St". (Existuje pouze jedna taková pobočka společnosti, takže tento příklad je příkladem skalárního poddotazu.) Po získání čísla požadované pobočky se provede vnější poddotaz pro získání podrobných informací o zaměstnancích dané pobočky. Jinými slovy, vnitřní příkaz SELECT vrací tabulku skládající se z jediné hodnoty „BOOV“, která představuje číslo pobočky společnosti umístěné na adrese „163 Main St1. Výsledkem je, že vnější příkaz SELECT má následující podobu:

VYBRATstaffNo, fName, Iname, position

ZPersonál

KDEčíslo větve = "B0031;

Výsledky tohoto dotazu jsou uvedeny v tabulce. 29.

Tabulka 29

Výsledek požadavku

personál č fName Iname pozice
SG37 Ann Buk Asistent
SG14 Davide Brod Vedoucí
SG5 Susan Značka Manažer

Poddotaz je nástroj pro vytvoření dočasné tabulky, jejíž obsah načte a zpracuje externí operátor. Poddotaz lze zadat přímo za operátory porovnání (tj. operátory =,<, >, <=, >=, <>) v klauzuli WHERE nebo HAVING. Text dílčího dotazu musí být uzavřen v závorkách.

Příklad 20. Použití poddotazů s agregačními funkcemi. Vytvořte seznam všech zaměstnanců, kteří mají nadprůměrnou mzdu, a uveďte, o kolik přesahuje jejich mzda průměrnou mzdu v podniku.

VYBRATstaffNo, fName, INname, pozice, plat - ( VYBERTE AVG(plat) Z Personál) AS salDiff

ZPersonál

KDEplat > ( VYBERTE AVG(plat) Z S t a f f);

Je třeba poznamenat, že nemůžete přímo zahrnout do dotazovací výraz"WHERE plat > AVG (plat)", protože používat agregaci funkce v klauzuli WHERE jsou zakázány. Chcete-li dosáhnout požadovaného výsledku, měli byste vytvořit poddotaz, který vypočítá průměrnou roční mzdu, a poté jej použít ve vnějším příkazu SELECT, který získá informace o těch zaměstnancích ve společnosti, jejichž mzda tento průměr přesahuje. Jinými slovy, dílčí dotaz vrátí průměrnou roční mzdu společnosti ve výši 17 000 GBP.

Výsledek tohoto skalárního poddotazu slouží ve vnějším příkazu SELECT jak k výpočtu odchylky mezd od průměrné úrovně, tak k výběru informací o zaměstnancích. Vnější příkaz SELECT má tedy následující podobu:

VYBRATstaffNo, fName, INname, pozice, plat - 17000 Jak salDiff

ZPersonál

KDEmzda > 17000;

Výsledky dotazu jsou uvedeny v tabulce. 30.

Tabulka 30.

Výsledek požadavku

personál č fName Iname pozice salDiff
SL21 Jan Bílý Manažer 13000.00
SG14 Davide Brod Vedoucí 1000.00
SG5 Susan Značka Manažer 7000.00

Platí pro poddotazy dodržování pravidel a omezení.

1. Poddotazy by neměly používat klauzuli ORDER BY, i když může být přítomna ve vnějším příkazu SELECT.

2. Seznam SELECT poddotazu se musí skládat z názvů jednotlivých sloupců nebo výrazů z nich složených, kromě případů, kdy je v poddotazu použito klíčové slovo EXISTS.

3. Názvy sloupců v poddotazu standardně odkazují na tabulku, jejíž název je uveden v klauzuli FROM poddotazu. Je však také možné odkazovat na sloupce tabulky uvedené v klauzuli FROM vnějšího dotazu pomocí kvalifikovaných názvů sloupců (jak je popsáno níže).

4. Pokud je poddotaz jedním ze dvou operandů zahrnutých do operace porovnání, pak musí být poddotaz specifikován na pravé straně této operace. Například následující zápis dotazu z předchozího příkladu je nesprávný, protože poddotaz je umístěn na levé straně operace porovnání proti hodnotě sloupce platu.

VYBRAT

ZPersonál

KDE(VYBRAT AVG (plat) ZE zaměstnanců)< salary;

Příklad 21. Vnořené poddotazy a použití predikátu IN. Udělejte si seznam pronájmů nemovitostí, za které zodpovídají zaměstnanci pobočky společnosti na adrese 163 Main st1.

VYBRATpropertyNo, ulice, město, PSČ, typ, pokoje, nájem

ZPropertyForRent

Kapitola 5. Jazyk SQL: manipulace s daty 189

KDEstaffNo IN (SELECT staffNo

ZPersonál

KDEbrancliNo = (SELECT branchNo

ZVětev

KDEulice = "163 Main S t "));

První, nejvnitřnější, dotaz je určen k určení čísla pobočky společnosti na adrese 463 Main St. Druhý, mezilehlý, dotaz získá informace o zaměstnancích pracujících v této pobočce vybráno a proto v externím dotazu nelze použít operátor porovnání =. Místo toho musíte použít klíčové slovo IN. Externí dotaz získá informace o pronajatých objektech, za které odpovídají tito zaměstnanci společnosti, o kterých byla získána jako. výsledek provedení přechodného dotazu Výsledky dotazu jsou uvedeny v tabulce 31.

Tabulka 31

Výsledek požadavku

č. nemovitosti ulice město PSČ typ pokoje nájemné
PG16 5 Novar Dr Glasgow G129AX Byt
PG36 2 Manor Road Glasgow G324QX Byt
PG21 18 Dale Rd Glasgow G12 Dům

Klíčová slova ANY a ALL. Klíčová slova ANY a ALL lze použít s poddotazy, které vracejí jeden sloupec čísel. Pokud poddotazu předchází klíčové slovo ALL, je podmínka porovnání splněna pouze v případě, že platí pro všechny hodnoty ve sloupci výsledků poddotazu. Pokud textu poddotazu předchází klíčové slovo ANY, bude podmínka porovnání považována za splněnou, pokud bude splněna alespoň pro jednu (nebo více) hodnot ve výsledném sloupci poddotazu. Pokud výsledkem provedení dílčího dotazu je prázdná hodnota, pak pro klíčové slovo ALL bude podmínka porovnání považována za splněnou a pro klíčové slovo ANY bude považována za nesplněnou. Podle normy ISO můžete navíc použít klíčové slovo SOME, které je synonymem pro klíčové slovo ANY.

Příklad 22. Pomocí klíčových slov ANY a SOME. Najděte všechny pracovníky, jejichž plat převyšuje alespoň plat jeden pracovník pobočky firmy pod číslem „booz“.

VYBRATstaffNo, fName, INname, pozice, plat

ZPersonál

KDEplat > NĚJAKÉ(VYBRAT plat

ZPersonál

KDEčíslo větve = "B003");

Ačkoli by tento dotaz mohl být zapsán pomocí poddotazu, který specifikuje minimální mzdu pro zaměstnance oddělení číslo "BOHO", po kterém by vnější poddotaz mohl vybrat informace o všech zaměstnancích společnosti, jejichž mzda tuto hodnotu přesahuje (viz příklad 20), je možný jiný přístup, která spočívá v použití klíčových slov SOME/ANY. V tomto případě vnitřní poddotaz vytvoří sadu hodnot (12000, 18000, 24000) a vnější dotaz vybere informace o těch zaměstnancích, jejichž plat je větší než kterákoli z hodnot v tomto

set (ve skutečnosti více než minimální hodnota - 12000). Tento alternativní způsob lze považovat za přirozenější než definování minimální mzdy v dílčím dotazu. Ale v obou případech se vytvoří stejné výsledky dotazu, které jsou uvedeny v tabulce. 32 .

Tabulka 32

Výsledek požadavku

personál č fName Iname pozice plat
SL21 Jan Bílý Manažer 30000.00
SG14 Davide Brod Vedoucí 18000.00
SG5 Susan Značka Manažer 24000.00

Příklad 23. Pomocí klíčového slova ALL. Najděte všechny zaměstnance, jejichž mzda je vyšší než mzda kteréhokoli zaměstnance v pobočkovém čísle společnosti "chlast".

VYBRATstaffNo, fName, INarae, pozice, plat

ZPersonál

KDEplat > VŠE(VYBRAT plat

ZPersonál

KDEčíslo větve = "BOG3");

Obecně je tento požadavek podobný předchozímu. A v tomto případě by bylo možné použít poddotaz, který určí maximální hodnotu mzdy pracovníků oddělení pod číslem „BOZ“, a následně pomocí externího dotazu vybrat informace o všech zaměstnancích společnosti, jejichž mzda převyšuje tuto hodnotu. V tomto příkladu je však zvolen přístup klíčových slov ALL. Výsledky dotazu jsou uvedeny v tabulce. 33 .

Tabulka 33

Výsledek požadavku

personál č Iname fName pozice plat
SL21 Bílý Jan Manažer 30000,00

Vícetabulkové dotazy. Všechny výše uvedené příklady mají stejné důležité omezení: sloupce umístěné ve výsledné tabulce jsou vždy vybírány z jedné tabulky. To však v mnoha případech nestačí. Chcete-li ve výsledné tabulce zkombinovat sloupce z několika zdrojových tabulek, musíte operaci provést spojení. V SQL se operace spojení používá ke spojení informací ze dvou tabulek vytvořením dvojic souvisejících řádků vybraných z každé tabulky. Páry řádků umístěné v kombinované tabulce jsou sestaveny na základě rovnosti hodnot zadaných sloupců, které jsou v nich obsaženy.

Pokud potřebujete získat informace z několika tabulek, můžete buď použít poddotaz, nebo tabulky spojit. Pokud výsledná tabulka dotazu musí obsahovat sloupce z různých zdrojových tabulek, pak je vhodné použít mechanismus spojení tabulek. Chcete-li provést spojení, stačí zadat názvy dvou nebo více tabulek v klauzuli FROM, oddělit je čárkami, a poté zahrnout do dotazu klauzuli WHERE definující sloupce použité ke spojení zadaných tabulek. Kromě toho můžete místo názvů tabulek použít pseudonymy, jim přiřazena v klauzuli FROM. V tomto případě musí být názvy tabulek a k nim přiřazené aliasy odděleny mezerami. Aliasy lze použít k objasnění názvů sloupců, kdykoli mohou existovat nejasnosti ohledně toho, do které tabulky sloupec patří. Kromě toho lze aliasy použít ke zkrácení názvů tabulek. Pokud je pro tabulku definován alias, lze jej použít kdekoli, kde je třeba zadat název této tabulky.

Příklad 24. Jednoduché připojení. Udělejte si jmenný seznam všech klientů, kteří si již alespoň jednu pronajímanou nemovitost prohlédli a vyjádřili se k věci.

VYBRATc.clientNo, fName, Iname, propertyNo, comment

ZKlient c, Prohlížení v

KDEc.clientNo = v.clientNo;

Tato sestava vyžaduje informace z tabulky Klient i z tabulky Zobrazení, takže k vytvoření dotazu použijeme mechanismus spojení tabulek. Klauzule SELECT uvádí seznam všech sloupců, které by měly být umístěny ve výsledné tabulce dotazu. Všimněte si, že sloupec clientNo vyžaduje kvalifikaci, protože sloupec může být také přítomen v jiné tabulce účastnící se spojení. Proto je nutné výslovně uvést, o které tabulkové hodnoty máme zájem. (V tomto příkladu byste mohli stejně snadno vybrat hodnoty sloupce clientNo z tabulky zobrazení.) Název je určen uvedením názvu odpovídající tabulky (nebo jejího aliasu) jako předpony před názvem sloupce. Náš příklad používá hodnotu "c" zadanou jako alias pro tabulku Klient. Ke generování výsledných řádků se použijí ty řádky zdrojových tabulek, které mají identickou hodnotu ve sloupci clientNo. Tato podmínka je určena zadáním vyhledávací podmínky with.clientNo=v.clientNo. Obdobné sloupce zdrojových tabulek se nazývají odpovídající sloupce. Popsaná operace je ekvivalentní operaci spojení podle rovnosti relační algebra. Výsledky dotazu jsou uvedeny v tabulce. 34.

Tabulka 34

Výsledek požadavku

klient č fName Iname č. nemovitosti komentář
CR56 Aline Stewarte PG36
CR56 Aline Stewarte PA14 příliš malý
CR56 Aline Stewarte PG4
CR62 Marie Tregear PA14 žádná jídelna
CR76 Jan Kay PG4 příliš vzdálené

Dotazy na více tabulek se nejčastěji provádějí na dvou tabulkách spojených vztahem jedna ku mnoha (1:*) nebo rodič-dítě. Ve výše uvedeném příkladu, který zahrnuje přístup k tabulkám Klient a Prohlížení, jsou tyto tabulky spojeny právě takovým vztahem. Každý řádek prohlížené (podřízené) tabulky je přidružen pouze k jednomu řádku klientské (nadřazené) tabulky, zatímco stejný řádek klientské (nadřazené) tabulky může být přidružen.

s mnoha řádky tabulky Prohlížení (podřízené). Páry řádků, které se generují při provádění dotazu, jsou výsledkem všech platných kombinací řádků v podřízených a nadřazených tabulkách. Část 3.2.5 podrobně popisuje, jak v relační databázi primární a cizí klíče tabulek vytvářejí vztah rodič-potomek. Tabulka obsahující cizí klíč je obvykle podřízená, zatímco tabulka obsahující primární klíč bude vždy nadřazená. Chcete-li použít vztah rodič-potomek v dotazu SQL, musíte zadat podmínku hledání, která porovná cizí klíč a primární klíč. Příklad 24 porovnává primární klíč tabulky Klient (v. clientNo) s cizím klíčem tabulky Viewing (v. clientNo).

Standard SQL navíc poskytuje následující způsoby, jak definovat toto připojení:

ZKlient s PŘIPOJTE SE Prohlížení v NA c.clientNo = v.clientNo

ZKlient J OIN Prohlížení POUŽÍVÁNÍ klient č

ZKlient PŘIROZENÉ PŘIPOJENÍ Prohlížení

V každém případě klauzule FROM nahrazuje původní klauzule FROM a WHERE. První možnost však vytvoří tabulku se dvěma stejnými sloupci clientNo, zatímco v dalších dvou případech bude výsledná tabulka obsahovat pouze jeden sloupec clientNo.

Příklad 25.Řazení výsledků spojování tabulek. U každé pobočky společnosti uveďte osobní čísla a jména zaměstnanců odpovědných za případné pronajímání nemovitostí a uveďte také zařízení, pro která

na které odpovídají.

VYBRATs.branchNo, s.staffNo, fName, Iname, propertyNo

ZStaff s, PropertyForRent p

KDEs.staffNo = p.staffNo

OBJEDNAT PODLEs.branchNo, s.personalNo, propertyNo;

Pro snazší čtení výsledků je výsledný výstup setříděn pomocí čísla oddělení jako hlavního klíče řazení a čísla personálu a čísla majetku jako vedlejších klíčů. Výsledky dotazu jsou uvedeny v tabulce. 35.

Tabulka 35

Výsledek požadavku

pobočka č StaffNo fName Iname č. nemovitosti
SZO SG14 Davide Brod PG16
SZO SG37 Ann Buk PG21
SZO SG37 Ann Buk PG36
BOO5 SL41 Marie Závětří PL94
SBI7 SA9 Julie Howe PA14

Příklad 26. Spojení tří stolů. U každé pobočky společnosti uveďte osobní čísla a jména zaměstnanců odpovědných za případné pronajímání nemovitostí s uvedením města, ve kterém se pobočka společnosti nachází, a čísla zařízení, za která každý zaměstnanec odpovídá.

VYBRAT b.branchNo, b.city, s.staffNo, fName, INname, propertyNo

Z Pobočka b, Staff s, PropertyForRent p

KDE b. č. pobočky = č. č. pobočky A č. č. č. = č. č. p

OBJEDNAT PODLE b.pobočka, s.staffNo, propertyNo;

Výsledná tabulka musí obsahovat sloupce ze tří zdrojových tabulek – Branch, Staff a PropertyForRent – ​​takže dotaz musí tyto tabulky spojit. Tabulky Pobočka a Zaměstnanci lze spojit pomocí podmínky b.pobočka=*s .Číslo pobočky, čímž dojde k přidružení poboček společnosti k pracovníkům, kteří v nich pracují. Tabulky Staff a PropertyForRent lze spojit pomocí podmínky s.staffNo=p.staffNo. V důsledku toho bude každý zaměstnanec spojen s pronájmem nemovitostí, za které odpovídá. Výsledky dotazu jsou uvedeny v tabulce. 36.

Tabulka 36

Výsledky dotazu

pobočka č město zaměstnanciMo fName Iname č. nemovitosti
B003 Glasgow SG14 Davide Brod PG16
B003 Glasgow SG37 Ann Buk PG21
B003 Glasgow SG37 Ann Buk PG36
B005 Londýn SL41 Julie Závětří PL94
B007 Aberdeen SA9 Marie Howe PA14

Všimněte si, že standard SQL umožňuje použití alternativní formulace konstrukcí FROM a WHERE:

Z(Pobočka b PŘIPOJTE SE k zaměstnancům POUŽÍVAJÍCÍ pobočka č.) AS bs

PŘIPOJTE SEPropertyForRent str POUŽÍVÁNÍ personál č

Příklad 27. Seskupení podle více sloupců. Určete počet pronajímaných nemovitostí, za které je odpovědný každý ze zaměstnanců společnosti.

VYBRATs.branchNo, S.personalNo, POČÍTAT(*) AS počítat

FROM Staff s, PropertyForRent p

KDE S.staffNo = p.staffNo

GROUP BYs.branchNo, s.personalNo

OBJEDNAT PODLEs.branchNo, s.personalNo;

Pro vypracování požadované zprávy musíte nejprve zjistit, který ze zaměstnanců společnosti je zodpovědný za pronájem nemovitostí. Tento problém lze vyřešit spojením tabulek Staff a PropertyForRent pomocí sloupce staffNo v klauzuli FROM/WHERE. Poté je nutné sestavit skupiny složené z čísla oddělení a personálních čísel jeho zaměstnanců, pro které by měla sloužit konstrukce GROUP BY. Nakonec je třeba výslednou tabulku seřadit pomocí klauzule ORDER BY. Výsledky dotazu jsou uvedeny v tabulce. 37.

Tabulka 37

Výsledek požadavku

pobočka č personál č počítat
В00 З SG14
В00 З SG37
B005 SL41
B007 SA9

Navazování spojení. Spojení je podmnožinou obecnější kombinace dat ze dvou tzv. tabulek karteziánský. Kartézský součin dvou tabulek je další tabulka skládající se ze všech možných dvojic řádků, které jsou součástí obou tabulek. Množinou sloupců ve výsledné tabulce jsou všechny sloupce první tabulky následované všemi sloupci druhé tabulky. Pokud zadáte dotaz na dvě tabulky bez uvedení klauzule WHERE, bude výsledkem dotazu v prostředí SQL kartézský součin těchto tabulek. Norma ISO navíc poskytuje speciální formát pro příkaz SELECT, který umožňuje vypočítat kartézský součin dvou tabulek:

SELECT(*j seznam sloupců]

FROM tableNamel CROSS JOINCaYeUlte2

Podívejme se znovu na příklad, ve kterém se spojení klienta a tabulky prohlížení provádí pomocí společného sloupce clientNo při práci s tabulkami, jejichž obsah je uveden v tabulce. 3.6 a 3.8, kartézský součin těchto tabulek bude obsahovat 20 řádků (4 řádky klientské tabulky x 5 řádků zobrazovací tabulky = 20 řádků). To je ekvivalentní zadání dotazu použitého v příkladu 5.24, ale bez použití klauzule WHERE. Postup pro generování tabulky obsahující výsledky spojení dvou tabulek pomocí příkazu SELECT je následující.

1. Vytvoří se kartézský součin tabulek specifikovaných v konstrukci FROM.

2. Pokud dotaz obsahuje klauzuli WHERE, aplikujte podmínky vyhledávání na každý řádek kartézské tabulky součinů a do tabulky uložte pouze ty řádky, které splňují zadané podmínky. Z hlediska relační algebry se tato operace nazývá omezení Kartézský součin.

3. Pro každý zbývající řádek je určena hodnota každého prvku zadaného v seznamu SELECT, výsledkem čehož je samostatný řádek výsledné tabulky.

4. Pokud původní dotaz obsahuje konstrukci SELECT DISTINCT, budou z výsledné tabulky odstraněny všechny duplicitní řádky.

5. Pokud dotaz, který provádíte, obsahuje klauzuli ORDER BY,


©2015-2019 web
Všechna práva náleží jejich autorům. Tato stránka si nečiní nárok na autorství, ale poskytuje bezplatné použití.
Datum vytvoření stránky: 2016-08-07

klauzule GROUP BY(příkazy SELECT) umožňují seskupit data (řádky) podle hodnoty sloupce nebo několika sloupců nebo výrazů. Výsledkem bude sada souhrnných řádků.

Každý sloupec ve výběrovém seznamu se musí objevit v klauzuli GROUP BY, s výjimkou konstant a sloupců operandu agregované funkce.

Tabulku můžete seskupit podle libovolné kombinace jejích sloupců.

Agregační funkce se používají k získání jedné celkové hodnoty ze skupiny řádků. Všechny agregační funkce provádějí výpočty s jedním argumentem, kterým může být sloupec nebo výraz. Výsledkem jakéhokoli výpočtu agregační funkce je konstantní hodnota zobrazená v samostatném sloupci výsledků.

Agregační funkce jsou specifikovány v seznamu sloupců příkazu SELECT, který může také obsahovat klauzuli GROUP BY. Pokud v příkazu SELECT není klauzule GROUP BY a seznam vybraných sloupců obsahuje alespoň jednu agregační funkci, pak nesmí obsahovat jednoduché sloupce. Na druhé straně může seznam pro výběr sloupců obsahovat názvy sloupců, které nejsou argumenty agregační funkce, pokud jsou tyto sloupce argumenty klauzule GROUP BY.

Pokud dotaz obsahuje klauzuli WHERE, pak agregační funkce vypočítají hodnotu pro výsledky výběru.

Agregační funkce MIN a MAX vypočítat nejmenší a největší hodnotu sloupce, resp. Argumenty mohou být čísla, řetězce a data. Všechny hodnoty NULL jsou před výpočtem odstraněny (to znamená, že se neberou v úvahu).

Agregační funkce SUM vypočítá celkový součet hodnot sloupce. Argumenty mohou být pouze čísla. Použití parametru DISTINCT odstraní všechny duplicitní hodnoty ve sloupci před použitím funkce SUM. Podobně jsou před použitím této agregační funkce odstraněny všechny hodnoty NULL.

Agregační funkce AVG vrátí průměr všech hodnot ve sloupci. Argumenty mohou být také pouze čísla a všechny hodnoty NULL jsou před vyhodnocením odstraněny.

Agregační funkce COUNT má dvě různé podoby:

  • COUNT(název_sloupce) - počítá počet hodnot ve sloupci název_sloupce, hodnoty NULL se neberou v úvahu
  • COUNT(*) - počítá počet řádků v tabulce, zohledňují se také hodnoty NULL

Pokud dotaz používá klíčové slovo DISTINCT, budou před použitím funkce COUNT odstraněny všechny duplicitní hodnoty ve sloupci.

Funkce COUNT_BIG podobně jako funkce COUNT. Jediný rozdíl mezi nimi je typ výsledku, který vracejí: funkce COUNT_BIG vždy vrací hodnoty typu BIGINT, zatímco funkce COUNT vrací datové hodnoty typu INTEGER.

V MÁME nabídku definuje podmínku, která platí pro skupinu řádků. Pro skupiny řádků má stejný význam jako klauzule WHERE pro obsah odpovídající tabulky (WHERE platí před seskupením, HAVING po).

o hodnotu sloupce Disciplína. Dostaneme 4 skupiny, pro které můžeme vypočítat nějaké skupinové hodnoty, jako je počet n-tic ve skupině, maximální nebo minimální hodnota sloupce Skóre. Tabulka 5.7. Agregační funkce
Funkce Výsledek
POČÍTAT Počet řádků nebo neprázdných hodnot polí, které dotaz vybral
SOUČET Součet všech vybraných hodnot pro toto pole
AVG Aritmetický průměr všech vybraných hodnot pro toto pole
MIN Nejmenší ze všech vybraných hodnot pro toto pole
MAX Největší ze všech vybraných hodnot pro toto pole
R1
Celé jméno Disciplína Stupeň
Skupina 1 Petrov F.I. Databáze 5
Sidorov K.A. Databáze 4
Mironov A.V. Databáze 2
Štěpánová K.E. Databáze 2
Krylová T.S. Databáze 5
Vladimirov V.A. Databáze 5
Skupina 2 Sidorov K.A. Teorie informace 4
Štěpánová K.E. Teorie informace 2
Krylová T.S. Teorie informace 5
Mironov A.V. Teorie informace Null
Skupina 3 Trofimov P.A. Sítě a telekomunikace 4
Ivanova E.A. Sítě a telekomunikace 5
Utkina N.V. Sítě a telekomunikace 5
Skupina 4 Vladimirov V.A. anglický jazyk 4
Trofimov P.A. anglický jazyk 5
Ivanova E.A. anglický jazyk 3
Petrov F.I. anglický jazyk 5

Agregační funkce se používají podobně jako názvy polí v příkazu SELECT, ale s jednou výjimkou: berou název pole jako argument. S funkcemi SUM a AVG lze použít pouze číselná pole. S funkcemi COUNT , MAX a MIN lze použít jak číselná, tak znaková pole. Při použití se znakovými poli je MAX a MIN přeloží na ekvivalentní kód ASCII a zpracují je v abecedním pořadí. Některé DBMS umožňují použití vnořených agregátů, ale to je odchylka od standardu ANSI se všemi z toho vyplývajícími důsledky.

Můžete například vypočítat počet studentů, kteří složili zkoušky v jednotlivých oborech. Chcete-li to provést, musíte spustit dotaz seskupený podle pole "Disciplína" a jako výsledek zobrazit název disciplíny a počet řádků ve skupině pro tuto disciplínu. Použití znaku * jako argumentu funkce COUNT znamená sčítání všech řádků ve skupině.

SELECT R1.Discipline, COUNT(*) ZE R1 GROUP BY R1.Discipline

Výsledek:

Pokud chceme spočítat počet lidí, kteří složili zkoušku v jakékoli disciplíně, musíme před seskupením vyloučit z původního poměru nejisté hodnoty. V tomto případě bude žádost vypadat takto:

Dostáváme výsledek:

V tomto případě linka se studentem

Mironov A.V. Teorie informace Null

nespadne do množiny n-tic před seskupením, takže počet n-tic ve skupině k ukáznění " Teorie informace“ bude o 1 méně.

Lze použít agregační funkce také bez operace předběžného seskupení, v takovém případě je celý vztah považován za jednu skupinu a pro tuto skupinu lze vypočítat jednu hodnotu na skupinu.

Když se opět vrátíme do databáze „Session“ (tabulky R1, R2, R3), zjistíme počet úspěšně složených zkoušek:

To se samozřejmě liší od výběru pole, protože vždy je vrácena jedna hodnota, bez ohledu na to, kolik řádků je v tabulce. Argument agregační funkce mohou být samostatné sloupce tabulky. Ale abyste mohli vypočítat například počet odlišných hodnot určitého sloupce ve skupině, musíte spolu s názvem sloupce použít klíčové slovo DISTINCT. Spočítejme si počet různých známek získaných v každé disciplíně:

Výsledek:

Výsledek může zahrnovat hodnotu pole seskupení a několik agregační funkce a v podmínkách seskupování můžete použít více polí. V tomto případě se skupiny tvoří podle sady zadaných seskupovacích polí. Operace agregačních funkcí lze použít ke spojení více zdrojových tabulek. Položme si například otázku: určete pro každou skupinu a každou disciplínu počet studentů, kteří úspěšně složili zkoušku, a průměrné skóre v dané disciplíně.

Výsledek:

Nemůžeme použít agregační funkce v klauzuli WHERE, protože predikáty jsou vyhodnocovány z hlediska jednoho řádku a agregační funkce- pokud jde o skupiny linek.

Klauzule GROUP BY vám umožňuje definovat podmnožinu hodnot v konkrétním poli z hlediska jiného pole a aplikovat na podmnožinu agregační funkci. To umožňuje kombinovat obory a agregační funkce v jediné klauzuli SELECT. Agregační funkce lze použít jak ve výrazu pro výstup výsledků řádku SELECT, tak ve výrazu pro podmínku zpracování generovaných skupin HAVING. V tomto případě se každá agregační funkce vypočítá pro každou vybranou skupinu. Hodnoty získané z výpočtu agregační funkce, lze použít k zobrazení odpovídajících výsledků nebo k podmínění výběru skupin.

Pojďme vytvořit dotaz, který zobrazí skupiny, ve kterých bylo v jedné disciplíně ve zkouškách obdrženo více než jedna špatná známka:

V budoucnu jako příklad nebudeme pracovat s databází „Session“, ale s databází „Bank“, skládající se z jedné tabulky F, která uchovává relaci F obsahující informace o účtech v pobočkách určité banky:

F = (N, celé jméno, pobočka, datum otevření, datum uzavření, zůstatek); Q = (pobočka, město);

protože na tomto základě je možné názorněji ilustrovat práci s agregačními funkcemi a seskupováním.

Předpokládejme například, že chceme zjistit celkový zůstatek bankovních účtů. Pro každou z nich můžete vytvořit samostatný dotaz výběrem SUM(Zůstatek) z tabulky pro každou větev. GROUP BY vám však umožní dát je všechny do jednoho příkazu:

SELECT Větev, SUM(Zbývající) FROM F GROUP BY Větev;

Platí GROUP BY agregační funkce nezávisle pro každou skupinu definovanou pomocí hodnoty pole Pobočka. Skupina se skládá z řádků se stejnou hodnotou pole Branch a

Může provádět zobecněné skupinové zpracování hodnot polí. To se provádí pomocí agregačních funkcí. Agregační funkce vytvářejí jednu hodnotu pro celou skupinu tabulek. SQL poskytuje následující agregační funkce:

  • POČÍTAT– počítá počet řádků tabulky s nenulovými hodnotami pole zadaného jako argument.
  • SOUČET– vypočítá aritmetický součet všech vybraných hodnot pro dané pole.
  • AVG– zprůměruje všechny vybrané hodnoty tohoto pole.
  • MAX– zobrazí největší hodnotu ze všech vybraných hodnot pro toto pole.
  • MIN– zobrazí nejmenší hodnotu ze všech vybraných hodnot pro toto pole.

    Použití agregačních funkcí

    Agregační funkce se používají podobně jako názvy polí v klauzuli SELECT dotazu, s jednou výjimkou: berou názvy polí jako argument. S lze použít pouze číselná pole SOUČET A AVG. S POČÍTAT, MAX, A MIN Lze použít jak číselná, tak znaková pole. Při použití s ​​poli znaků MAX A MIN převede je na ekvivalent ASCII. To znamená, že MIN vybere první a MAX poslední hodnota v abecedním pořadí.

    Abychom zjistili celkovou částku prodeje v tabulce prodejů, musíme napsat následující dotaz:

    SELECT SUM(SSum) FROM Prodává

    V důsledku toho dostaneme:

    Tento dotaz spočítal počet nenulových hodnot v poli SNum tabulky Sells. Pokud dotaz přepíšeme takto:

    SELECT COUNT(SDate) FROM Prodává

    V důsledku toho dostaneme:

    COUNT OF SDdate
    4

    Různé výsledky dotazu při výpočtu toho, co se zdá být stejné, jsou získány, protože jedna z hodnot pole SDate je prázdná ( NULL). Při používání takových dotazů buďte opatrní.




Nahoru