Собеседование по SQL: вопросы и задачи

СОДЕРЖАНИЕ
Вопросы по SQL на собеседовании
Основные вопросы по SQL на собеседовании
Чем отличается INNER JOIN от LEFT JOIN?
GROUP BY, HAVING, WHERE — когда и зачем использовать?
DISTINCT — принцип работы и сложности
Как работает NULL — логика сравнения, ошибки
2. Посчитать количество заказов по каждому клиенту
Вопросы на собеседовании по SQL для Junior
1. Пример задачи: Вывести всех пользователей старше 30 лет.
Вопросы на собеседовании для тестировщика
Вопросы по SQL на собеседовании
SQL — ключ к данным компании. Его знание открывает двери в аналитику, разработку и управление продуктами.
Стоит освоить по причинам:
- Широкая распространенность. Большинство компаний (от стартапов до корпораций) хранят данные в реляционных СУБД: PostgreSQL, MySQL, Microsoft SQL Server и других.
- Самостоятельность в аналитике. Даже нетехнические роли (маркетологи, менеджеры) используют язык, чтобы быстро получать информацию для отчетов, A/B-тестов и прогнозов без помощи разработчиков.
- Базовый навык цифровой эры. Это показывает вашу способность работать с данными и решать задачи структурно.
Умение писать запросы стало обязательным минимумом для многих IT-профессий.
Для кого актуально:
Профессия |
Цель |
Программисты |
Работа с БД в backend, ORM, оптимизация запросов. |
Тестировщики |
Проверка целостности данных, создание тестовых сценариев. |
Аналитики |
Извлечение данных, построение отчётов, A/B-тесты. |
BI-специалисты |
Визуализация данных в Power BI/Tableau (основа — SQL-запросы). |
Джуны |
Быстрый старт: язык запросов проще, чем Python/Java, но востребован. |
Основные вопросы по SQL на собеседовании
Что такое SQL?
SQL, или язык структурированных запросов, поддерживается большинством современных СУБД (систем управления базами данных). Он помогает:
- Извлекать данные: используя команду SELECT для получения нужной информации.
- Модифицировать записи: добавлять новые, редактировать или удалять существующие данные.
- Проектировать структуры: создавать таблицы и другие элементы БД.
Чем отличается INNER JOIN от LEFT JOIN?
Главное отличие: INNER JOIN работает по принципу «только совпадения», а LEFT JOIN — «все из левой таблицы плюс совпадения, если они есть».
- INNER JOIN выбирает только те строки, где найдены соответствующие значения в обоих списках. Если совпадений нет — запись не включается в результат.
- LEFT JOIN выводит все строки из левой (первой) части, даже если в правом (втором) списке нет подходящих значений. В таком случае недостающие данные заменяются на NULL.
GROUP BY, HAVING, WHERE — когда и зачем использовать?
WHERE — применяется до группировки для фильтрации отдельных записей (например, отбор товаров дороже 1000 ₽).
GROUP BY — объединяет данные в группы (например, подсчет заказов по городам).
HAVING — фильтрует результаты группировки (например, оставить только города с более чем 100 заказами).
Последовательность:
- Сначала WHERE отсеивает ненужные строки.
- Затем GROUP BY группирует оставшиеся данные.
- После этого HAVING отбирает подходящие группы.
-- Средний возраст клиентов по городам, где средний возраст > 30 SELECT city, AVG(age) as avg_age FROM clients WHERE status = 'active' -- Фильтр до группировки GROUP BY city HAVING AVG(age) > 30; -- Фильтр после группировки
DISTINCT — принцип работы и сложности
DISTINCT убирает дубликаты из результата.
Ошибки:
- Использование с большими данными → Замедление запроса.
- Неочевидные дубли: DISTINCT учитывает все поля в SELECT.
Пример:
SELECT DISTINCT city, country -- Уникальные пары "город-страна" FROM clients;
Как работает NULL — логика сравнения, ошибки
Указывает на «Значение не определено».
Ловушки:
Пример:
SELECT * FROM users WHERE phone IS NULL; -- Верно WHERE phone = NULL; -- Неверно (вернет пустой результат)
SQL задачи на собеседовании
1. Найти дубли в таблице
Условие: Есть дубли по полю email.
Решение:
SELECT email, COUNT(*) as count FROM users GROUP BY email HAVING COUNT(*) > 1;
2. Посчитать количество заказов по каждому клиенту
Условие: Списки clients и orders.
Решение:
SELECT clients.name, COUNT(orders.id) as order_count FROM clients LEFT JOIN orders ON clients.id = orders.client_id GROUP BY clients.id;
3. Объединить два запроса
Разница в том, что UNION объединяет результаты, удаляя дубли, а UNION ALL объединяет все, включая дубли.
SELECT name FROM employees UNION SELECT name FROM clients;
4. Вложенные подзапросы
Пример в WHERE:
SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products);
Пример в SELECT:
SELECT name, (SELECT COUNT(*) FROM orders WHERE user_id = users.id) as order_count FROM users;
Вопросы на собеседовании по SQL для Junior
1. Пример задачи: Вывести всех пользователей старше 30 лет.
Решение:
SELECT * FROM users WHERE age > 30;
2. Понимание JOIN’ов
Что такое Self JOIN и зачем он нужен?
Это операция, при котором таблица соединяется сама с собой, как будто это две разные части. Такой трюк полезен, когда нужно сравнить или связать данные внутри одной.
Как это работает?
- Таблица временно «раздваивается» — ей дают два разных алиаса (например, A и B).
- JOIN выполняется по условию, которое связывает строки внутри одного списка.
Пример: поиск клиентов из одного города
Допустим, у нас есть список Customers, и мы хотим найти пары клиентов, живущих в одном городе:
SELECT A.CustomerName AS Customer1, B.CustomerName AS Customer2, A.City FROM Customers A JOIN Customers B ON A.City = B.City AND A.CustomerID <> B.CustomerID ORDER BY A.City;
3. Работа с LIMIT, OFFSET
Задача: Вывести первые 10 товаров, пропустив первые 5.
Решение:
SELECT * FROM products ORDER BY id LIMIT 10 OFFSET 5;
4. Простейшие группировки
Задача: Посчитать количество заказов в каждом городе.
Решение:
SELECT city, COUNT(*) AS orders_count FROM orders GROUP BY city;
5. Ошибки
WHERE против HAVING, = против IN
- WHERE фильтрует до группировки.
- HAVING фильтрует после группировки.
-- Ошибка: HAVING без GROUP BY SELECT city, AVG(age) FROM users HAVING AVG(age) > 30; -- Правильно: SELECT city, AVG(age) FROM users GROUP BY city HAVING AVG(age) > 30;
- = → Для сравнения с одним значением.
- IN → Для списка значений.
SELECT * FROM users WHERE city IN ('Москва', 'Санкт-Петербург');
Вопросы на собеседовании для тестировщика
1. Проверка наличия записей
Задача: Убедиться, что пользователь с email test@example.com существует.
Решение:
SELECT * FROM users WHERE email = 'test@example.com';
2. Выборка по статусам, проверка бизнес-логики
Задача: Все заказы в статусе «доставлено» должны иметь дату доставки.
Проверка:
SELECT * FROM orders WHERE status = 'delivered' AND delivery_date IS NULL; -- Найдем баг
3. Сравнение таблиц A и B
Задача: Найти записи, которые есть в списке A, но нет в B.
Решение:
SELECT * FROM table_a WHERE NOT EXISTS ( SELECT 1 FROM table_b WHERE table_a.id = table_b.id );
4. Поиск багов через SQL
Дубликаты ID:
SELECT id, COUNT(*) FROM orders GROUP BY id HAVING COUNT(*) > 1;
Пропущенные значения:
SELECT * FROM users WHERE phone IS NULL;
Пройти собеседование: ТОП-20 SQL-вопросов и задач
1. Чем отличается DELETE от TRUNCATE?
DELETE удаляет строки с возможностью отката.
TRUNCATE удаляет все строки мгновенно (нельзя откатить).
2. Что такое индекс?
Структура для ускорения поиска (но замедляет вставку).
3. Что делает COALESCE?
Возвращает первое не-NULL значение:
SELECT COALESCE(email, 'N/A') FROM users;
4. Как работает LIKE?
Поиск по шаблону:
SELECT * FROM users WHERE name LIKE 'Иван%';
5. Что такое PRIMARY KEY?
Уникальный идентификатор строки.
6. Как вывести 3 самые дорогие товара?
SELECT * FROM products ORDER BY price DESC LIMIT 3;
7. Как обновить несколько строк?
UPDATE users SET status = 'active' WHERE registration_date < '2023-01-01';
8. Как добавить столбец в таблицу?
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
9. Что такое VIEW?
Виртуальная таблица на основе требования.
10. Как найти максимальное значение?
SELECT MAX(price) FROM products;
11. Чем BETWEEN отличается от IN?
BETWEEN → Диапазон, IN → Список значений.
12. Как удалить дубликаты?
DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );
13. Что такое CASE?
Условная логика в запросе:
SELECT name, CASE WHEN age < 18 THEN 'Младше 18' ELSE 'Старше 18' END AS age_group FROM users;
14. Как работает UNION?
Объединяет результаты двух требований, удаляя дубли.
15. Что такое оконные функции?
Вычисления над группой строчек (например, RANK(), ROW_NUMBER()).
16. Как посчитать сумму в группе?
SELECT category, SUM(price) FROM products GROUP BY category;
17. Что делает EXISTS?
Проверяет наличие строк в подзапросе:
SELECT * FROM users u WHERE EXISTS ( SELECT 1 FROM orders WHERE user_id = u.id );
18. Как переименовать столбец?
ALTER TABLE users RENAME COLUMN old_name TO new_name;
19. Что такое транзакция?
Набор операций, которые выполняются атомарно (все или ничего).
20. Как создать резервную копию таблицы?
CREATE TABLE backup_orders AS SELECT * FROM orders;