Разбираем SQL вопросы с собесов
Вы просили выложить правильные ответы — делюсь
1. Почему NULL = NULL не возвращает TRUE?
Потому что NULL означает неизвестное значение. Мы не знаем, равны ли два неизвестных значения друг другу. Поэтому результат сравнения — UNKNOWN, а не TRUE или FALSE
Для проверки нужно использовать IS NULL или IS NOT NULL
2. Может ли LEFT JOIN работать как INNER JOIN?
Да. Например, если после LEFT JOIN добавить в WHERE условие по столбцу правой таблицы, который не может быть NULL, строки без совпадений отфильтруются
3. Чем отличаются COUNT() и COUNT(column)?
COUNT() считает все строки, а COUNT(column) — только те, где значение столбца не NULL
После LEFT JOIN это особенно важно: строка может существовать, даже если соответствующие данные из правой таблицы отсутствуют
4. Зачем нужен UNION ALL, если есть UNION?
UNION удаляет дубликаты, а UNION ALL сохраняет их. Удаление повторов требует дополнительных ресурсов, поэтому UNION ALL часто быстрее, если дубликаты нужно сохранить
5. Чем WHERE отличается от HAVING?
WHERE фильтрует строки до группировки, а HAVING — уже сформированные группы после GROUP BY
Например, сначала можно выбрать заказы за определённый период, а затем оставить только тех клиентов, у которых больше пяти заказов
6. В чём разница между ROW_NUMBER(), RANK() и DENSE_RANK()?
ROW_NUMBER() присваивает каждой строке уникальный номер RANK() даёт одинаковый ранг равным значениям, пропуская следующие номера DENSE_RANK() тоже учитывает равенство, но номера не пропускает
Например, при значениях 100, 100 и 90 результаты будут:
ROW_NUMBER — 1, 2, 3 RANK — 1, 1, 3 DENSE_RANK — 1, 1, 2
7. Почему NOT IN может не вернуть ни одной строки?
Если список содержит NULL, сравнение может дать UNKNOWN, из-за чего условие не пройдёт ни для одной строки. Для таких проверок часто безопаснее использовать NOT EXISTS
8. Почему ORDER BY внутри запроса не гарантирует порядок результата?
Внешний запрос может изменить порядок строк. Если важна сортировка итогового результата, указывайте ORDER BY в самом внешнем запросе
9. Чем отличаются DELETE, TRUNCATE и DROP?
DELETE удаляет строки, в том числе выборочно через WHERE TRUNCATE очищает таблицу целиком DROP удаляет сам объект таблицы
10. Индекс всегда ускоряет запросы?
Нет. Индекс может ускорить поиск, но занимает место и увеличивает затраты на INSERT, UPDATE и DELETE. Если запрос читает большую часть таблицы, последовательное чтение может оказаться эффективнее
11. Почему после JOIN сумма выручки может вырасти в несколько раз?
Из-за размножения строк. Если одному заказу соответствуют несколько записей в присоединяемой таблице, сумма заказа может посчитаться несколько раз
Перед агрегацией важно понимать, что представляет собой одна строка каждой таблицы и как соотносятся их ключи
12. Почему нельзя просто усреднить средние значения?
Потому что у групп может быть разное количество наблюдений
Например, средний чек двух магазинов может быть 100 и 200 рублей, но в одном магазине 10 покупок, а в другом — 1000. Простое среднее двух значений не даст общий средний чек по всем покупкам. Нужна взвешенная средняя
13. Чем отличаются ROWS и RANGE в оконных функциях?
ROWS работает с физическими строками относительно текущей строки, а RANGE — с диапазоном значений сортировки и учитывает строки с одинаковыми значениями ключа сортировки
Поэтому при использовании RANGE накопительная сумма может измениться сразу на нескольких строках с одинаковой датой или суммой
Сохраняйте и делитесь с друзьями 🤩