SQL: вопросы и ответы для собеседования (на примере Oracle)

Здесь собраны частые вопросы с краткими ответами. Примеры даны в синтаксисе Oracle, но большинство ответов подходит и для других баз данных. В вакансиях часто встречается и SQL Server (T-SQL), поэтому где нужно, отмечаем разницу.

Основы

1. Что такое DDL, DML, DCL и TCL? DDL меняет структуру (CREATE, ALTER, DROP, TRUNCATE). DML меняет данные (INSERT, UPDATE, DELETE, MERGE). DCL управляет правами (GRANT, REVOKE). TCL управляет транзакциями (COMMIT, ROLLBACK, SAVEPOINT). В Oracle команда DDL выполняет неявный COMMIT.

2. Чем WHERE отличается от HAVING? WHERE фильтрует строки до группировки, HAVING фильтрует группы после группировки.

SELECT department_id, COUNT(*) AS cnt
FROM employees
WHERE salary > 3000
GROUP BY department_id
HAVING COUNT(*) > 5;

3. Чем отличаются DELETE, TRUNCATE и DROP? DELETE удаляет строки по условию и может быть отменён (ROLLBACK). TRUNCATE быстро удаляет все строки, это DDL, откатить нельзя. DROP удаляет саму таблицу.

4. Чем PRIMARY KEY отличается от UNIQUE? Оба обеспечивают уникальность. В таблице может быть только один PRIMARY KEY, и он не допускает NULL. UNIQUE может быть несколько, и в Oracle он допускает NULL.

JOIN

5. Какие бывают виды JOIN? INNER JOIN возвращает только совпадающие строки. LEFT JOIN — все строки левой таблицы, RIGHT JOIN — правой, FULL JOIN — обеих. CROSS JOIN даёт все комбинации пар.

6. Как найти строки одной таблицы, у которых нет пары в другой? LEFT JOIN и проверка ключа правой таблицы на IS NULL.

SELECT c.customer_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
WHERE o.order_id IS NULL;

7. Чем UNION отличается от UNION ALL? UNION убирает дубликаты (требуется дополнительная сортировка), UNION ALL сохраняет всё и работает быстрее. В Oracle MINUS вычитает второй запрос из первого (в других базах — EXCEPT).

NULL и функции

8. Как сравнивать с NULL? = NULL никогда не истинно. Используйте IS NULL / IS NOT NULL. Чтобы заменить NULL, есть NVL(x, 0) и стандартный COALESCE(x, y, 0). Особенность Oracle: пустая строка ('') считается NULL.

9. В чём ловушка NOT IN с NULL? Если в подзапросе есть NULL, NOT IN не вернёт ни одной строки, потому что сравнение становится «неизвестным». Надёжнее использовать NOT EXISTS.

10. Чем отличаются COUNT(*), COUNT(столбец) и COUNT(DISTINCT столбец)? COUNT(*) считает все строки. COUNT(столбец) считает значения, не равные NULL. COUNT(DISTINCT столбец) считает уникальные значения без NULL.

Подзапросы и группировка

11. Чем подзапрос отличается от JOIN? Что такое коррелированный подзапрос? Подзапрос выполняется внутри другого запроса. Коррелированный подзапрос выполняется заново для каждой строки внешнего запроса и ссылается на его столбцы. Чаще JOIN быстрее и читаемее, но подзапрос с EXISTS хорошо работает на больших таблицах.

12. В чём разница между EXISTS и IN? IN проверяет список значений, EXISTS проверяет, вернул ли подзапрос хотя бы одну строку, и безопаснее с NULL.

13. Чем GROUP BY отличается от DISTINCT? DISTINCT убирает дубликаты. GROUP BY формирует группы и позволяет применять агрегатные функции.

Оконные функции и Top N

14. Чем отличаются ROW_NUMBER, RANK и DENSE_RANK? ROW_NUMBER даёт каждой строке уникальный номер. RANK при равенстве ставит одинаковый номер и пропускает следующий (1, 1, 3). DENSE_RANK не пропускает (1, 1, 2).

SELECT employee_id, salary,
       RANK() OVER (ORDER BY salary DESC) AS rnk
FROM employees;

15. Как найти три самые высокие зарплаты? В Oracle 12c и выше: FETCH FIRST 3 ROWS ONLY. В старом подходе — подзапрос и ROWNUM.

SELECT * FROM employees
ORDER BY salary DESC
FETCH FIRST 3 ROWS ONLY;

ROWNUM присваивается до сортировки, поэтому WHERE ROWNUM <= 3 ORDER BY ... напрямую не даёт правильный Top N.

Индексы, представления, транзакции

16. Что такое индекс и когда его использовать? Индекс — структура данных для ускорения поиска. Полезен для столбцов, часто используемых в WHERE, JOIN и ORDER BY. Цена: замедляется запись (INSERT/UPDATE/DELETE) и занимается место. Для столбца с малым числом значений и маленькой таблицы польза невелика.

17. Чем View отличается от Materialized View? View — именованный запрос, выполняется каждый раз заново. Materialized View хранит результат и требует обновления, ускоряет отчёты и крупные агрегаты.

18. Что такое sequence и identity-столбец? Sequence — объект, генерирующий уникальные последовательные числа. С Oracle 12c столбец с GENERATED AS IDENTITY получает значение автоматически.

19. Что такое транзакция и что значит ACID? Транзакция — группа операций, выполняемых как единое целое. ACID: атомарность, согласованность (consistency), изоляция, долговечность. COMMIT подтверждает, ROLLBACK откатывает, SAVEPOINT создаёт промежуточную точку.

20. Для чего нужен MERGE? В одной команде обновить строку, если она есть, или вставить, если её нет (upsert).

Вопросы по PL/SQL (для вакансий на Oracle)

21. Чем процедура отличается от функции? Функция обязательно возвращает значение и может вызываться внутри SQL-выражения. Процедура может не возвращать значение, может передавать результат через OUT-параметры и вызывается отдельно.

22. Как работает обработка исключений? В блоке EXCEPTION пишутся обработчики: WHEN NO_DATA_FOUND, WHEN TOO_MANY_ROWS, WHEN OTHERS. Для своего исключения используют RAISE или RAISE_APPLICATION_ERROR.

23. Чем неявный курсор отличается от явного? Неявный курсор Oracle открывает сам (SELECT INTO, DML). Явный вы объявляете и управляете им через OPEN, FETCH, CLOSE, он нужен для многострочных результатов.

24. Чем полезен пакет (package)? Хранит связанные процедуры, функции и переменные вместе (спецификация и тело), позволяет скрыть реализацию и повышает производительность.

25. Что такое триггер? Блок PL/SQL, который автоматически срабатывает до или после события (INSERT, UPDATE, DELETE). В строковом триггере используются :NEW и :OLD.

Практика

Знать ответ недостаточно, нужно написать SQL и проверить. - SQL-задачи с автоматической проверкой - Подготовка к экзамену Oracle 1Z0-071 - Подготовка к экзамену Oracle 1Z0-149 (PL/SQL) - Вакансии IT и Data

Частые вопросы

Какие темы чаще всего спрашивают на SQL-собеседованиях?

Виды JOIN, поведение NULL, GROUP BY и HAVING, подзапросы, оконные функции, индексы, разницу DELETE и TRUNCATE и транзакции. В вакансиях на Oracle дополнительно могут спросить PL/SQL (процедуры, функции, курсоры, пакеты).

Как готовиться к собеседованию?

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