Čo má súčet sql. SELECT príkaz HAVING sekcia. Sami napíšte dotazy pomocou príkazu SQL HAVING a potom sa pozrite na riešenia

Vo svojom arzenáli má mnoho výkonných nástrojov na manipuláciu s dátami uloženými vo forme tabuliek.

Jedným z týchto nástrojov je nepochybne možnosť zoskupovať údaje pri ich vzorkovaní podľa určitého kritéria. HAVING spolu s operátorom WHERE umožňuje určiť podmienky pre výber údajov, ktoré už boli nejakým spôsobom zoskupené.

HAVING SQL parameter: popis

V prvom rade je potrebné poznamenať, že tento parameter je voliteľný a používa sa výlučne v spojení s parametrom GROUP BY. Ako si pamätáte, GROUP BY sa používa, keď sa v SELECTe používajú agregačné funkcie a výsledky ich výpočtov je potrebné získať pre určité skupiny. Ak WHERE umožňuje nastaviť podmienky výberu pred zoskupením údajov, potom HAVING obsahuje podmienky týkajúce sa údajov priamo v samotných skupinách. Pre lepšie pochopenie sa pozrime na príklad s obvodom znázorneným na obrázku nižšie.

Toto je vynikajúci príklad, ktorý poskytuje popis HAVING SQL. Je uvedená tabuľka so zoznamom názvov produktov, spoločností, ktoré ich vyrábajú, a niektorých ďalších oblastí. V dotaze v pravom hornom rohu sa snažíme získať informáciu o tom, koľko produktov každá firma vyrába a vo výsledku chceme zobraziť len tie firmy, ktoré vyrábajú viac ako 2 položky. Parameter GROUP BY vytvoril tri skupiny zodpovedajúce názvom firiem, pre každú z nich bol vypočítaný počet produktov (riadkov). Ale parameter HAVING svojou podmienkou odrezal jednu skupinu z výslednej vzorky, keďže nespĺňala podmienku. Výsledkom sú dve skupiny zodpovedajúce spoločnostiam s 5 a 3 výrobnými množstvami.

Niekto by sa mohol čudovať, prečo používať HAVING, keď SQL má WHERE. Ak by sme použili WHERE, pozeralo by sa to na celkový počet riadkov v tabuľke, nie podľa skupín a podmienka by v tomto prípade nedávala zmysel. Pomerne často však dokonale koexistujú v jednej žiadosti.

Vo vyššie uvedenom príklade vidíme, ako sa údaje najskôr vyberú podľa mien zamestnancov zadaných v parametri WHERE a potom prejde výsledok zoskupený v GROUP BY dodatočná kontrola podľa výšky mzdy pre každého zamestnanca.

Parameter SQL HAVING: príklady, syntax

Pozrime sa na niektoré funkcie syntaxe HAVING SQL. Popis tohto parametra je pomerne jednoduchý. Po prvé, ako už bolo uvedené, používa sa výlučne v spojení s parametrom GROUP BY a je špecifikovaný bezprostredne za ním a pred ORDER BY, ak je v požiadavke uvedený. Je to pochopiteľné, keďže HAVING definuje podmienky pre už zoskupené údaje. Po druhé, v podmienke tohto parametra možno použiť iba agregačné funkcie a polia špecifikované v parametri GROUP BY. Všetky podmienky v tento parameter sú špecifikované presne rovnakým spôsobom ako v prípade WHERE.

Záver

Ako vidíte, nie je na tom nič zložité daný operátor Nie Sémanticky sa používa rovnako ako WHERE. Je dôležité pochopiť, že WHERE sa používa s ohľadom na všetky vybrané údaje a HAVING sa používa iba s ohľadom na skupiny definované v parametri GROUP BY. Predstavili sme komplexný popis HAVING SQL, ktorý je dostatočný na to, aby ste s ním mohli s istotou pracovať.

Ako zistím počet modelov PC vyrobených konkrétnym dodávateľom? Ako určiť priemernú cenu počítačov, ktoré majú to isté technické údaje? Na tieto a mnohé ďalšie otázky súvisiace s niektorými štatistickými informáciami možno odpovedať pomocou konečné (agregované) funkcie. Norma poskytuje nasledujúce agregačné funkcie:

Všetky tieto funkcie vracajú jednu hodnotu. Zároveň funkcie COUNT, MIN A MAX použiteľné pre akýkoľvek typ údajov, pričom SUM A AVG sa používajú iba pre číselné polia. Rozdiel medzi funkciami COUNT(*) A COUNT(<имя поля>) je, že druhý neberie pri výpočte do úvahy hodnoty NULL.

