В прошлый раз разбиралась десятая задача. В этот раз начнем разбирать тринадцатую, в которой познакомимся c элементом запроса HAVING. На мой взгляд, это первая задача, которая требует чуточку сообразительности.
Задача - Вывести имена людей, у которых есть полный тёзка среди пассажиров.
На самом деле, сообразительность нужна только для того, чтобы переформулировать постановку "Вывести имена людей, у которых есть полный тёзка среди пассажиров" в более понятную "Вывести name из таблицы Passenger, встречающиеся более 1 раза".
Для начала поймем, как построить запрос с группировкой по имени пассажиров (name) и кол-вом таких имен в таблице. Это не очень сложно:
SELECT
name, COUNT(*)
FROM Passenger
GROUP BY name
ORDER BY COUNT(*) DESC
[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
В целом, ответ правильный, с той лишь разницей, что формально по условию задачи в результате должно быть только одно поле name
А вот теперь все формальности тренажера учтены.
Спасибо за прочтение, подписывайтесь на телеграм )