Вопросы 81-90 для разработчиков
| Transactional Queries | Analytical Queries |
|---|---|
| Сосредоточены на коротких, повседневных операциях (INSERT, UPDATE, DELETE) | Сосредоточены на сложном анализе, агрегациях и преобразованиях данных |
| Оптимизированы для высокой скорости и быстрого ответа (низкая latency) | Обрабатывают большие объёмы данных и обычно read-heavy |
| Используются в OLTP системах для рутинных операций | Используются в OLAP системах для анализа и отчётов |
| Помогают поддерживать целостность данных при обычных операциях | Помогают принимать решения, предоставляя insights из данных |
Ответ: 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;
| Bitmap Index | B-tree Index |
|---|---|
| Использует bitmaps (массивы битов) для представления данных | Использует сбалансированную tree структуру для хранения данных в отсортированном порядке |
| Подходит для low-cardinality столбцов (например, пол, да/нет) | Подходит для high-cardinality столбцов (например, ID, большие диапазоны) |
| Эффективен для логических операций (AND, OR, NOT) | Эффективен для range-based запросов |
| Лучше всего для фильтрации и boolean условий | Лучше всего для поиска и сортировки больших наборов данных |
| Blocking | Deadlocking |
|---|---|
| Одна транзакция ждёт, потому что другая держит lock | Две или более транзакции ждут друг друга (циклическое ожидание) |
| Разрешается автоматически после освобождения lock | Требуется обнаружение и откат для разрешения |
Транзакция A держит lock на таблице. Транзакция B ждёт этого lock и не может продолжиться.
Транзакция A держит lock на таблице 1 и хочет table 2. Транзакция B держит lock на таблице 2 и хочет table 1. Обе ждут друг друга.
Задача: Удалить дубликаты, сохраняя первую запись.
DELETE M1
FROM managers M1, managers M2
WHERE M2.Name = M1.Name AND M1.ID > M2.ID;
WITH CTE AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY ID) AS rn
FROM managers
)
DELETE FROM CTE WHERE rn > 1;
Задача: Найти имя сотрудника, обработав все возможные NULL значения в разных столбцах имён.
SELECT ID, COALESCE(FName, SName, LName) as Name
FROM employees;
SELECT ID,
TRIM(CONCAT(COALESCE(FName, ''), ' ', COALESCE(SName, ''), ' ', COALESCE(LName, ''))) as FullName
FROM employees;
Задача: Найти сотрудников, нанятых за последние 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;
-- Последние 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;