Príklad. Nájdite minimálnu a maximálnu cenu osobných počítačov:

Príklad. Nájdite dostupný počet počítačov vyrobených výrobcom A:

Príklad. Ak nás zaujíma množstvo rôzne modely, vyrobený výrobcom A, potom môže byť dotaz formulovaný nasledovne (s využitím skutočnosti, že v tabuľke Produkt je každý model zaznamenaný raz):

Príklad. Zistite počet dostupných rôznych modelov vyrobených výrobcom A. Dotaz je podobný predchádzajúcemu, v ktorom bolo potrebné určiť celkový počet modelov vyrobených výrobcom A. Tu je tiež potrebné zistiť počet rôznych modelov v PC stolík (t. j. tie, ktoré sú dostupné na predaj).

Aby sa zabezpečilo, že pri získavaní štatistických ukazovateľov sa použijú iba jedinečné hodnoty argument agregované funkcie môže byť použité DISTINCT parameter. Ďalší parameter ALL je predvolená hodnota a predpokladá, že sa spočítajú všetky vrátené hodnoty v stĺpci. operátor,

Ak potrebujeme získať počet vyrobených modelov PC každý výrobcu, budete musieť použiť klauzula GROUP BY, syntakticky nasleduje klauzuly WHERE.

klauzula GROUP BY

klauzula GROUP BY používa sa na definovanie skupín výstupných riadkov, na ktoré možno použiť súhrnné funkcie (COUNT, MIN, MAX, AVG a SUM). Ak táto klauzula chýba a sú použité agregačné funkcie, potom všetky stĺpce s názvami uvedenými v VYBRAŤ, musia byť zahrnuté v agregované funkcie a tieto funkcie sa použijú na celú množinu riadkov, ktoré spĺňajú predikát dotazu. V opačnom prípade všetky stĺpce zoznamu SELECT nezahŕňa v agregovaných funkciách musia byť špecifikované v klauzule GROUP BY. Výsledkom je, že všetky riadky výstupných dotazov sú rozdelené do skupín charakterizovaných rovnakými kombináciami hodnôt v týchto stĺpcoch. Potom budú agregované funkcie aplikované na každú skupinu. Upozorňujeme, že pre GROUP BY sa všetky hodnoty NULL považujú za rovnaké, t.j. pri zoskupení podľa poľa obsahujúceho hodnoty NULL budú všetky takéto riadky spadať do jednej skupiny.
Ak ak existuje klauzula GROUP BY, v klauzule SELECT žiadne agregované funkcie, potom dotaz jednoducho vráti jeden riadok z každej skupiny. Túto funkciu spolu s kľúčovým slovom DISTINCT možno použiť na odstránenie duplicitných riadkov v množine výsledkov.
Pozrime sa na jednoduchý príklad:
SELECT model, COUNT(model) AS Množstvo_model, AVG(cena) AS Priemerná_cena
Z PC
GROUP BY model;

V tejto žiadosti je pre každý model PC určený ich počet a priemerná cena. Všetky riadky s rovnakou hodnotou modelu tvoria skupinu a výstup SELECT vypočíta počet hodnôt a priemerné hodnoty cien pre každú skupinu. Výsledkom dotazu bude nasledujúca tabuľka:
Model Model_množstva Priemerná_cena
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Ak by mal SELECT stĺpec dátum, potom by bolo možné vypočítať tieto ukazovatele pre každý konkrétny dátum. Ak to chcete urobiť, musíte pridať dátum ako stĺpec zoskupenia a potom by sa agregované funkcie vypočítali pre každú kombináciu hodnôt (dátum modelu).

Špecifických je viacero pravidlá pre vykonávanie agregovaných funkcií:

  • Ak v dôsledku žiadosti neboli prijaté žiadne riadky(alebo viac ako jeden riadok pre danú skupinu), potom neexistujú žiadne zdrojové údaje na výpočet žiadnej zo súhrnných funkcií. V tomto prípade bude výsledok funkcií COUNT nula a výsledok všetkých ostatných funkcií bude NULL.
  • Argumentovať agregátna funkcia nemôže obsahovať agregované funkcie(funkcia z funkcie). Tie. v jednom dotaze je povedzme nemožné získať maximum priemerných hodnôt.
  • Výsledkom vykonania funkcie COUNT je celé číslo(INTEGER). Ostatné agregačné funkcie dedia dátové typy hodnôt, ktoré spracúvajú.
  • Ak funkcia SUM vytvorí výsledok, ktorý je väčší ako maximálna hodnota použitého typu údajov, chyba.

