Co je s sum sql. SELECT příkaz HAVING sekce. Napište dotazy pomocí příkazu SQL HAVING sami a poté se podívejte na řešení

Ve svém arzenálu má mnoho výkonných nástrojů pro manipulaci s daty uloženými ve formě tabulek.

Jedním z těchto nástrojů je nepochybně možnost seskupovat data při jejich vzorkování podle určitého kritéria. HAVING spolu s operátorem WHERE umožňuje určit podmínky pro výběr dat, která již byla nějakým způsobem seskupena.

HAVING SQL parametr: popis

V první řadě stojí za zmínku, že tento parametr je volitelný a používá se výhradně ve spojení s parametrem GROUP BY. Jak si pamatujete, GROUP BY se používá, když se v SELECTu používají agregační funkce a výsledky jejich výpočtů je třeba získat pro konkrétní skupiny. Pokud WHERE umožňuje nastavit podmínky výběru před seskupením dat, pak HAVING obsahuje podmínky týkající se dat přímo v samotných skupinách. Pro lepší pochopení se podívejme na příklad s obvodem uvedeným na obrázku níže.

Toto je vynikající příklad, který poskytuje popis HAVING SQL. Je uvedena tabulka se seznamem názvů produktů, společností, které je vyrábějí, a některých dalších oborů. V dotazu v pravém horním rohu se snažíme získat informaci o tom, kolik produktových položek každá firma vyrábí a ve výsledku chceme zobrazit pouze firmy, které vyrábějí více než 2 položky. Parametr GROUP BY tvořil tři skupiny odpovídající názvům firem, pro každou z nich byl vypočten počet produktů (řádků). Ale parametr HAVING svou podmínkou odřízl jednu skupinu z výsledného vzorku, protože podmínku nesplňovala. Výsledkem jsou dvě skupiny odpovídající podnikům s 5 a 3 výrobními množstvími.

Někdo by se mohl divit, proč používat HAVING, když SQL má WHERE. Pokud bychom použili WHERE, hledělo by to na celkový počet řádků v tabulce, nikoli na skupiny, a podmínka by v tomto případě nedávala smysl. Dost často však dokonale koexistují v jedné žádosti.

Ve výše uvedeném příkladu vidíme, jak jsou data nejprve vybrána podle jmen zaměstnanců uvedených v parametru WHERE a poté prochází výsledek seskupený do GROUP BY dodatečná kontrola podle výše mzdy pro každého zaměstnance.

Parametr SQL HAVING: příklady, syntaxe

Podívejme se na některé funkce syntaxe HAVING SQL. Popis tohoto parametru je celkem jednoduchý. Za prvé, jak již bylo uvedeno, používá se výhradně ve spojení s parametrem GROUP BY a je specifikován bezprostředně za ním a před ORDER BY, pokud je v požadavku uveden. To je pochopitelné, protože HAVING definuje podmínky pro již seskupená data. Za druhé, v podmínce tohoto parametru lze použít pouze agregační funkce a pole specifikovaná v parametru GROUP BY. Všechny podmínky v tento parametr jsou specifikovány přesně stejným způsobem jako v případě WHERE.

Závěr

Jak vidíte, není na tom nic složitého daný operátor Ne. Sémanticky se používá stejně jako WHERE. Je důležité pochopit, že WHERE se používá s ohledem na všechna vybraná data a HAVING se používá pouze s ohledem na skupiny definované v parametru GROUP BY. Představili jsme obsáhlý popis HAVING SQL, který stačí k tomu, abyste s ním mohli sebevědomě pracovat.

Jak zjistím počet modelů PC vyrobených konkrétním dodavatelem? Jak zjistit průměrnou cenu počítačů, které mají stejné Specifikace? Tyto a mnohé další otázky související s některými statistickými informacemi lze zodpovědět pomocí finální (agregátní) funkce. Standard poskytuje následující agregační funkce:

