1. В чём разница между WHERE и HAVING в SELECT-запросе?
Ответ: WHERE фильтрует строки до группировки, HAVING фильтрует уже сгруппированные данные.
Например есть задача "Какой запрос SQL вернёт максимальную зарплату сотрудников для каждого отдела, где средняя з/п по отделу превышает 5000?". Сначала нужно сгруппировать по отделам, а затем в HAVING отфильтровать по средней з/п, если это сделать в WHERE будет ошибка.
2. Допустим в таблице есть 3 столбца
user_id, salary, employees. В чём разница между count(*) и count(employees)?Ответ: count(*) считает все строки таблицы, а count(employees) считает только те строки, где в столбце employees значение не NULL
3. Как в PostgreSQL работать с NaN для числовых типов: чем он отличается от NULL и что вернут
COALESCE(NaN::numeric, 0) и NULLIF(NaN::numeric, NaN::numeric)?Ответ: NaN в PostgreSQL — это реальное числовое значение (Not-a-Number), а не отсутствие данных: оно хранится в ячейке, участвует в арифметике и сравнениях. NULL значит, что значения нет вовсе
Поэтому count(..), avg(..) не посчитают ячейки с NULL, но учтут ячейки с NaN
COALESCE(value [, ...]) возвращает первый ненулевой аргумент. Поэтому COALESCE(NaN::numeric, 0) вернёт сам NaN (первый аргумент не NULL)
NULLIF(value1, value2) возвращает NULL, если value1 = value2, иначе вернёт value1. Поэтому NULLIF(NaN::numeric, NaN::numeric) вернёт NULL
4. Допустим в двух разных таблицах есть колонки
user_id и employees_id. В каком случае JOIN выполнится быстрее, если обе колонки будут типа numeric(11) или varchar(10)?Ответ: numeric(11) быстрее, потому что значения хранятся как упорядоченные числа фиксированной длины и сравнение двух чисел — это одна бинарная операция. varchar(10) каждый ключ хранит длину и символы, соответственно для сравнения нужно пройтись посимвольно, что медленнее, а сами индексы больше (нужно читать больше страниц и в рабочем кэше помещается меньше записей).
Если БД очень важна использование числового тип данных может существенно ускорить работу запросов.
5. Какой компонент отвечает за оптимизацию и преобразование SQL-запроса в план выполнения?
Ответ: Query Processor (оптимизатор запросов)
Оптимизатор учитывает такие факторы, как количество записей, наличие индексов, партиций и т.д. На основе этого он строит план EXPLAIN — последовательность операций, которые
выполняет БД для получения требуемого в запросе результата.
6. Какой компонент восстанавливает базу после сбоя?
Ответ: Recovery Manager
Вместе с изменением данных ведется ещё и журнал этих изменений. Recovery manager читает журнал предзаписи WAL, повторно выполняет все зафиксированные изменения после контрольной точки (redo) и откатывает изменения незавершённых транзакций (undo)
7. Что такое партиции и где они хранятся?
Ответ: партиционирование — это логическое разделение данных на части (партиции) по заданным критериям, используется в основном для больших таблиц и позволяет избежать полного сканирования таблицы. Может располагаться во всех сегментах
@ProdAnalysis