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;

externí odkazy