Agregační funkce jazyka SQL. Agregační funkce v jazyce SQL. Agregační funkce v SQL

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

POČET– vrátí počet hodnot v zadaný sloupec;

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– vrací maximální hodnota v uvedené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í 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 eliminovat 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 to explicitní označeníže vyloučení duplicitních hodnot není vyžadováno, ačkoli toto klíčové slovo je implicitně implikováno, pokud nejsou zadány žádné další kvalifikátory. Klíčové slovo DISTINCT nemá žádný význam funkce MIN a MAX. 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ý prvek v 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ČET (plat)

ZPersonál;

Chyba je v tom, že v tomto požadavku není žádná konstrukce SKUPINA VYTVOŘENÁ 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 POČET. Výsledky dotazu jsou uvedeny v tabulce. 23.

Tabulka 23

počet

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(ODLIŠpropertyNo) 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 lze kontrolovat stejný objekt různé klienty několikrát je nutné v definici funkce zadat klíčové slovo DISTINCT - to umožní vyloučit duplicitní hodnoty z výpočtu. 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) TAK JAKO min, MAX(plat) TAK JAKO max, AVG(plat) TAK JAKO 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 získaná jako výsledek operace SELECT, po které je pro každého jednotlivce vytvořena jediná skupina souhrnný řádek. 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. Navíc klauzule SELECT může obsahovat pouze následující typy Prvky:

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 seskupovacím sloupci obsahují hodnoty NULL a identické hodnoty ve všech ostatních nenulových sloupcích seskupení, 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 každém z oddělení společnosti a také jejich celkový počet mzdy.

VYBRATčíslo pobočky, POČET(personál č.) TAK JAKO počet, SOUČET(plat) TAK JAKO součet

ZPersonál

SKUPINA VYTVOŘENÁpobočka č

SEŘADIT 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čet 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)TAK JAKO počet

ZZaměstnanci s

KDEs.branchNo = b.branchNo),

(SELECT SUM(plat) JAKO součet

ZZaměstnanci s

KDEs.branchNo = b.branchNo)

ZPobočka b

SEŘADIT 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 ve výsledné tabulce 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 zaměstnanci určete počet zaměstnanců a výši jejich mezd.

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

ZPersonál

SKUPINA VYTVOŘENÁpobočka č

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

SEŘADIT PODLEčíslo pobočky;

Tento příklad je podobný předchozímu, ale zde jej použijeme dodatečná omezení, což naznačuje, ž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
B005 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 dílčího dotazu.) Po získání požadovaného čísla pobočky se provede vnější dílčí dotaz pro výběr detailní informace o zaměstnancích tohoto oddělení. 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 Dozorce
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. Udělejte si seznam všech zaměstnanců, kteří mají nadprůměrný plat, a uveďte, o kolik přesahuje jejich plat průměrná mzda podle podniku.

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

ZPersonál

KDEplat > ( VYBERTE AVG(plat) Z Personál) ;

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 mzdu společnosti za rok, která se rovná 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 Tak jako salDiff

ZPersonál

KDEmzda > 17000;

Výsledky dotazu jsou uvedeny v tabulce. třicet.

Tabulka 30.

Výsledek požadavku