Všechny tyto funkce vracejí jedinou hodnotu. Zároveň funkce POČET, MIN A MAX použitelné pro jakýkoli typ dat, zatímco SOUČET A AVG se používají pouze pro číselná pole. Rozdíl mezi funkcí POČET(*) A POČET(<имя поля>) je, že druhý nezohledňuje při výpočtu hodnoty NULL.

Příklad. Najděte minimální a maximální cenu osobních počítačů:

Příklad. Najděte dostupný počet počítačů vyrobených výrobcem A:

Příklad. Pokud nás zajímá množství různé modely, vyrobený výrobcem A, pak lze dotaz formulovat následovně (s využitím skutečnosti, že v tabulce Produkt je každý model zaznamenán jednou):

Příklad. Najděte počet dostupných různých modelů vyrobených výrobcem A. Dotaz je podobný předchozímu, ve kterém bylo požadováno zjistit celkový počet modelů vyrobených výrobcem A. Zde je také potřeba zjistit počet různých modelů v PC stůl (tj. ty, které jsou k dispozici na prodej).

Aby bylo zajištěno, že při získávání statistických ukazatelů budou použity pouze jedinečné hodnoty, když argument agregační funkce může být použito Parametr DISTINCT. Další parametr VŠECHNY je výchozí a předpokládá, že se započítají všechny vrácené hodnoty ve sloupci. Operátor,

Pokud potřebujeme získat počet vyrobených modelů PC každý výrobce, budete muset použít klauzule GROUP BY, syntakticky následující věty WHERE.

klauzule GROUP BY

klauzule GROUP BY používá se k definování skupin výstupních linek, na které lze použít agregační funkce (COUNT, MIN, MAX, AVG a SUM). Pokud tato klauzule chybí a jsou použity agregační funkce, pak všechny sloupce s názvy uvedenými v VYBRAT, měla by být zahrnuta v agregační funkce a tyto funkce budou aplikovány na celou sadu řádků, které splňují predikát dotazu. Jinak všechny sloupce seznamu SELECT není v ceně v agregačních funkcích musí být specifikováno v doložce GROUP BY. V důsledku toho jsou všechny řádky výstupního dotazu rozděleny do skupin charakterizovaných stejnými kombinacemi hodnot v těchto sloupcích. Poté budou agregační funkce aplikovány na každou skupinu. Vezměte prosím na vědomí, že pro GROUP BY jsou všechny hodnoty NULL považovány za stejné, tj. při seskupování podle pole obsahujícího hodnoty NULL budou všechny takové řádky spadat do jedné skupiny.
Li pokud existuje klauzule GROUP BY, v klauzuli SELECT žádné agregační funkce, pak dotaz jednoduše vrátí jeden řádek z každé skupiny. Tuto funkci lze spolu s klíčovým slovem DISTINCT použít k odstranění duplicitních řádků v sadě výsledků.
Podívejme se na jednoduchý příklad:
SELECT model, COUNT(model) AS Množství_model, AVG(cena) AS Prům._cena
Z PC
GROUP BY modelu;

V této žádosti je pro každý model PC stanoven jejich počet a průměrné náklady. Všechny řádky se stejnou hodnotou modelu tvoří skupinu a výstup SELECT vypočítá počet hodnot a průměrné hodnoty cen pro každou skupinu. Výsledkem dotazu bude následující tabulka:
Modelka Model_množství Průměrná_cena
1121 3 850.0
1232 4 425.0
1233 3 843.33333333333337
1260 1 350.0

Pokud by měl SELECT sloupec datum, pak by bylo možné tyto ukazatele vypočítat pro každé konkrétní datum. Chcete-li to provést, musíte přidat datum jako sloupec seskupení a pak by se agregační funkce vypočítaly pro každou kombinaci hodnot (model-date).

Existuje několik konkrétních pravidla pro provádění agregačních funkcí:

  • Pokud v důsledku žádosti nebyly přijaty žádné řádky(nebo více než jeden řádek pro danou skupinu), pak neexistují žádná zdrojová data pro výpočet žádné z agregačních funkcí. V tomto případě bude výsledek funkcí COUNT nula a výsledek všech ostatních funkcí bude NULL.
  • Argument agregační funkce nemůže sám obsahovat agregační funkce(funkce z funkce). Tito. v jednom dotazu je řekněme nemožné získat maximum průměrných hodnot.
  • Výsledek provedení funkce COUNT je celé číslo(CELÉ ČÍSLO). Jiné agregační funkce dědí datové typy hodnot, které zpracovávají.
  • Pokud funkce SUM vytvoří výsledek, který je větší než maximální hodnota použitého datového typu, chyba.