Ak teda žiadosť neobsahuje klauzuly GROUP BY, To agregované funkcie zahrnuté v klauzula SELECT, sa vykonajú vo všetkých výsledných riadkoch dotazu. Ak žiadosť obsahuje klauzula GROUP BY, každá sada riadkov, ktorá má rovnaké hodnoty stĺpca alebo skupiny stĺpcov špecifikovaných v klauzula GROUP BY, tvorí skupinu a agregované funkcie sa vykonávajú pre každú skupinu samostatne.

MAJTE ponuku

Ak klauzula WHERE potom definuje predikát na filtrovanie riadkov MAJTE ponuku platí po zoskupení na definovanie podobného predikátu, ktorý filtruje skupiny podľa hodnôt agregované funkcie. Táto klauzula je potrebná na overenie hodnôt, ktoré sa získajú pomocou agregátna funkcia nie z jednotlivých riadkov zdroja záznamov definovaných v doložka FROM, a od skupiny takýchto liniek. Preto takáto kontrola nemôže byť obsiahnutá klauzula WHERE.

Klauzula HAVING sa používa v kombinácii s klauzulou GROUP BY. Môže sa použiť v príkaze SELECT na filtrovanie záznamov vrátených klauzulou GROUP BY.

Syntax klauzuly HAVING

agregovaná_funkcia môže byť funkcia ako SUM, COUNT, MIN alebo MAX.

Príklad použitia funkcie SUM
Môžete napríklad použiť funkciu SUM na vyhľadanie názvu oddelenia a sumy predaja (pre príslušné oddelenia). Ponuka HAVING môže vybrať len tie oddelenia, ktorých tržby sú vyššie ako 1000 USD.

SELECT oddelenie, SUM(predaj) AS "Celkovy predaj" FROM order_details GROUP BY oddelenie HAVING SUM(predaj) > 1000 ;

Príklad použitia funkcie COUNT
Pomocou funkcie COUNT môžete napríklad získať názov oddelenia a počet zamestnancov (v príslušnom oddelení), ktorí zarobili viac ako 25 000 USD ročne. Návrh HAVING vyberie len tie oddelenia, kde je viac ako 10 takýchto zamestnancov.

Príklad použitia funkcie MIN
Môžete napríklad použiť funkciu MIN na vrátenie názvu oddelenia a minimálneho príjmu pre toto oddelenie. Návrh HAVING vráti iba tie oddelenia, ktorých príjmy začínajú na 35 000 USD.

VYBRAŤ oddelenie, MIN(plat) AKO "Najnižší plat" OD zamestnancov SKUPINA PODĽA oddelenia MAJÚCI MIN(plat) = 35000 ;

Príklad použitia funkcie MAX
Funkciu môžete použiť napríklad aj na získanie názvu oddelenia a maximálneho príjmu oddelenia. Návrh HAVING vráti iba tie oddelenia, ktorých maximálny príjem je nižší ako 50 000 USD.

VYBERTE oddelenie, MAX (plat) AKO "Najvyšší plat" OD zamestnancov SKUPINA PODĽA oddelenia MAJÚ MAX (plat)< 50000 ;

Posledná aktualizácia: 19.07.2017

T-SQL používa na zoskupenie údajov príkazy GROUP BY a HAVING pomocou nasledujúcej formálnej syntaxe:

VYBERTE stĺpce z tabuľky

GROUP BY

Klauzula GROUP BY určuje, ako budú riadky zoskupené.

Zoraďme produkty napríklad podľa výrobcu

SELECT Výrobca, COUNT(*) AS ModelsCount FROM Products GROUP BY Výrobca

Prvý stĺpec v príkaze SELECT - Výrobca predstavuje názov skupiny a druhý stĺpec - ModelsCount predstavuje výsledok funkcie Count, ktorá počíta počet riadkov v skupine.

Stojí za zváženie, že každý stĺpec, ktorý sa používa v príkaze SELECT (nepočítajúc stĺpce, v ktorých sú uložené výsledky agregačných funkcií), musí byť špecifikovaný za klauzulou GROUP BY. Takže napríklad vo vyššie uvedenom prípade je stĺpec Výrobca špecifikovaný v klauzulách SELECT aj GROUP BY.

