SQL Имеет пункт syntacti c сахар? - PullRequest
2 голосов
/ 28 апреля 2020

Просто любопытно, если предложение HAVING в SQL является просто синтаксисом c сахар для предложения WHERE над подзапросом?

Например:

SELECT DepartmentName, COUNT(*) 
 FROM Employee, Department 
 WHERE Employee.DepartmentID = Department.DepartmentID 
 GROUP BY DepartmentName
 HAVING COUNT(*)>1;

эквивалентно в результате

SELECT * FROM (
   SELECT DepartmentName AS deptNam, COUNT(*) AS empCnt
   FROM Employee AS emp, Department AS dept
   WHERE emp.DepartmentID = dept.DepartmentID
   GROUP BY deptNam
) AS grp
WHERE grp.empCnt > 1;

Таким образом, можно переписать HAVING с подзапросом + WHERE.

Таким образом, единственное различие заключается в количестве печатных символов + спецификациях поставщика БД?

(примеры из Википедии https://en.wikipedia.org/wiki/Having_ (SQL) )

1 Ответ

4 голосов
/ 28 апреля 2020

Да, HAVING - это "syntacti c sugar" в том смысле, что его всегда можно заменить подзапросом или CTE. Отмечу, что некоторые базы данных имеют тенденцию материализовать подзапросы, что может добавить небольшую дополнительную нагрузку. И MySQL расширяет использование HAVING в неагрегированных контекстах.

При этом запятые в предложении FROM на хуже , чем syntacti c sugar. Они по сути устарели, их заменил правильный синтаксис JOIN в 1990-х годах - это последнее тысячелетие. Они менее мощные, потому что они не поддерживают внешние объединения.

Итак, вы должны сосредоточиться на изучении правильного, явного, стандартного , читаемого синтаксиса JOIN, а не беспокоиться о HAVING.

FROM Employee e JOIN
     Department d
     ON e.DepartmentID = d.DepartmentID

Вы также должны научиться квалифицировать все ссылки на столбцы в своих запросах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...