Mající (SQL) - Having (SQL)
HAVINGKlauzule v SQL určuje, že SQL SELECTprohlášení musí vrátit pouze řádky, kde souhrnné hodnoty splňují stanovené podmínky .
HAVINGa WHEREzačátečníci jsou často zmateni, ale slouží různým účelům. WHEREje brána v úvahu v dřívější fázi provádění dotazu a filtruje řádky načtené z tabulek. Pokud dotaz obsahuje GROUP BY, jsou řádky z tabulek seskupeny a agregovány. Po agregační operaci HAVINGse použije filtrování řádků, které neodpovídají zadaným podmínkám. Proto se WHEREvztahuje na data načtená z tabulek a HAVINGměla by se vztahovat pouze na agregovaná data, která nejsou známa v počáteční fázi dotazu.
Chcete-li zobrazit současnou podmínku tvořenou GROUP BYklauzulí, použije se HAVINGklauzule.
Příklady
Chcete-li vrátit seznam ID oddělení, jejichž celkový prodej k 1. lednu 2000 přesáhl 1000 USD, spolu se součtem jejich prodejů k tomuto datu:
SELECT DeptID, SUM(SaleAmount)
FROM Sales
WHERE SaleDate = '01-Jan-2000'
GROUP BY DeptID
HAVING SUM(SaleAmount) > 1000
Následující dotaz s odkazem na ukázkové tabulky v příkladu Připojit vrátí seznam oddělení, která mají více než 1 zaměstnance:
SELECT DepartmentName, COUNT(*)
FROM Employee
JOIN Department ON Employee.DepartmentID = Department.DepartmentID
GROUP BY DepartmentName
HAVING COUNT(*)>1;
HAVINGje pohodlné, ale není nutné. Kód ekvivalentní výše uvedenému příkladu, ale bez použití HAVING, může vypadat takto:
SELECT * FROM (
SELECT DepartmentName AS deptNam, COUNT(*) AS empCnt
FROM Employee AS emp
JOIN Department AS dept ON emp.DepartmentID = dept.DepartmentID
GROUP BY deptNam
) AS grp
WHERE grp.empCnt > 1;