🗄️ Вопросы интервью по SQL

Вопросы 81-90 для разработчиков

Вопрос SQL 81
В чем различие между transactional и analytical запросами?
Сравнительная таблица:
Transactional Queries Analytical Queries
Сосредоточены на коротких, повседневных операциях (INSERT, UPDATE, DELETE) Сосредоточены на сложном анализе, агрегациях и преобразованиях данных
Оптимизированы для высокой скорости и быстрого ответа (низкая latency) Обрабатывают большие объёмы данных и обычно read-heavy
Используются в OLTP системах для рутинных операций Используются в OLAP системах для анализа и отчётов
Помогают поддерживать целостность данных при обычных операциях Помогают принимать решения, предоставляя insights из данных
Вопрос SQL 82
Как обеспечить консистентность данных между распределёнными БД?
Методы обеспечения консистентности:
  • Distributed Transactions: Гарантируйте что все БД коммитят или откатывают вместе (например, 2PC - Two-Phase Commit)
  • Eventual Consistency: Разрешайте данным становиться консистентными со временем
  • Conflict Resolution: Используйте timestamps или versioning для разрешения конфликтов
  • Data Replication: Синхронизируйте данные между БД
  • Audits & Validation: Регулярно проверяйте и исправляйте несогласованности
Вопрос SQL 83
В чем заключается назначение PIVOT оператора в SQL?

Ответ: PIVOT оператор преобразует строки в столбцы, облегчая суммирование или переупорядочение данных для отчётов.

Пример: Преобразование месячных продаж в формат с каждым месяцем как отдельный столбец

SELECT ProductID, [2021], [2022]
FROM (
    SELECT ProductID, YEAR(SaleDate) AS SaleYear, Amount
    FROM Sales
) AS Source
PIVOT (
    SUM(Amount)
    FOR SaleYear IN ([2021], [2022])
) AS PivotTable;
                
Структура PIVOT:
  • SELECT: Столбцы для отображения
  • FROM: Исходные данные
  • PIVOT: Агрегатная функция и столбец для разворота
  • FOR ... IN: Значения для преобразования в столбцы
Вопрос SQL 84
Что такое bitmap индекс и чем он отличается от B-tree индекса?
Сравнительная таблица:
Bitmap Index B-tree Index
Использует bitmaps (массивы битов) для представления данных Использует сбалансированную tree структуру для хранения данных в отсортированном порядке
Подходит для low-cardinality столбцов (например, пол, да/нет) Подходит для high-cardinality столбцов (например, ID, большие диапазоны)
Эффективен для логических операций (AND, OR, NOT) Эффективен для range-based запросов
Лучше всего для фильтрации и boolean условий Лучше всего для поиска и сортировки больших наборов данных
Вопрос SQL 85
Разница между blocking и deadlocking
Сравнительная таблица:
Blocking Deadlocking
Одна транзакция ждёт, потому что другая держит lock Две или более транзакции ждут друг друга (циклическое ожидание)
Разрешается автоматически после освобождения lock Требуется обнаружение и откат для разрешения
Пример Blocking:

Транзакция A держит lock на таблице. Транзакция B ждёт этого lock и не может продолжиться.

Пример Deadlocking:

Транзакция A держит lock на таблице 1 и хочет table 2. Транзакция B держит lock на таблице 2 и хочет table 1. Обе ждут друг друга.

Вопрос SQL 86
Удалить дублирующиеся данные из таблицы, оставляя только первую запись

Задача: Удалить дубликаты, сохраняя первую запись.

Решение:

DELETE M1
FROM managers M1, managers M2
WHERE M2.Name = M1.Name AND M1.ID > M2.ID;
                
Объяснение:
  • Сравнивает таблицу саму с собой (M1 и M2)
  • Находит строки с одинаковыми Name
  • Удаляет строки с бо́льшим ID (сохраняя строки с меньшим ID)
Альтернатива с CTE:

WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY ID) AS rn
    FROM managers
)
DELETE FROM CTE WHERE rn > 1;
                
Вопрос SQL 87
Найти имя сотрудника используя COALESCE() когда First_Name, Second_Name или Last_Name может содержать NULL

Задача: Найти имя сотрудника, обработав все возможные NULL значения в разных столбцах имён.

Решение:

SELECT ID, COALESCE(FName, SName, LName) as Name
FROM employees;
                
Объяснение:
  • COALESCE() возвращает первое не-NULL значение
  • Сначала проверяет FName (First Name)
  • Если FName NULL, проверяет SName (Second Name)
  • Если SName NULL, использует LName (Last Name)
Альтернатива для объединения всех имён:

SELECT ID, 
    TRIM(CONCAT(COALESCE(FName, ''), ' ', COALESCE(SName, ''), ' ', COALESCE(LName, ''))) as FullName
FROM employees;
                
Вопрос SQL 88
Найти сотрудников, нанятых в последние N месяцев используя функцию TIMESTAMPDIFF()

Задача: Найти сотрудников, нанятых за последние N месяцев.

Решение:

SELECT *, TIMESTAMPDIFF(month, HireDate, CURRENT_DATE()) as DiffMonth
FROM employees
WHERE TIMESTAMPDIFF(month, HireDate, CURRENT_DATE())
BETWEEN 1 and 5
ORDER BY HireDate DESC;
                
Объяснение:
  • TIMESTAMPDIFF(month, date1, date2) вычисляет разницу в месяцах
  • date1 = HireDate (дата найма)
  • date2 = CURRENT_DATE() (сегодняшняя дата)
  • WHERE BETWEEN 1 and 5 находит сотрудников, нанятых от 1 до 5 месяцев назад
Примеры для разных единиц времени:

-- Последние N дней
WHERE TIMESTAMPDIFF(day, HireDate, CURRENT_DATE()) BETWEEN 1 AND 30;

-- Последние N недель
WHERE TIMESTAMPDIFF(week, HireDate, CURRENT_DATE()) BETWEEN 1 AND 4;

-- Последний N год
WHERE TIMESTAMPDIFF(year, HireDate, CURRENT_DATE()) = 1;