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 (процедуры, функции, курсоры, пакеты).
Как готовиться к собеседованию?
Не заучивать вопросы, а проверять каждый ответ, написав запрос самому. Решайте задачи на реальных таблицах: сначала предскажите результат, потом выполните запрос.