Pokud tedy žádost neobsahuje GROUP BY klauzule, Že agregační funkce obsažen v klauzule SELECT, jsou prováděny na všech výsledných řádcích dotazu. Pokud žádost obsahuje klauzule GROUP BY, každá sada řádků, která má stejné hodnoty jako sloupec nebo skupina sloupců zadaná v klauzule GROUP BY, tvoří skupinu a agregační funkce se provádí pro každou skupinu zvlášť.

MÁME nabídku

Li klauzule WHERE definuje predikát pro filtrování řádků MÁME nabídku platí po seskupení k definování podobného predikátu, který filtruje skupiny podle hodnot agregační funkce. Tato klauzule je potřebná k ověření hodnot, které jsou získány pomocí agregační funkce nikoli z jednotlivých řádků zdroje záznamů definovaného v klauzule FROM a od skupiny takových linek. Takovou kontrolu tedy nelze obsáhnout klauzule WHERE.

Klauzule HAVING se používá v kombinaci s klauzulí GROUP BY. Lze jej použít v příkazu SELECT k filtrování záznamů vrácených klauzulí GROUP BY.

Syntaxe klauzule HAVING

agregační_funkce může být funkce jako SUM, COUNT, MIN nebo MAX.

Příklad použití funkce SUM
Pomocí funkce SUM můžete například vyhledat název oddělení a částku prodeje (pro příslušná oddělení). Nabídka HAVING může vybrat pouze ta oddělení, jejichž tržby jsou vyšší než 1000 USD.

SELECT oddělení, SUM(prodej) AS "Celkový prodej" FROM order_details GROUP BY oddělení HAVING SUM(prodej) > 1000 ;

Příklad použití funkce COUNT
Pomocí funkce COUNT můžete například získat název oddělení a počet zaměstnanců (v příslušném oddělení), kteří vydělali více než 25 000 USD za rok. Návrh HAVING vybere pouze ta oddělení, kde je více než 10 takových zaměstnanců.

Příklad použití funkce MIN
Můžete například použít funkci MIN k vrácení názvu oddělení a minimálního příjmu pro toto oddělení. Návrh HAVING vrátí pouze ta oddělení, jejichž příjmy začínají na 35 000 USD.

SELECT oddělení, MIN(plat) JAKO "Nejnižší plat" OD zaměstnanců GROUP BY oddělení HAVING MIN(plat) = 35000 ;

Příklad použití funkce MAX
Funkci můžete také použít například k načtení názvu oddělení a maximálního příjmu oddělení. Návrh HAVING vrátí pouze ta oddělení, jejichž maximální příjem je nižší než 50 000 USD.

VYBERTE oddělení, MAX (plat) JAKO "Nejvyšší plat" OD zaměstnanců SEKUPINY PODLE oddělení MAJÍCÍ MAX (plat)< 50000 ;

Poslední aktualizace: 19.07.2017

T-SQL používá k seskupování dat příkazy GROUP BY a HAVING pomocí následující formální syntaxe:

SELECT sloupce FROM tabulky

SKUPINA VYTVOŘENÁ

Klauzule GROUP BY určuje, jak budou řádky seskupeny.

Seskupme produkty například podle výrobce

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

První sloupec v příkazu SELECT - Výrobce představuje název skupiny a druhý sloupec - ModelsCount představuje výsledek funkce Count, která vypočítá počet řádků ve skupině.

Stojí za zvážení, že každý sloupec, který je použit v příkazu SELECT (nepočítaje sloupce, které ukládají výsledek agregačních funkcí), musí být uveden za klauzuli GROUP BY. Takže například ve výše uvedeném případě je sloupec Výrobce uveden v klauzuli SELECT i GROUP BY.

