Skip to content

Вопросы на собеседовании: Администратор БД

100 реальных вопросов с образцовыми ответами и пояснениями для уровня Junior.

Смотреть пример резюме: Администратор БД

Тренировка флешкарточками

Интервальное повторение · Hunter Pass

Вопросы

database

Реляционная база данных хранит структурированные данные в таблицах и представляет связи между ними через ключи.

  • Каждая таблица моделирует один вид сущности или отношения с помощью именованных столбцов.
  • Строки содержат отдельные записи, соответствующие объявленной структуре таблицы.
  • SQL используется для определения, чтения и изменения данных.
  • Ограничения позволяют базе обеспечивать правила вроде уникальности и ссылочной целостности.

Зачем это спрашивают: Интервьюер проверяет понимание таблиц, связей, SQL и ограничений как основ реляционной модели.

schema

Таблица представляет отношение, строка представляет один кортеж или запись, а столбец представляет один именованный атрибут.

  • Каждый столбец имеет объявленный тип данных и может иметь ограничения.
  • Каждая строка содержит значения столбцов таблицы, включая NULL там, где он разрешён.
  • Порядок отображения строк не гарантирован, если запрос не использует ORDER BY.
  • Ключ может уникально идентифицировать строку или связать её со строкой другой таблицы.

Зачем это спрашивают: Сильный ответ правильно использует базовые реляционные термины и не предполагает естественного порядка строк.

databaseschema

Схема базы данных является определённой структурой и организацией объектов базы.

  • Она включает таблицы, столбцы, типы данных, ключи, ограничения, представления и индексы.
  • В системах вроде PostgreSQL schema также является именованным пространством внутри базы данных.
  • Определение схемы описывает разрешённую структуру, а не текущие сохранённые строки.
  • Изменения структуры обычно управляются через версионируемые миграции.

Зачем это спрашивают: Интервьюер оценивает, отличает ли кандидат структуру базы от содержащихся в ней экземпляров данных.

database

Ключ является одним столбцом или набором столбцов для идентификации строк или определения связей.

  • Потенциальный ключ может уникально идентифицировать строку.
  • Один потенциальный ключ выбирается первичным.
  • Внешний ключ ссылается на потенциальный или первичный ключ другой или той же таблицы.
  • Составной ключ использует несколько столбцов, когда уникальность зависит от их комбинации.

Зачем это спрашивают: Сильный ответ различает потенциальные, первичные, внешние и составные ключи, а не считает любой идентификатор одним понятием.

primary-keys

Первичный ключ является выбранным столбцом или набором столбцов, который уникально идентифицирует каждую строку таблицы.

  • Его значения должны быть уникальными во всех строках таблицы.
  • Столбцы первичного ключа не могут содержать NULL.
  • Таблица имеет одно ограничение первичного ключа, хотя сам ключ может включать несколько столбцов.
  • СУБД обычно создаёт индекс для обеспечения или поддержки первичного ключа.

Зачем это спрашивают: Интервьюер проверяет знание уникальности, отсутствия NULL и возможности составного первичного ключа.

foreign-keys

Внешний ключ гарантирует, что значения ссылки соответствуют существующему потенциальному ключу другой или той же таблицы.

  • Внешний ключ orders.customer_id может ссылаться на customers.id.
  • Он не позволяет вставить ссылку со значением, отличным от NULL, без соответствующей родительской строки.
  • Он также определяет поведение при обновлении или удалении строки, на которую ссылаются.
  • Ограничение обеспечивает ссылочную целостность внутри базы вместо опоры только на код приложения.

Зачем это спрашивают: Сильный ответ объясняет и связь, и гарантию целостности, которую даёт внешний ключ.

primary-keys

Оба обеспечивают уникальность, но первичный ключ является главным идентификатором строк таблицы, а UNIQUE задаёт дополнительные потенциальные ключи.

  • Таблица может иметь только одно ограничение первичного ключа и несколько ограничений UNIQUE.
  • Столбцы первичного ключа всегда являются NOT NULL.
  • Обработка NULL в ограничениях UNIQUE зависит от СУБД и настроек.
  • Внешние ключи могут ссылаться как на подходящий UNIQUE key, так и на первичный ключ.

Зачем это спрашивают: Интервьюер оценивает понимание идентичности, nullability и нескольких альтернативных ключей.

fundamentals

Эти ограничения определяют допустимые или автоматически подставляемые значения столбцов.

  • NOT NULL отклоняет строки, в которых столбец не имеет значения.
  • CHECK требует выполнения логического условия вроде price >= 0.
  • DEFAULT подставляет значение, когда INSERT не указывает столбец.
  • Значение по умолчанию не заменяет явно переданное значение и не проверяет существующие бизнес-связи.

Зачем это спрашивают: Сильный ответ различает обязательность значения, проверочное выражение и значение по умолчанию при вставке.

foreign-keysfundamentals

Эти действия определяют, что произойдёт с дочерней ссылкой при удалении родительской строки.

  • RESTRICT или NO ACTION запрещает удаление, пока существуют связанные дочерние строки.
  • CASCADE автоматически удаляет ссылающиеся дочерние строки.
  • SET NULL очищает значение внешнего ключа, поэтому столбец должен разрешать NULL.
  • Выбор должен соответствовать семантике владения, потому что CASCADE может удалить больше данных, чем явно названо в одном DELETE.

Зачем это спрашивают: Интервьюер проверяет понимание ссылочных действий и их последствий для модели данных.

database