A ak príkaz SELECT vyberá jeden alebo viac stĺpcov a používa aj agregačné funkcie, musíte použiť klauzulu GROUP BY. Nasledujúci príklad teda nebude fungovať, pretože neobsahuje výraz zoskupenia:

SELECT Výrobca, COUNT(*) AS ModelyPočet FROM produktov

Ďalší príklad, pridajte zoskupenie podľa počtu produktov:

SELECT Výrobca, ProductCount, COUNT(*) AS ModelsCount FROM Products GROUP BY Výrobca, ProductCount

Klauzula GROUP BY môže zoskupovať do viacerých stĺpcov.

Ak stĺpec, podľa ktorého zoskupujete, obsahuje hodnotu NULL, riadky s hodnotou NULL vytvoria samostatnú skupinu.

Upozorňujeme, že klauzula GROUP BY musí nasledovať za klauzulou WHERE, ale pred klauzulou ORDER BY:

SELECT Výrobca, COUNT(*) AS ModelyPočet FROM Products WHERE Cena > 30000 GROUP BY Výrobca OBJEDNAŤ PODĽA modelovPočet DESC

Skupinové filtrovanie. MAJÚCE

Operátor MAJÚCE určuje, ktoré skupiny budú zahrnuté do výsledku výstupu, to znamená, že skupiny filtruje.

Použitie HAVING je v mnohom podobné ako použitie WHERE. Iba WHERE sa používa na filtrovanie riadkov, HAVING sa používa na filtrovanie skupín.

Napríklad, nájdime všetky skupiny produktov podľa výrobcu, pre ktoré je definovaných viac ako 1 model:

SELECT Výrobca, COUNT(*) AS ModelsCount FROM Products GROUP BY Výrobca HAVING COUNT(*) > 1

V tomto prípade môžeme v jednom príkaze použiť výrazy WHERE a HAVING:

SELECT Výrobca, COUNT(*) AS ModelsCount FROM Products WHERE Cena * ProductCount > 80000 GROUP BY Manufacturer HAVING COUNT(*) > 1

To znamená, že v tomto prípade sa riadky najskôr filtrujú: vyberú sa tie produkty, ktorých celkové náklady sú vyššie ako 80 000. Potom sa vybrané produkty zoskupia podľa výrobcu. A potom sa filtrujú samotné skupiny – vyberú sa tie skupiny, ktoré obsahujú viac ako 1 model.

Ak je potrebné triediť, za výrazom HAVING nasleduje výraz ORDER BY:

SELECT Výrobca, COUNT(*) AS Models, SUM(ProductCount) AS Units FROM Products WHERE Cena * ProductCount > 80000 GROUP BY Manufacturer HAVING SUM(ProductCount) > 2 ORDER BY Units DESC

V tomto prípade je zoskupenie podľa výrobcu a tiež sa vyberá počet modelov pre každého výrobcu (Models) a celkový počet všetkých produktov pre všetky tieto modely (Units). Na konci sú skupiny zoradené podľa počtu produktov v zostupnom poradí.

V predchádzajúcom článku sme sa pozreli. Tam som napísal, že táto konštrukcia umožňuje vybrať samostatné skupiny a pre každú skupinu vypočítať funkcie špecifikované po VYBRAŤ. A MAJÚCE umožňuje podľa výsledkov vykonávania funkcií odfiltrovať nepotrebné riadky zo skupín. Pozrime sa na to podrobnejšie.

Spomeňme si na náš predchádzajúci problém, kde sme vypočítali priemernú cenu mlieka pre konkrétnu sieť supermarketov. Nepozerajme sa len na priemernú cenu, ale uvádzame len tie siete supermarketov, kde priemerná cena pod 38.

Na toto filtrovanie na základe výsledkov vykonania agregačnej funkcie používame v príkaze SQL HAVING:

VYBERTE `obchod_id`, AVG(`cena`) Z `tabuľky` GROUP BY `id_obchodu` S AVG(`cena`)< 38

V dôsledku toho namiesto toho 4 budeme mať len linky 3 :

shop_id AVG(`cena`)
1 37.5
2 36.0
3 37.0

Ak návrhy GROUP BY vtedy to nebude MAJÚCE sa nebude vzťahovať na konkrétnu skupinu, ale na celú vzorku. To znamená, že ak je podmienka MAJÚCE sa vykoná, nebude to mať žiadny účinok. A ak sa nevykoná, nebude existovať jediný výsledný riadok.