A pokud příkaz SELECT vybírá jeden nebo více sloupců a také používá agregační funkce, musíte použít klauzuli GROUP BY. Následující příklad tedy nebude fungovat, protože neobsahuje seskupovací výraz:

SELECT Výrobce, COUNT(*) AS ModelsCount FROM produktů

Další příklad, přidejte seskupení podle počtu produktů:

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

Klauzule GROUP BY se může seskupit do více sloupců.

Pokud sloupec, ve kterém seskupujete, obsahuje hodnotu NULL, budou řádky s hodnotou NULL tvořit samostatnou skupinu.

Všimněte si, že klauzule GROUP BY musí následovat po klauzuli WHERE, ale před klauzuli ORDER BY:

SELECT Výrobce, COUNT(*) AS ModelsCount FROM Products WHERE Cena > 30000 GROUP BY Výrobce ORDER BY ModelsCount DESC

Skupinové filtrování. MÍT

Operátor MÍT určuje, které skupiny budou zahrnuty do výsledku výstupu, to znamená, že skupiny filtruje.

Použití HAVING je v mnoha ohledech podobné použití WHERE. Pouze WHERE se používá k filtrování řádků, HAVING se používá k filtrování skupin.

Pojďme například najít všechny skupiny produktů podle výrobce, pro které je definován více než 1 model:

VYBRAT výrobce, POČET(*) JAKO ModelyPočet FROM Produkty GROUP BY Výrobce HAVING COUNT(*) > 1

V tomto případě můžeme v jednom příkazu použít výrazy WHERE a HAVING:

VYBERTE výrobce, POČET(*) JAKO ModelyPočet FROM Produkty, KDE Cena * Počet produktů > 80000 GROUP BY Výrobce HAVING COUNT(*) > 1

To znamená, že v tomto případě jsou řádky nejprve filtrovány: jsou vybrány ty produkty, jejichž celkové náklady jsou vyšší než 80 000. Poté jsou vybrané produkty seskupeny podle výrobce. A pak se filtrují samotné skupiny – vyberou se ty skupiny, které obsahují více než 1 model.

Pokud je nutné třídit, pak za výrazem HAVING následuje výraz ORDER BY:

VYBERTE výrobce, COUNT(*) AS Modely, SUM(ProductCount) AS Units FROM Products WHERE Cena * ProductCount > 80000 GROUP BY Výrobce HAVING SUM(ProductCount) > 2 ORDER BY Units DESC

V tomto případě je seskupení podle výrobce a je také vybrán počet modelů pro každého výrobce (Models) a celkový počet všech produktů pro všechny tyto modely (Units). Na konci jsou skupiny seřazeny podle počtu produktů v sestupném pořadí.

V předchozím článku jsme se podívali. Tam jsem napsal, že tato konstrukce umožňuje vybrat samostatné skupiny a pro každou skupinu vypočítat funkce specifikované poté VYBRAT. A MÍT umožňuje podle výsledků provádění funkcí odfiltrovat nepotřebné řádky ze skupin. Podívejme se na to podrobněji.

Vzpomeňme na náš předchozí problém, kdy jsme počítali průměrnou cenu mléka pro konkrétní řetězec supermarketů. Nedívejme se jen na průměrnou cenu, ale uveďme pouze ty řetězce supermarketů, kde průměrná cena pod 38.

Pro toto filtrování na základě výsledků provádění agregační funkce používáme v SQL příkazu HAVING:

VYBERTE `obchod_id`, AVG(`cena`) Z `tabulky` GROUP BY `id_obchodu` S AVG(`cena`)< 38

V důsledku toho místo toho 4 budeme mít jen linky 3 :

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

Pokud návrhy SKUPINA VYTVOŘENÁ pak to nebude MÍT se nebude vztahovat na konkrétní skupinu, ale na celý vzorek. To znamená, že pokud podm MÍT bude proveden, nebude mít žádný účinek. A pokud nebude proveden, nebude existovat jediný výsledný řádek.