Použití klauzulí HAVING a WHERE ve stejném dotazu (Visual Database Tools)
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
V některých případech můžete chtít vyloučit jednotlivé řádky ze skupin (pomocí klauzule WHERE
) před použitím podmínky u skupin jako celku (pomocí klauzule HAVING
).
Klauzule HAVING
se podobá klauzuli WHERE
, ale vztahuje se pouze na skupiny jako celek (to znamená na řádky v sadě výsledků představující skupiny), zatímco klauzule WHERE
se vztahuje na jednotlivé řádky. Dotaz může obsahovat klauzuli WHERE
i klauzuli HAVING
. V takovém případě:
Klauzule
WHERE
se použije jako první na jednotlivé řádky v tabulkách nebo objektech s hodnotou tabulky v podokně diagramu. Seskupí se pouze řádky, které splňují podmínky v klauzuliWHERE
.Klauzule
HAVING
se pak použije na řádky v sadě výsledků. Ve výstupu dotazu se zobrazí jenom skupiny, které splňují podmínkyHAVING
. KlauzuliHAVING
můžete použít pouze u sloupců, které se zobrazují také v klauzuli GROUP BY nebo v agregační funkci.
Zadejte klauzule WHERE a HAVING u dvou spojených tabulek
Poznámka
Databáze použitá v tomto článku je databáze pubs
, která je dostupná z ukázkových databází Northwind a pubs pro Microsoft SQL Server na GitHubu.
Představte si například, že připojujete titles
a publishers
tabulky, abyste vytvořili dotaz zobrazující průměrnou cenu knihy pro sadu vydavatelů. Chcete zobrazit průměrnou cenu pouze pro určitou sadu vydavatelů – možná jenom vydavatelé ve státě Kalifornie. A i pak chcete zobrazit průměrnou cenu pouze v případě, že je nad 10,00 USD.
První podmínku můžete vytvořit tak, že před výpočtem průměrných cen zahrnete klauzuli WHERE
, která zahodí všechny vydavatele, kteří nejsou v Kalifornii. Druhá podmínka vyžaduje klauzuli HAVING
, protože podmínka je založená na výsledcích seskupení a souhrnu dat. Výsledný příkaz SQL může vypadat takto:
SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;
V nástrojích Visual Database Tools aplikace SQL Server Management Studio můžete v podokně Kritéria vytvořit klauzule HAVING
i WHERE
. Pokud ve výchozím nastavení zadáte vyhledávací podmínku pro sloupec, podmínka se stane součástí klauzule HAVING
. Podmínku ale můžete změnit na klauzuli WHERE
.
Můžete vytvořit klauzuli WHERE
a HAVING
klauzuli zahrnující stejný sloupec. Provedete to tak, že sloupec přidáte dvakrát do podokna Kritéria, přičemž jeden případ označíte jako součást klauzule HAVING
a druhý případ jako součást klauzule WHERE
.
Zadání podmínky WHERE v agregačním dotazu
Zadejte skupiny pro váš dotaz. Podrobnosti najdete v Seskupení řádků ve výsledcích dotazu (Visual Database Tools).
Pokud již není v podokně Kritéria, přidejte do něj sloupec, na kterém chcete založit podmínku
WHERE
.Vymažte sloupec Výstupní, pokud není datový sloupec součástí klauzule GROUP BY nebo není součástí agregační funkce.
Ve sloupci Filtr zadejte podmínku
WHERE
. Návrhář dotazu a zobrazení přidá podmínku do klauzuleHAVING
příkazu SQL.Poznámka
Dotaz zobrazený v příkladu pro tento postup spojí dvě tabulky,
titles
apublishers
.V tomto okamžiku v dotazu příkaz SQL obsahuje klauzuli
HAVING
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id GROUP BY titles.pub_id HAVING publishers.state = 'CA'
Ve sloupci Seskupit podle vyberte Kde ze seznamu možností skupiny a souhrnu. Návrhář dotazu a zobrazení odebere podmínku z klauzule
HAVING
v příkazu SQL a přidá ji do klauzuleWHERE
.Příkaz SQL se změní tak, aby místo toho zahrnoval klauzuli
WHERE
:SELECT titles.pub_id, AVG(titles.price) FROM titles INNER JOIN publishers ON titles.pub_id = publishers.pub_id WHERE publishers.state = 'CA' GROUP BY titles.pub_id;
Související obsah
- SELECT – HAVING (Transact-SQL)
- Řazení a Seskupování Výsledků Dotazu (Visual Database Tools)
- Shrnutí výsledků dotazu (Visual Database Tools)