Hw 01 solutions
1. Вывести список всех пассажиров (их имена и фамилии)¶
Ошибка большинства:¶
Если запрос выполняется просто как:
то он вернёт все строки из таблицы tickets, включая дубликаты, если у пассажиров одинаковые имена и фамилии.
Как получить уникальные записи?¶
Есть два способа:
1. DISTINCT¶
Плюсы:
Легко использовать, сразу удаляет дублирующиеся строки по указанным столбцам.
Минусы:
Работает медленно на больших таблицах, т.к. требует полной проверки на уникальность.
Может не подойти, если нужны дополнительные данные (например, ID пассажира).
2. GROUP BY¶
Плюсы:
Работает аналогично DISTINCT, но позволяет добавлять агрегатные функции (COUNT(), MAX(), MIN() и т.д.).
Минусы:
Без агрегатных функций смысла мало (кроме больших таблиц) — это просто DISTINCT с лишними шагами.
2. Регистрозависимость в WHERE¶
PostgreSQL учитывает регистр при сравнении строк.
Пример:
Этот запрос не найдёт строки, где status = 'Scheduled' или SCHEDULED'.
Как решить проблему?¶
1. Если таблица небольшая¶
Можно вручную посмотреть уникальные значения через Filter by value в DBEAVER.
2. Использовать DISTINCT или GROUP BY для просмотра значений¶
3. Приводить текст к нижнему или верхнему регистру (LOWER() или UPPER())¶
или
4. Использовать не точное сопоставление (LIKE)¶
%— заменяет любое количество символов_— заменяет один символ
Этот запрос найдёт все вариантыScheduled.
5. Игнорировать регистр с ILIKE (альтернатива LIKE)¶
ILIKE — это LIKE, но без учёта регистра.
3. Понимание "первых" и "последних" записей¶
1. Вывести первые 10 записей из таблицы¶
Если сделать:
то получим первые 10 строк, но без явного порядка. Порядок строк в таблице не определён!
Как задать порядок?¶
Добавить ORDER BY:
Если id автоинкрементный, то это будет первые 10 пассажиров, добавленных в базу.
2. Вывести топ-5 самых последних прибывших¶
Здесь "самые последние" значит, что нужно упорядочить по дате прибытия (arrival_time).
ORDER BY arrival_time DESC— сортирует от новых к старымLIMIT 5— берём только 5 самых последних
Если нужно, чтобы при одинаковом arrival_time сортировка была по id: