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

HR
Блог
Собеседование по SQL: вопросы и задачи
Поделиться:

Вопросы по 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 заказами).

Последовательность:

  1. Сначала WHERE отсеивает ненужные строки.
  2. Затем GROUP BY группирует оставшиеся данные.
  3. После этого 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 — логика сравнения, ошибки

Указывает на «Значение не определено».


Ловушки:

  • NULL = NULL → NULL (а не True).
  • Проверка на NULL: IS NULL, а не = 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 и зачем он нужен?

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

    Как это работает?

    1. Таблица временно «раздваивается» — ей дают два разных алиаса (например, A и B).
    2. 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;
    

    Хочешь работать с нами? Отправь свое резюме

    Нажимая на кнопку, вы соглашаетесь с Политикой конфиденциальности персональных данных

    Файлы cookie обеспечивают работу наших сервисов. Используя наш сайт, вы соглашаетесь с нашими правилами в отношении этих файлов.