Co je v sql. Příkaz SQL HAVING - agregované funkční hodnoty, které vás zajímají. klauzule GROUP BY

💖 Líbí se vám? Sdílejte odkaz se svými přáteli

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 POČET 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.

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

Nakonec je poslední sekce použitá k vyhodnocení tabulkového výrazu MÍT(pokud je přítomen).

Kapitola MÍT se může v tabulkovém výrazu smysluplně objevit pouze v případě, že obsahuje sekci SKUPINA VYTVOŘENÁ. Podmínka vyhledávání v této části určuje podmínku pro skupinu řádků ve seskupené tabulce. Formálně oddíl MÍT může být také přítomen v tabulkovém výrazu, který neobsahuje SKUPINA VYTVOŘENÁ. V tomto případě se předpokládá, že výsledkem výpočtu předchozích oddílů je seskupená tabulka skládající se z jediné skupiny bez vyhrazených seskupovacích sloupců.

Podmínka hledání sekce MÍT je sestavena podle stejných syntaktických pravidel jako podmínka hledání sekce KDE a může obsahovat stejné predikáty. Existují však zvláštní syntaktická omezení týkající se použití specifikací sloupců tabulky z oddílu v podmínce vyhledávání Z daný tabulkový výraz. Tato omezení vyplývají ze skutečnosti, že podmínka vyhledávání v sekci MÍT nastaví podmínku na celou skupinu, nikoli na jednotlivé řádky.

Proto v aritmetických výrazech predikátů zahrnutých do výběrové podmínky sekce MÍT, můžete přímo použít pouze specifikace sloupců určených jako seskupení sloupců v sekci SKUPINA VYTVOŘENÁ. 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á nějakou agregovanou hodnotu pro celou skupinu řádků. Situace je podobná s poddotazy zahrnutými v predikátech výběrové podmínky sekce MÍT: Pokud je v poddotazu použita aktuální charakteristika skupiny, lze ji zadat pouze odkazem na sloupce seskupení.

Výsledek provedení sekce MÍT je seskupená tabulka obsahující pouze ty skupiny řádků, pro které je výsledek výpočtu podmínky hledání SKUTEČNÝ. Zejména pokud je oddíl MÍT přítomný v tabulkovém výrazu, který neobsahuje SKUPINA VYTVOŘENÁ, pak výsledkem jeho spuštění bude buď prázdná tabulka, nebo výsledek provedení předchozích sekcí tabulkového výrazu, zacházeno jako s jednou skupinou bez seskupování sloupců.

POČÍTAT

Vyberte kódy pro produkty zakoupené více než jedním kupujícím:

VYBRAT skladem Z ordsale SKUPINA VYTVOŘENÁ skladem MÍT POČET(*) > 1;

MÍT MIN

Získejte minimální a maximální platy pro úředníky v každém oddělení, kde je nejnižší plat nižší než 1 000 $:

VYBRAT deptno, MIN(sal), MAX(sal) Z emp KDE práce = 'ÚŘEDNÍK' SKUPINA VYTVOŘENÁ deptno MÍT MIN(sal)

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 vzorkování podle určitého kritéria. HAVING spolu s operátorem WHERE umožňuje definovat 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í společnostem 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 se nejprve vyberou data podle jmen zaměstnanců zadaných v parametru WHERE a poté výsledek seskupený do GROUP BY projde další kontrolou 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 tomto parametru jsou specifikovány úplně stejným způsobem jako v případě WHERE.

Závěr

Jak vidíte, v tomto operátoru není nic složitého. 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.

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 může seskupit podle 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

Filtrování skupin. 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 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 Manufacturer 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í.

Jak zjistím počet modelů PC vyrobených konkrétním dodavatelem? Jak určit průměrnou cenu počítačů se stejnými technickými vlastnostmi? 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á počet různých modelů vyrobených 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ích funkcí 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í po věty WHERE.

klauzule GROUP BY

klauzule GROUP BY slouží 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 spolu s klíčovým slovem DISTINCT lze použít k odstranění duplicitních řádků v sadě výsledků.
Podívejme se na jednoduchý příklad:
SELECT model, COUNT(model) AS Model_množství, 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í řetězců 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.

říct přátelům