Найти в Дзене
Налейте аналитику

Разбор задачи SQL №13

В прошлый раз разбиралась десятая задача. В этот раз начнем разбирать тринадцатую, в которой познакомимся c элементом запроса HAVING. На мой взгляд, это первая задача, которая требует чуточку сообразительности.

Задача -
Вывести имена людей, у которых есть полный тёзка среди пассажиров.

-2

На самом деле, сообразительность нужна только для того, чтобы переформулировать постановку "Вывести имена людей, у которых есть полный тёзка среди пассажиров" в более понятную "Вывести name из таблицы Passenger, встречающиеся более 1 раза".

Для начала поймем, как построить запрос с группировкой по имени пассажиров (name) и кол-вом таких имен в таблице. Это не очень сложно:

SELECT

name, COUNT(*)

FROM Passenger

GROUP BY name

ORDER BY COUNT(*) DESC

-3

[DESC - сортировка от большего к меньшему] Видим, что имена всех пассажиров, кроме одного имени, встречаются по 1 разу. Собственно, именно это имя нам и нужно - осталось убрать из ответа всех остальных. Для этого нам как раз понадобится HAVING. HAVING - команда, аналогичная WHERE, но с той разницей, что WHERE идет в запросе до группировки и накладывает условия на поля в таблице, а HAVING идет после группировки GROUP BY и накладывает условия на результат этой группировки.

Так, если в запросе выше после GROUP BY добавить условие HAVING COUNT(*)>1, мы получим почти то, что нужно в задаче:

SELECT

name, COUNT(*)

FROM Passenger

GROUP BY name

HAVING COUNT(*)>1

ORDER BY COUNT(*) DESC

-4

В целом, ответ правильный, с той лишь разницей, что формально по условию задачи в результате должно быть только одно поле name

-5

А вот теперь все формальности тренажера учтены.

Спасибо за прочтение, подписывайтесь на телеграм )