Соедините Employers и Workers по Workers.Employer_Id = Employers.id и назначьте имена столбцов результата через AS. INNER JOIN вернёт только сотрудников с найденным работодателем.
Соедините Author и Book по author_id, сгруппируйте по автору и примените HAVING COUNT(b.id) > 5. Группировка по id не объединит разных авторов с одинаковыми именами.
Используйте WHERE Company_Size > 100. Строгое сравнение исключает компании с ровно 100 сотрудниками; строки с NULL в Company_Size также не попадут в результат.
Создайте пул PostgreSQL на время жизни приложения и выполняйте SQL в /menu через полученное из пула соединение. Не открывайте неограниченное число соединений и не блокируйте async-обработчик синхронным драйвером.
Отфильтруйте события add_to_cart и сгруппируйте их по user_id. В HAVING потребуйте хотя бы одно добавление каждого товара 101 и 102 и ни одного добавления 104.
После разделительной линии будет один SELECT: он выполняется при list(qs). Создание QuerySet и вызов filter без использования результата сами по себе запросов не выполняют.
Нужен LEFT JOIN от owners к pets, COALESCE для имени владельца и CASE для age_gap. Условие нулевой разницы относится к отсутствующему имени хозяина, а не к отсутствующему питомцу.
prefetch_related('articles') загружает одну выборку, а последующий articles.filter(deleted=False) создаёт новые запросы. В результате предварительная загрузка не устраняет N+1 для используемого фильтра.
Назовите реальный поисковый движок или СУБД и механизм нечёткого поиска: например, триграммы, edit distance или специализированный индекс. Сама фраза «на PostgreSQL» ещё не объясняет, как работает поиск.
Выберите сотрудников, для которых не существует записи о закреплённом номере. NOT EXISTS выражает это напрямую и не создаёт дубликатов сотрудников при нескольких телефонах.
Используйте LEFT JOIN от сотрудников к кошкам и оставьте строки, где у присоединённой кошки нет идентификатора. Это anti-join: выбираются сотрудники без единого совпадения.