personál č fName Iname pozice salDiff
SL21 John Bílý Manažer 13000.00
SG14 Davide Brod Dozorce 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 externí požadavek, který používá kvalifikované názvy 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 nemůžete 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é jsou odpovědní tito zaměstnanci společnosti, o kterých byla získána data. o 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 pronajmout si
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 některé (jednu nebo více) hodnot ve výsledném sloupci poddotazu. Pokud je výsledek provedení dílčího dotazu: 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 alespoň převyšuje 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). Jako alternativní metoda 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 John Bílý Manažer 30000.00
SG14 Davide Brod Dozorce 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ŠECHNO(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. Nicméně, v v tomto příkladu Zvoleným přístupem je použití klíčového slova ALL. Výsledky dotazu jsou uvedeny v tabulce. 33 .

Tabulka 33

Výsledek požadavku

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

Vícetabulkové dotazy. Všechny výše uvedené příklady mají stejnou věc 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 jazyk SQL Operace spojení se používá ke spojení informací ze dvou tabulek vytvořením dvojic související řetězce, vybrané 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 prohlížecí tabulky, 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. Jsou volány podobné sloupce zdrojových tabulek 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 John 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 Zobrazení (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 potomek, zatímco tabulka obsahující primární klíč, bude vždy rodič. 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í metody definice tohoto spojení:

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

ZKlient J OIN Prohlížení POUŽITÍM klient č

ZKlient PŘIROZENÉ SPOJENÍ 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

SEŘADIT 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

SEŘADIT 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 vám umožňuje používat Alternativní možnost formulace konstruktů FROM a WHERE:

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

PŘIPOJITPropertyForRent str POUŽITÍM 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ČET(*) TAK JAKO počet

FROM Staff s, PropertyForRent p

KDE S.staffNo = p.staffNo

SKUPINA VYTVOŘENÁs.branchNo, s.personalNo

SEŘADIT PODLEs.branchNo, s.personalNo;

Pro vypracování požadované zprávy je třeba 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é musíte vytvořit skupiny složené z čísla oddělení a personálních čísel jeho zaměstnanců, pro které použijte konstrukci 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čet
В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 určení klauzule WHERE, výsledek dotazu bude v SQL prostředí bude kartézský součin těchto tabulek. Kromě toho poskytuje norma ISO speciální formát 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, což vede k vytvoření samostatná linka výsledná tabulka.

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

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ČET– 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í nejvyšší hodnotu ze všech vybraných hodnot tohoto pole.
  • MIN– zobrazí nejmenší hodnotu ze všech vybraných hodnot tohoto 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ČET, 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. Znamená to, že MIN vybere první a MAX poslední hodnota PROTI abecední 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

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

Naučme se shrnout. Ne, to ještě nejsou výsledky učení SQL a součty hodnot sloupců databázových tabulek. Agregát SQL funkce působit na hodnoty sloupce a vytvořit jedinou výslednou hodnotu. Nejčastěji používané agregační funkce SQL jsou SUM, MIN, MAX, AVG a COUNT. Je nutné rozlišovat dva případy použití agregačních funkcí. Nejprve se agregační funkce používají samy o sobě a vracejí jedinou výslednou hodnotu. Za druhé, agregační funkce se používají s klauzulí SQL GROUP BY, to znamená seskupování podle polí (sloupců) k získání výsledných hodnot v každé skupině. Podívejme se nejprve na případy použití agregačních funkcí bez seskupování.

Funkce SQL SUM

Funkce SQL SUM vrací součet hodnot ve sloupci databázové tabulky. Lze jej použít pouze na sloupce, jejichž hodnoty jsou čísla. Dotazy SQL pro získání výsledného součtu začínají takto:

VYBRAT SOUČET (NÁZEV COLUMN_NAME)...

Za tímto výrazem následuje FROM (TABLE_NAME) a ​​poté lze zadat podmínku pomocí klauzule WHERE. Kromě toho může před názvem sloupce předcházet DISTINCT, což znamená, že se budou počítat pouze jedinečné hodnoty. Ve výchozím nastavení se berou v úvahu všechny hodnoty (k tomu můžete konkrétně zadat ne DISTINCT, ale ALL, ale slovo ALL není povinné).

Příklad 1 Existuje firemní databáze s údaji o jejích divizích a zaměstnancích. V tabulce Zaměstnanci je také sloupec s údaji o platech zaměstnanců. Výběr z tabulky vypadá takto (pro zvětšení obrázku na něj klikněte levým tlačítkem myši):

Chcete-li získat součet všech mezd, použijte následující dotaz:

VYBERTE SOUČTU (Plat) OD zaměstnanců

Tento dotaz vrátí hodnotu 287664,63.

A teď . Ve cvičeních již začínáme úkoly komplikovat a přibližovat je těm, se kterými se setkáváme v praxi.

Funkce SQL MIN

Funkce SQL MIN funguje také na sloupcích, jejichž hodnoty jsou čísla a vrací minimum ze všech hodnot ve sloupci. Tato funkce má podobnou syntaxi jako funkce SUM.

Příklad 3 Databáze a tabulka jsou stejné jako v příkladu 1.

Potřebujeme zjistit minimální mzdu pro zaměstnance oddělení číslo 42. K tomu vypisujeme následující požadavek:

Dotaz vrátí hodnotu 10505,90.

A znovu cvičení pro sebeřešení. V tomto a některých dalších cvičeních budete potřebovat nejen tabulku Zaměstnanci, ale také tabulku Org obsahující údaje o divizích společnosti:


Příklad 4. Do tabulky Zaměstnanci je přidána tabulka Org, která obsahuje údaje o odděleních společnosti. Vytiskněte minimální počet let odpracovaných jedním zaměstnancem v oddělení se sídlem v Bostonu.

Funkce SQL MAX

Funkce SQL MAX funguje podobně a má podobnou syntaxi, která se používá, když potřebujete určit maximální hodnotu mezi všemi hodnotami ve sloupci.

Příklad 5.

Potřebujeme zjistit maximální plat zaměstnanců oddělení číslo 42. K tomu napište následující žádost:

Dotaz vrátí hodnotu 18352,80

Je čas cvičení k samostatnému řešení.

Příklad 6. Opět pracujeme se dvěma tabulkami – Staff a Org. Zobrazte název oddělení a maximální hodnotu provize, kterou obdrží jeden pracovník na oddělení patřící do skupiny oddělení (Divize) Východní. Použití JOIN (připojení ke stolům) .

Funkce SQL AVG

To, co je uvedeno ohledně syntaxe pro předchozí popsané funkce, platí také pro funkci SQL AVG. Tato funkce vrací průměr všech hodnot ve sloupci.

Příklad 7. Databáze a tabulka jsou stejné jako v předchozích příkladech.

Předpokládejme, že chcete zjistit průměrnou délku služby zaměstnanců v oddělení číslo 42. K tomu napište následující dotaz:

Výsledek bude 6,33

Příklad 8. Pracujeme s jedním stolem – Staff. Zobrazte průměrnou mzdu zaměstnanců s praxí 4 až 6 let.

Funkce SQL COUNT

Funkce SQL COUNT vrací počet záznamů v databázové tabulce. Pokud v dotazu zadáte SELECT COUNT(COLUMN_NAME) ..., výsledkem bude počet záznamů bez zohlednění těch záznamů, ve kterých je hodnota sloupce NULL (nedefinováno). Pokud jako argument použijete hvězdičku a spustíte dotaz SELECT COUNT(*) ..., výsledkem bude počet všech záznamů (řádků) tabulky.

Příklad 9. Databáze a tabulka jsou stejné jako v předchozích příkladech.

Chcete znát počet všech zaměstnanců, kteří dostávají provize. Počet zaměstnanců, jejichž hodnoty sloupce Comm nejsou NULL, vrátí následující dotaz:

VYBERTE POČET (Komunikace) OD personálu

Výsledkem bude 11.

Příklad 10. Databáze a tabulka jsou stejné jako v předchozích příkladech.

Pokud chcete zjistit celkový počet záznamů v tabulce, použijte dotaz s hvězdičkou jako argument funkce COUNT:

VYBERTE POČET (*) OD zaměstnanců

Výsledkem bude 17.

V dalším cvičení pro samostatné řešení budete muset použít poddotaz.

Příklad 11. Pracujeme s jedním stolem – Staff. Zobrazení počtu zaměstnanců v oddělení plánování (Plains).

Agregační funkce s SQL GROUP BY

Nyní se podívejme na použití agregačních funkcí spolu s příkazem SQL GROUP BY. Příkaz SQL GROUP BY se používá k seskupení výsledných hodnot podle sloupců v databázové tabulce.

Příklad 12. Existuje databáze inzertního portálu. Obsahuje tabulku reklam obsahující údaje o reklamách odeslaných za daný týden. Sloupec Kategorie obsahuje údaje o velkých kategoriích inzerátů (například Nemovitosti) a Sloupec Díly obsahuje údaje o menších částech zařazených do kategorií (například části Byty a Chaty jsou součástí kategorie Nemovitosti). Sloupec Jednotky obsahuje údaje o počtu podaných inzerátů a sloupec Peníze údaje o výši přijatých peněz za podání inzerátu.

KategorieČástJednotkyPeníze
DopravaAuta110 17600
NemovitostByty89 18690
Nemovitostchaty57 11970
DopravaMotocykly131 20960
Konstrukční materiályDesky68 7140
Elektrotechnikatelevizory127 8255
ElektrotechnikaLedničky137 8905
Konstrukční materiályRegips112 11760
Volný časknihy96 6240
NemovitostDoma47 9870
Volný časHudba117 7605
Volný časHry41 2665

Použitím SQL příkaz GROUP BY, zjistěte částku peněz přijatou za zveřejňování reklam v každé kategorii. Píšeme následující žádost.



  • Agregační funkce se používají podobně jako názvy polí v příkazu SELECT, s jednou výjimkou: berou název pole jako argument. S funkcemi SOUČET 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í s ​​poli znaků MAX A MIN přeloží je do ekvivalentu kódu ASCII a zpracuje 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ě.

VYBERTE R1. Disciplína, COUNT(*)

GROUP BY R1.Disciplína;

Výsledek:


VYBERTE R1.Disciplína, POČET (*)

KDE R1. Hodnocení NENÍ NULL

GROUP BY R1.Disciplína;

Výsledek:


nebudou zahrnuty do množiny n-tic před seskupením, takže počet n-tic ve skupině pro disciplínu „Teorie informací“ bude o 1 menší.

Podobný výsledek lze získat, pokud dotaz napíšete následujícím způsobem:

VYBERTE R1. Disciplína, POČET (R1. Hodnocení)

GROUP BY R1. Disciplína;

Funkce POČET (NÁZEV ATRIBUTU) počítá počet konkrétních hodnot ve skupině, na rozdíl od funkce POČET(*), který počítá počet řádků ve skupině. Ve skupině s disciplínou „Teorie informací“ budou skutečně 4 řádky, ale pouze 3 určité hodnoty atribut "Hodnocení".


Pravidla pro zpracování hodnot NULL v agregačních funkcích

Pokud jsou některé hodnoty ve sloupci stejné NULA Při výpočtu výsledku funkce jsou vyloučeny.

Pokud jsou všechny hodnoty ve sloupci stejné NULA, Že Max Min. Součet Prům = NULL počet = 0 (nula).

Pokud je stůl prázdný, počet(*) = 0 .

Můžete také použít agregační funkce 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.

Pravidla pro interpretaci agregačních funkcí

Agregační funkce lze zahrnout do seznamu výstupů a poté je aplikovat na celou tabulku.

VYBERTE MAX (Vyhodnocení) z R1maximální skóre na zasedání;

VYBERTE SOUČET (Skóre) z R1 uvede součet všech známek za relaci;

VYBERTE AVG (hodnocení) z R1 poskytne průměrné skóre za celou relaci.


2; Výsledek: " width="640"

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

SELECT COUNT(*) As Doručeno _ zkoušky

KDE skóre 2;

Výsledek:


Argumenty k agregačním funkcím mohou být samostatné sloupce tabulky. Chcete-li například vypočítat 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ě:

VYBERTE R1.Disciplína, POČET (ODLIŠNÁ R1.Hodnocení)

KDE R1. Hodnocení NENÍ NULL

GROUP BY R1.Disciplína;

Výsledek:


Stejného výsledku dosáhneme, pokud vyloučíme explicitní podmínku v části WHERE, v takovém případě bude dotaz vypadat takto:

VYBERTE R1. Disciplína, POČET (DISTINCT R1. Hodnocení)

GROUP BY R1. Disciplína;

Funkce POČET (ODLIŠNÉ R1.Hodnocení) počítá jen jisté rozličný významy.

Aby bylo možné v tomto případě získat kýžený výsledek, je nutné provést předběžný převod datového typu sloupce „Hodnocení“ a uvést jej na reálný typ, pak výsledkem výpočtu průměru nebude celé číslo. V tomto případě bude žádost vypadat takto:


2 Seskupit podle R2. Skupina, R1. Disciplína; Zde funkce CAST() převede sloupec Score na platný datový typ. "width="640"

Vyberte R2.Group, R1.Discipline,Count(*) jako Total, AVG(cast(Score as decimal(3,1))) jako Average_score

Od R1,R2

kde R1. Celé jméno = R2. Celé jméno a R1. skóre není nulové

a R1. skóre 2

Seskupit podle R2. Skupina, R1. Disciplína;

Tady je funkce OBSAZENÍ() Převede sloupec Hodnocení na platný datový typ.


V klauzuli WHERE nelze použít agregační funkce, protože podmínky v této části se vyhodnocují z hlediska jednoho řádku a agregační funkce se vyhodnocují z hlediska skupin řádků.

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 pole a agregační funkce do jednoho klauzule 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í vytvořený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ích funkcí lze použít k zobrazení odpovídajících výsledků nebo k podmínění výběru skupin.

Pojďme sestavit 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:


1; Výsledek: " width="640"

VYBERTE R2. Skupina

OD R1,R2

KDE R1. Celé jméno = R2. Celé jméno AND

R1. Skóre = 2

SKUPINA PODLE R2.Skupina, R1.Disciplína

HAVING count(*) 1;

Výsledek:


Máme databázi „Banka“ složenou z jedné tabulky F, která uchovává relaci F obsahující informace o účtech v pobočkách určité banky:

Zjistěte celkový zůstatek na účtech v pobočkách. Pro každou z nich můžete provést samostatný dotaz výběrem SUM (Zbývající) z tabulky pro každou větev, ale operace GROUP BY vám umožní umístit je všechny do jednoho příkazu:

VYBRAT Větev , SUM( Zbytek )

GROUP BY Branch;

SKUPINA VYTVOŘENÁ aplikuje agregační funkce nezávisle na každou skupinu identifikovanou hodnotou pole Pobočka. Skupina se skládá z řádků se stejnou hodnotou pole Branch a funkcí SOUČET se uplatňuje samostatně pro každou takovou skupinu, tj. celkový zůstatek účtu se počítá samostatně pro každou pobočku. Hodnota pole, na které se vztahuje SKUPINA VYTVOŘENÁ, podle definice má pouze jednu hodnotu na výstupní skupinu, stejně jako výsledek agregační funkce.


5 000; Argumenty v klauzuli HAVING se řídí stejnými pravidly jako v klauzuli SELECT, která používá GROUP BY . Musí mít jednu hodnotu na výstupní skupinu. "width="640"

Předpokládejme, že vybereme pouze ty pobočky, jejichž celkové zůstatky na účtech přesahují 5 000 USD, a také celkové zůstatky za vybrané pobočky. Chcete-li zobrazit výsledky pro pobočky s celkovými zůstatky nad 5 000 USD, musíte použít MÁME nabídku. Klauzule HAVING určuje kritéria použitá k odstranění určitých skupin z výstupu, stejně jako klauzule WHERE pro jednotlivé řádky.

Správný příkaz by byl:

SELECT větev, SUM(zbývající)

SKUPINA VYTVOŘENÁ Větev

MÁTE SOUČET ( Zbytek ) 5 000;

Argumenty ve větě MÍT dodržovat stejná pravidla jako ve větě VYBRAT kde se používá SKUPINA VYTVOŘENÁ. Musí mít jednu hodnotu na výstupní skupinu.


Následující příkazy budou zakázány:

SELECT Branch,SUM(Zbývající)

SKUPINA PODLE pobočky

HAVING Datum otevření = 27.12.2004 ;

Pole Datum otevření nelze použít ve větě MÍT, protože může mít více než jednu hodnotu na výstupní skupinu. Aby se předešlo takové situaci, návrh MÍT by měl odkazovat pouze na vybrané agregáty a pole SKUPINA VYTVOŘENÁ. Existuje správný způsob, jak provést výše uvedený dotaz:

SELECT Branch,SUM(Zbývající)

WHEREOpenDate = '27/12/2004'

GROUP BY Branch;


Význam této žádosti dále: najděte součet zůstatků pro každou pobočku účtů otevřených 27. prosince 2004.

Jak bylo uvedeno dříve, HAVING může převzít pouze argumenty, které mají jednu hodnotu na výstupní skupinu. V praxi jsou nejběžnější odkazy na agregační funkce, ale platná jsou i pole vybraná pomocí GROUP BY. Chceme například vidět celkové zůstatky na účtech poboček v Petrohradu, Pskově a Urjupinsku:

SELECT větev, SUM(zbývající)

OD F,Q

KDE F. Pobočka = Q. Pobočka

SKUPINA PODLE pobočky

MAJÍCÍ pobočku (‚Petrohrad‘, ‚Pskov‘, ‚Urjupinsk‘);

100 000; Pokud je celkový zůstatek větší než 100 000 $, pak to uvidíme ve výsledném vztahu, jinak dostaneme prázdný vztah. "width="640"

V predikátových aritmetických výrazech obsažených v klauzuli výběru klauzule HAVING lze tedy přímo použít pouze specifikace sloupců určených jako seskupovací sloupce v klauzuli GROUP BY. Zbývající sloupce lze zadat pouze v rámci specifikací agregačních funkcí COUNT, SUM, AVG, MIN a MAX, které v tomto případě vypočítávají nějakou agregovanou hodnotu pro celou skupinu řádků. Výsledkem provedení klauzule HAVING je seskupená tabulka obsahující pouze ty skupiny řádků, pro které je výsledek výpočtu podmínky výběru v klauzuli HAVING TRUE. Zejména pokud je klauzule HAVING přítomna v dotazu, který neobsahuje GROUP BY, bude výsledkem jejího provedení buď prázdný stůl, nebo výsledek provádění předchozích sekcí tabulkového výrazu, které jsou považovány za jednu skupinu bez seskupování sloupců. Podívejme se na příklad. Řekněme, že chceme zobrazit celkovou částku zůstatků napříč všemi pobočkami, ale pouze pokud je vyšší než 100 000 $ V tomto případě náš dotaz nebude obsahovat seskupovací operace, ale bude obsahovat sekci HAVING a bude vypadat takto:

VYBERTE SOUČET( Zbytek )

MÁTE SOUČET ( Zbytek ) 100 000;

Pokud je celkový zůstatek větší než 100 000 $, pak to uvidíme ve výsledném vztahu, jinak dostaneme prázdný vztah.


Použití agregačních funkcí

SQL definuje mnoho vestavěných funkcí různých kategorií, mezi nimiž zvláštní místo zaujímají agregační funkce, které pracují s hodnotami sloupců mnoha řádků a vracejí jedinou hodnotu. Argumenty agregačních funkcí mohou být jak sloupce tabulky, tak výsledky výrazů nad nimi. Samotné agregované funkce lze zahrnout do jiných aritmetických výrazů. Následující tabulka ukazuje nejčastěji používané standardní unární agregační funkce.


Obecný formát unární agregační funkce je následující:

název_funkce([VŠECHNY | DISTINCT] výraz)

kde DISTINCT označuje, že funkce by měla pouze uvažovat různé významy argument a ALL - všechny hodnoty, včetně duplikátů (tato možnost se používá ve výchozím nastavení). Například, Funkce AVG s klíčovým slovem DISTINCT pro řádky sloupců s hodnotami 1, 1, 1 a 3 vrátí 2 a s klíčovým slovem ALL vrátí 1,5.

Agregační funkce se používají v klauzulích SELECT a HAVING. Zde se podíváme na jejich použití v klauzuli SELECT. V tomto případě se výraz v argumentu funkce vztahuje na všechny řádky ve vstupní tabulce klauzule SELECT. Kromě toho nemůžete v klauzuli SELECT používat agregační funkce i sloupce tabulky (nebo výrazy s nimi), pokud nemáte klauzuli GROUP BY, na kterou se podíváme v další části.

Funkce COUNT má dva formáty. V prvním případě je vrácen počet řádků ve vstupní tabulce, ve druhém případě je vrácen počet hodnot argumentů ve vstupní tabulce:

  • POČET(*)
  • POČET(výraz)

Nejjednodušším způsobem použití této funkce je spočítat počet řádků v tabulce (všech nebo těch, které splňují zadanou podmínku). K tomu se používá první možnost syntaxe.

Dotaz: Počet typů produktů, pro které jsou dostupné informace v databázi.

SELECT COUNT(*) AS "Počet typů produktů"

OD Produktu

Druhá verze syntaxe funkce COUNT může mít jako argument název jednoho sloupce. V tomto případě se počítá buď všech hodnot v tomto sloupci vstupní tabulky, nebo pouze neopakujících se (pomocí klíčového slova DISTINCT).

Dotaz: Počet odlišných jmen obsažených v tabulce Zákazník.

VYBRAT POČET (DISTINCT FNAME)

OD ZÁKAZNÍKA

Použití dalších unárních agregačních funkcí je podobné jako COUNT, s výjimkou MIN a MAX využití Klíčová slova DISTINCT a ALL jsou bezvýznamná. S funkcemi COUNT, MAX a MIN lze kromě číselných polí použít i pole znaků. Pokud argument agregační funkce neobsahuje žádné hodnoty, Funkce COUNT vrátí 0 a všechny ostatní - Hodnota NULL.

SELECT MAX (OrdDate)

Z

KDE Datum objednávky"1.09.2010"

Zadání pro samostatná práce: Formulujte dotazy v SQL pro získání následujících dat:

  • Celkové náklady na všechny objednávky;
  • Počet různých měst obsažených v tabulce Zákazník.



Horní