Вопросы на собеседовании: Администратор БД
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.
Смотреть пример резюме: Администратор БД →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Реляционная база данных хранит структурированные данные в таблицах и представляет связи между ними через ключи.
- Каждая таблица моделирует один вид сущности или отношения с помощью именованных столбцов.
- Строки содержат отдельные записи, соответствующие объявленной структуре таблицы.
- SQL используется для определения, чтения и изменения данных.
- Ограничения позволяют базе обеспечивать правила вроде уникальности и ссылочной целостности.
Зачем это спрашивают: Интервьюер проверяет понимание таблиц, связей, SQL и ограничений как основ реляционной модели.
Таблица представляет отношение, строка представляет один кортеж или запись, а столбец представляет один именованный атрибут.
- Каждый столбец имеет объявленный тип данных и может иметь ограничения.
- Каждая строка содержит значения столбцов таблицы, включая NULL там, где он разрешён.
- Порядок отображения строк не гарантирован, если запрос не использует ORDER BY.
- Ключ может уникально идентифицировать строку или связать её со строкой другой таблицы.
Зачем это спрашивают: Сильный ответ правильно использует базовые реляционные термины и не предполагает естественного порядка строк.
Схема базы данных является определённой структурой и организацией объектов базы.
- Она включает таблицы, столбцы, типы данных, ключи, ограничения, представления и индексы.
- В системах вроде PostgreSQL schema также является именованным пространством внутри базы данных.
- Определение схемы описывает разрешённую структуру, а не текущие сохранённые строки.
- Изменения структуры обычно управляются через версионируемые миграции.
Зачем это спрашивают: Интервьюер оценивает, отличает ли кандидат структуру базы от содержащихся в ней экземпляров данных.
Ключ является одним столбцом или набором столбцов для идентификации строк или определения связей.
- Потенциальный ключ может уникально идентифицировать строку.
- Один потенциальный ключ выбирается первичным.
- Внешний ключ ссылается на потенциальный или первичный ключ другой или той же таблицы.
- Составной ключ использует несколько столбцов, когда уникальность зависит от их комбинации.
Зачем это спрашивают: Сильный ответ различает потенциальные, первичные, внешние и составные ключи, а не считает любой идентификатор одним понятием.
Первичный ключ является выбранным столбцом или набором столбцов, который уникально идентифицирует каждую строку таблицы.
- Его значения должны быть уникальными во всех строках таблицы.
- Столбцы первичного ключа не могут содержать NULL.
- Таблица имеет одно ограничение первичного ключа, хотя сам ключ может включать несколько столбцов.
- СУБД обычно создаёт индекс для обеспечения или поддержки первичного ключа.
Зачем это спрашивают: Интервьюер проверяет знание уникальности, отсутствия NULL и возможности составного первичного ключа.
Внешний ключ гарантирует, что значения ссылки соответствуют существующему потенциальному ключу другой или той же таблицы.
- Внешний ключ orders.customer_id может ссылаться на customers.id.
- Он не позволяет вставить ссылку со значением, отличным от NULL, без соответствующей родительской строки.
- Он также определяет поведение при обновлении или удалении строки, на которую ссылаются.
- Ограничение обеспечивает ссылочную целостность внутри базы вместо опоры только на код приложения.
Зачем это спрашивают: Сильный ответ объясняет и связь, и гарантию целостности, которую даёт внешний ключ.
Оба обеспечивают уникальность, но первичный ключ является главным идентификатором строк таблицы, а UNIQUE задаёт дополнительные потенциальные ключи.
- Таблица может иметь только одно ограничение первичного ключа и несколько ограничений UNIQUE.
- Столбцы первичного ключа всегда являются NOT NULL.
- Обработка NULL в ограничениях UNIQUE зависит от СУБД и настроек.
- Внешние ключи могут ссылаться как на подходящий UNIQUE key, так и на первичный ключ.
Зачем это спрашивают: Интервьюер оценивает понимание идентичности, nullability и нескольких альтернативных ключей.
Эти ограничения определяют допустимые или автоматически подставляемые значения столбцов.
- NOT NULL отклоняет строки, в которых столбец не имеет значения.
- CHECK требует выполнения логического условия вроде price >= 0.
- DEFAULT подставляет значение, когда INSERT не указывает столбец.
- Значение по умолчанию не заменяет явно переданное значение и не проверяет существующие бизнес-связи.
Зачем это спрашивают: Сильный ответ различает обязательность значения, проверочное выражение и значение по умолчанию при вставке.
Эти действия определяют, что произойдёт с дочерней ссылкой при удалении родительской строки.
- RESTRICT или NO ACTION запрещает удаление, пока существуют связанные дочерние строки.
- CASCADE автоматически удаляет ссылающиеся дочерние строки.
- SET NULL очищает значение внешнего ключа, поэтому столбец должен разрешать NULL.
- Выбор должен соответствовать семантике владения, потому что CASCADE может удалить больше данных, чем явно названо в одном DELETE.
Зачем это спрашивают: Интервьюер проверяет понимание ссылочных действий и их последствий для модели данных.
Типы данных определяют допустимые значения столбца, их представление и доступные операции.
- Целые, числовые, текстовые, временные, логические и бинарные типы выражают разные домены.
- Подходящий тип позволяет базе проверять ввод и правильно сравнивать значения.
- Выбор типа влияет на диапазон, точность, хранение, сортировку и поведение функций.
- PostgreSQL и MySQL имеют много общих понятий типов, но различаются некоторыми именами и семантикой.
Зачем это спрашивают: Сильный ответ связывает типы данных с корректностью и представлением, а не считает их только метками хранения.
Эти типы хранят символьные данные, но отличаются правилами длины и поведением конкретной СУБД.
- CHAR(n) имеет фиксированную длину и может дополнять более короткие значения до объявленного размера.
- VARCHAR(n) хранит текст переменной длины до объявленного предела.
- TEXT хранит текст переменной длины без такого же ограничения длины на уровне приложения.
- PostgreSQL и MySQL различаются деталями хранения, лимитами и правилами индексов, поэтому точные сведения нужно брать из их документации.
Зачем это спрашивают: Интервьюер проверяет понимание фиксированной и переменной длины текста без предположения об одинаковом поведении разных СУБД.
DECIMAL или NUMERIC нужны для точной десятичной арифметики, а типы с плавающей точкой представляют приблизительные значения.
- Денежные суммы обычно требуют точной precision и scale.
- FLOAT и DOUBLE могут создавать двоичные ошибки округления в десятичных вычислениях.
- Приблизительные типы подходят научным измерениям, где диапазон важнее точного десятичного представления.
- Precision и scale должны покрывать допустимые значения без потери нужной детализации.
Зачем это спрашивают: Сильный ответ связывает точное и приблизительное числовое представление с корректностью хранимых значений.
Эти типы представляют календарные даты, время суток, дату со временем и временные моменты с учётом часового пояса с разной семантикой.
- DATE хранит календарную дату без времени суток.
- TIME хранит время суток без даты.
- TIMESTAMP хранит дату и время, интерпретация часового пояса которых зависит от типа СУБД и контракта приложения.
- В PostgreSQL timestamptz представляет момент, внутренне нормализованный и отображаемый в часовом поясе сессии.
Зачем это спрашивают: Интервьюер оценивает, выбирает ли кандидат временные типы по смыслу вместо хранения любого времени как текста.
NULL представляет отсутствующее или неизвестное значение и не равен обычному значению, включая другой NULL.
- Сравнения с NULL обычно дают UNKNOWN вместо TRUE или FALSE.
- IS NULL и IS NOT NULL проверяют его наличие.
- WHERE сохраняет только строки, предикат которых равен TRUE, поэтому строки с UNKNOWN отфильтровываются.
- Функции и агрегаты могут по-разному обрабатывать NULL, поэтому их семантику нужно проверять явно.
Зачем это спрашивают: Сильный ответ понимает трёхзначную логику SQL и не проверяет NULL оператором равенства.
Простой SELECT-запрос выбирает столбцы, источник, необязательные условия строк, группировку, условия групп, порядок и ограничение результата.
- SELECT определяет выходные выражения или столбцы.
- FROM указывает таблицы или производные источники, а JOIN соединяет связанные источники.
- WHERE фильтрует строки до группировки, а GROUP BY и HAVING работают с группами.
- ORDER BY сортирует итог, а LIMIT или FETCH ограничивает число возвращаемых строк.
Зачем это спрашивают: Интервьюер проверяет знание роли каждой распространённой части запроса, а не только синтаксиса.
WHERE фильтрует входные строки, оставляя только те, предикат которых равен TRUE.
- Операторы сравнения проверяют значения, а AND, OR и NOT объединяют условия.
- Сравнения с NULL могут дать UNKNOWN и поэтому не пройти фильтр.
- Скобки явно задают приоритет в составных предикатах.
- WHERE применяется до агрегатной группировки, поэтому условия агрегатов находятся в HAVING.
Зачем это спрашивают: Сильный ответ охватывает логические операторы, поведение NULL и различие фильтрации строк и групп.
ORDER BY задаёт порядок результата, LIMIT ограничивает число строк, а OFFSET пропускает заданное число строк.
- ORDER BY может сортировать по одному или нескольким выражениям по возрастанию или убыванию.
- Без ORDER BY база не гарантирует, какие строки появятся первыми.
- LIMIT полезен для ограниченных результатов, а OFFSET часто применяется вместе с LIMIT для простой пагинации.
- Стабильный порядок пагинации требует достаточного числа столбцов сортировки для однозначного разрешения совпадений.
Зачем это спрашивают: Интервьюер оценивает понимание детерминированного порядка и ограничения набора результатов.
Aliases дают временные имена выходным выражениям или источникам данных внутри одного запроса.
- Alias столбца делает вычисленный или переименованный результат понятнее.
- Alias таблицы сокращает qualified references вроде o.customer_id.
- Aliases особенно полезны, когда одна таблица несколько раз участвует в self-join.
- Alias не переименовывает исходный объект базы данных.
Зачем это спрашивают: Сильный ответ объясняет aliases как имена в области запроса, а не изменения схемы.
INNER JOIN возвращает комбинации строк, выполняющие условие соединения с обеих сторон.
- Типичное условие сопоставляет внешний ключ с ключом, на который он ссылается.
- Строки без подходящей пары исключаются.
- Одна строка может появиться в нескольких строках результата, если соответствует нескольким строкам другой стороны.
- Условие ON определяет связь, а WHERE может дополнительно фильтровать соединённый результат.
Зачем это спрашивают: Интервьюер проверяет понимание matching behavior и возможного умножения строк в joins.
Outer joins сохраняют несовпавшие строки одной или обеих сторон и заполняют отсутствующие столбцы значениями NULL.
- LEFT JOIN сохраняет каждую левую строку и совпавшие правые строки.
- RIGHT JOIN сохраняет каждую правую строку и совпавшие левые строки.
- FULL OUTER JOIN сохраняет несовпавшие строки обеих сторон.
- Условие WHERE на nullable-стороне может случайно удалить несовпавшие строки и изменить фактический результат.
Зачем это спрашивают: Сильный ответ сравнивает сохранение строк и понимает, как последующая фильтрация может отменить поведение outer join.
Закрытые вопросы
- 21
Что такое CROSS JOIN и self-join?
joins - 22
Что делает GROUP BY?
aggregation - 23
Что делают COUNT, SUM, AVG, MIN и MAX?
- 24
Чем WHERE отличается от HAVING?
queriesaggregation - 25
Что делает DISTINCT в SELECT-запросе?
queriesdistinct - 26
Что такое подзапрос и common table expression?
subqueries - 27
Чем UNION отличается от UNION ALL?
union - 28
Что такое нормализация базы данных?
databasenormalization - 29
Что такое первая нормальная форма?
forms - 30
Что такое вторая нормальная форма?
forms - 31
Что такое третья нормальная форма?
forms - 32
Что такое аномалии вставки, обновления и удаления?
- 33
Что такое индекс базы данных?
databaseindexes - 34
Как в общих чертах работает индекс B-tree?
indexes - 35
Чем отличаются кластерный и некластерный индексы?
indexes - 36
Что такое составной индекс и почему порядок столбцов важен?
indexesschema - 37
Как связаны уникальный индекс и ограничение UNIQUE?
indexes - 38
Что такое транзакция базы данных?
databasetransactions - 39
Что означает ACID?
acid - 40
Для чего используются COMMIT, ROLLBACK и SAVEPOINT?
rollback - 41
Каковы стандартные уровни изоляции транзакций SQL?
sqltransactions - 42
Что такое dirty read, non-repeatable read и phantom read?
- 43
Что такое представление базы данных?
database - 44
Чем материализованное представление отличается от обычного?
materialized-views - 45
Чем пользователь базы данных отличается от роли?
database - 46
Что делают GRANT и REVOKE и что такое принцип наименьших привилегий?
least-privilege - 47
Чем логический бэкап базы отличается от физического?
databasebackups - 48
Чем отличаются полные, инкрементальные и дифференциальные бэкапы?
backups - 49
Что такое primary и replica базы данных?
databasereplication - 50
Чем отличаются синхронная и асинхронная репликация?
replicationasync - 51
Как найти клиентов, которые никогда не делали заказ?
- 52
Как вернуть самый новый заказ каждого клиента?
- 53
Как написать запрос с общей суммой оплаченных продаж по месяцам?
queries - 54
В таблице users могут быть дублирующиеся email. Как их найти?
- 55
Нужно обновить цены одного поставщика, не затронув остальные товары. Как сделать это безопасно?
- 56
Как удалить дублирующиеся строки, сохранив самую старую запись?
dedup - 57
Страница заказов замедляется на больших номерах страниц. Как изменить запрос?
queries - 58
Отчёт пропускает строки, где discount равен NULL. Как исправить вычисление и фильтр?
fundamentals - 59
Как вывести каждый заказ с именем клиента и необязательным адресом доставки?
- 60
Как вернуть трёх сотрудников с самой высокой зарплатой в каждом отделе?
- 61
Запрос фильтрует timestamp через date(created_at) и не использует существующий индекс. Как его переписать?
indexesqueries - 62
Как показать число paid, failed и pending заказов одним запросом?
queries - 63
Как вставлять ежедневную метрику, но обновлять её, если эта дата уже существует?
monitoring - 64
Как реализовать перевод между двумя балансами счетов в SQL?
sql - 65
Приложение строит SQL конкатенацией пользовательской строки поиска. Как сделать запрос безопасным?
sql - 66
EXPLAIN показывает sequential scan большой таблицы для селективного фильтра. Что проверить сначала?
- 67
План оценивает результат запроса в десять строк, но реально возвращает сто тысяч. Что вы сделаете?
estimationqueries - 68
Частый запрос фильтрует users по email. Какой индекс выбрать?
indexesqueries - 69
Запрос фильтрует orders по customer_id и сортирует от новых к старым. Какой индекс рассмотреть?
indexesqueries - 70
Есть индекс на status, created_at, но запрос только по created_at его не использует. Что вы сделаете?
indexesqueries - 71
Большинство заказов completed, но частая задача выбирает только pending orders. Какой индекс может помочь?
indexes - 72
Как не дать двум пользователям зарегистрировать одинаковый username при concurrent requests?
concurrency - 73
У filtered column есть индекс, но PostgreSQL всё равно выбирает sequential scan. Всегда ли это проблема?
indexesqueriespostgres - 74
Lookup использует индекс, но всё равно читает таблицу ради двух returned columns. Как сократить эту работу?
indexesschema - 75
У таблицы много пересекающихся indexes, а writes замедляются. Как их очистить?
indexes - 76
Дашборд постоянно выполняет медленный COUNT(*) по большой отфильтрованной таблице. Как его ускорить?
- 77
Приложение загружает 100 заказов, а затем отправляет отдельный запрос клиента для каждого заказа. Как сократить работу базы?
databasequeries - 78
EXPLAIN ANALYZE показывает, что sort сбрасывается на диск. Что вы проверите?
- 79
Как спроектировать простую схему для клиентов и их заказов?
schemadesign - 80
Как смоделировать товары, которые могут входить во множество категорий?
- 81
Таблице нужны timestamps создания и последнего обновления. Как реализовать их надёжно?
- 82
Товар должен исчезнуть из обычных запросов, но остаться для аудита. Как спроектировать soft deletion?
queriesdesign - 83
Какие колонки и constraints вы выберете для простой записи платежа?
schema - 84
В строках клиентов многократно повторяются одинаковые country и city. Нормализуете ли вы их в отдельные таблицы?
normalization - 85
Как выбрать судьбу orders при удалении строки customer?
- 86
Как добавить обязательную колонку в большую заполненную таблицу с минимальным риском?
schema - 87
Как создать и восстановить logical PostgreSQL backup одной базы?
databasepostgresbackups - 88
Таблицу случайно удалили, но в остальной production database уже появились новые writes. Как её восстановить?
databaserest - 89
Как восстановить PostgreSQL на момент перед случайным update?
postgres - 90
Как доказать, что scheduled database backups действительно восстанавливаются?
databasebackups - 91
Как создать MySQL logical backup с меньшим влиянием на busy transactional database?
databasetransactionsbackups - 92
Как сделать backup SQLite database, которую активно использует приложение?
database - 93
PostgreSQL restore успешен, но приложение получает permission denied. Что проверить?
postgres - 94
Одна PostgreSQL session ждёт lock. Как найти blocking session?
postgressessions - 95
Две transactions попадают в deadlock при обновлении одной пары таблиц. Как сократить риск повтора?
transactionslocking - 96
Приложение оставляет transactions открытыми часами. Какие проблемы вы проверите?
transactions - 97
В PostgreSQL-таблице много updates и dead tuples. Какое maintenance вы выполните?
postgres - 98
Когда применять REINDEX к PostgreSQL index и как сделать это безопасно?
indexespostgres - 99
Queries замедлились после крупного data import. Как проверить, что причина в statistics?
queries - 100
Что вы начнёте мониторить для маленькой production PostgreSQL database?
databasepostgresmonitoring