Типы данных определяют допустимые значения столбца, их представление и доступные операции.

  • Целые, числовые, текстовые, временные, логические и бинарные типы выражают разные домены.
  • Подходящий тип позволяет базе проверять ввод и правильно сравнивать значения.
  • Выбор типа влияет на диапазон, точность, хранение, сортировку и поведение функций.
  • PostgreSQL и MySQL имеют много общих понятий типов, но различаются некоторыми именами и семантикой.

Зачем это спрашивают: Сильный ответ связывает типы данных с корректностью и представлением, а не считает их только метками хранения.

Эти типы хранят символьные данные, но отличаются правилами длины и поведением конкретной СУБД.

  • CHAR(n) имеет фиксированную длину и может дополнять более короткие значения до объявленного размера.
  • VARCHAR(n) хранит текст переменной длины до объявленного предела.
  • TEXT хранит текст переменной длины без такого же ограничения длины на уровне приложения.
  • PostgreSQL и MySQL различаются деталями хранения, лимитами и правилами индексов, поэтому точные сведения нужно брать из их документации.

Зачем это спрашивают: Интервьюер проверяет понимание фиксированной и переменной длины текста без предположения об одинаковом поведении разных СУБД.

DECIMAL или NUMERIC нужны для точной десятичной арифметики, а типы с плавающей точкой представляют приблизительные значения.

  • Денежные суммы обычно требуют точной precision и scale.
  • FLOAT и DOUBLE могут создавать двоичные ошибки округления в десятичных вычислениях.
  • Приблизительные типы подходят научным измерениям, где диапазон важнее точного десятичного представления.
  • Precision и scale должны покрывать допустимые значения без потери нужной детализации.

Зачем это спрашивают: Сильный ответ связывает точное и приблизительное числовое представление с корректностью хранимых значений.

Эти типы представляют календарные даты, время суток, дату со временем и временные моменты с учётом часового пояса с разной семантикой.

  • DATE хранит календарную дату без времени суток.
  • TIME хранит время суток без даты.
  • TIMESTAMP хранит дату и время, интерпретация часового пояса которых зависит от типа СУБД и контракта приложения.
  • В PostgreSQL timestamptz представляет момент, внутренне нормализованный и отображаемый в часовом поясе сессии.

Зачем это спрашивают: Интервьюер оценивает, выбирает ли кандидат временные типы по смыслу вместо хранения любого времени как текста.

sqlfundamentals

NULL представляет отсутствующее или неизвестное значение и не равен обычному значению, включая другой NULL.

  • Сравнения с NULL обычно дают UNKNOWN вместо TRUE или FALSE.
  • IS NULL и IS NOT NULL проверяют его наличие.
  • WHERE сохраняет только строки, предикат которых равен TRUE, поэтому строки с UNKNOWN отфильтровываются.
  • Функции и агрегаты могут по-разному обрабатывать NULL, поэтому их семантику нужно проверять явно.

Зачем это спрашивают: Сильный ответ понимает трёхзначную логику SQL и не проверяет NULL оператором равенства.

queries

Простой SELECT-запрос выбирает столбцы, источник, необязательные условия строк, группировку, условия групп, порядок и ограничение результата.

  • SELECT определяет выходные выражения или столбцы.
  • FROM указывает таблицы или производные источники, а JOIN соединяет связанные источники.
  • WHERE фильтрует строки до группировки, а GROUP BY и HAVING работают с группами.
  • ORDER BY сортирует итог, а LIMIT или FETCH ограничивает число возвращаемых строк.

Зачем это спрашивают: Интервьюер проверяет знание роли каждой распространённой части запроса, а не только синтаксиса.

queries

WHERE фильтрует входные строки, оставляя только те, предикат которых равен TRUE.

  • Операторы сравнения проверяют значения, а AND, OR и NOT объединяют условия.
  • Сравнения с NULL могут дать UNKNOWN и поэтому не пройти фильтр.
  • Скобки явно задают приоритет в составных предикатах.
  • WHERE применяется до агрегатной группировки, поэтому условия агрегатов находятся в HAVING.

Зачем это спрашивают: Сильный ответ охватывает логические операторы, поведение NULL и различие фильтрации строк и групп.

ORDER BY задаёт порядок результата, LIMIT ограничивает число строк, а OFFSET пропускает заданное число строк.

  • ORDER BY может сортировать по одному или нескольким выражениям по возрастанию или убыванию.
  • Без ORDER BY база не гарантирует, какие строки появятся первыми.
  • LIMIT полезен для ограниченных результатов, а OFFSET часто применяется вместе с LIMIT для простой пагинации.
  • Стабильный порядок пагинации требует достаточного числа столбцов сортировки для однозначного разрешения совпадений.

Зачем это спрашивают: Интервьюер оценивает понимание детерминированного порядка и ограничения набора результатов.

sqlschema

Aliases дают временные имена выходным выражениям или источникам данных внутри одного запроса.

  • Alias столбца делает вычисленный или переименованный результат понятнее.
  • Alias таблицы сокращает qualified references вроде o.customer_id.
  • Aliases особенно полезны, когда одна таблица несколько раз участвует в self-join.
  • Alias не переименовывает исходный объект базы данных.

Зачем это спрашивают: Сильный ответ объясняет aliases как имена в области запроса, а не изменения схемы.

joins

INNER JOIN возвращает комбинации строк, выполняющие условие соединения с обеих сторон.

  • Типичное условие сопоставляет внешний ключ с ключом, на который он ссылается.
  • Строки без подходящей пары исключаются.
  • Одна строка может появиться в нескольких строках результата, если соответствует нескольким строкам другой стороны.
  • Условие ON определяет связь, а WHERE может дополнительно фильтровать соединённый результат.

Зачем это спрашивают: Интервьюер проверяет понимание matching behavior и возможного умножения строк в joins.

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