ТОП-20 хитрых вопросов по SQL для собеседования

8
33930
Добавить в избранное

Техническое собеседование может грозить не только общением по теме вакантной должности. Подборка занятных вопросов по SQL для подготовки.


ТОП-20 хитрых вопросов по SQL для собеседования

1. Как найти дубликат записи? Опишите процесс для дублирования записей с одним и несколькими полями.

Дублирование записей с одним полем:

Дублирование записей с несколькими полями:

2. Как, используя CTE, найти пятый по величине оклад в таблице?

3. Есть две таблицы, созданные и заполненные следующим образом:

Какой будет результат выполнения запроса:

Объясните свой ответ.

Результат будет выглядеть следующим образом:

Оператор EXISTS – это отвлекающий маневр. Тут всегда будет true, т. к. ID не является членом dbo.docs. Таким образом, ID будет ссылаться на таблицу envelope, сравнивая себя с самим собой.

4. Что не так с этим запросом? Исправьте его, если нужно.

Неверное выражение BillingYear в условии WHERE. Несмотря на то, что он определен как алиас в выборке SELECT перед WHERE, логический порядок обработки условий отличается. Программисты привыкли к тому, что операторы выполняются сверху вниз или слева направо, но в T-SQL это происходит в другом порядке.

Правильный запрос будет выглядеть так:

5. Учитывая данные из таблицы A:

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

6. Как скопировать данные из одной таблицы в другую?

7. Дана таблица tbl и поля nmbr со следующими значениями:

1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1

Написать запрос, чтобы установить 2 вместо 0 и установить 3 вместо 1.

8. Предположим, есть две таблицы Emp (ID, name, DeptId), Dept(ID, name).

В таблице Emp 10 записей, а в Dept – 5. Сколько строк будет отображаться в результате следующего SQL-запроса:

Объясните свой ответ.

Запрос выведет 50 строк, т. к. тут перекрестное объединение, являющееся значением по умолчанию, когда условие WHERE, отсутствует.

9. Напишите SQL-запрос, с применением UNION ALL (не UNION), использующий WHERE для устранения дубликатов.

Ключевое место – AND a!=X. Это дает вам все плюшки UNION DISTINCT, избегая при этом просадки производительности.

10. Чем отличается VARCHAR от NVARCHAR?

NVARCHAR способен хранить значения в формате Unicode – каждый символ занимает 2 байта, а кодировка занимает 65 536 символов.

VARCHAR хранит значения в формате SACII – каждый символ занимает байт, а кодировка занимает 256 символов.

11. Что такое план запросов? Когда бы вы его использовали? Как посмотреть план?

План запросов – это «карта», отображающая графически или в виде текста способы получения данных, последовательность операций, сортировки, группировки и т. д. Эти планы очень полезны разработчику для понимания и анализа характеристик производительности запроса или хранимой процедуры.

Во многих системах SQL план выполнения можно получить с помощью ключевого слова EXPLAIN. В Microsoft SQL Server Query Analyzer имеет в раскрывающемся меню параметр “Show Execution Plan”. Если его активировать, то при выполнении запроса план будет отображаться в отдельном окне.

12. Как из таблицы выбрать все записи c четными ID? А с нечетными?

Это один из распространенных вопросов по SQL на собеседованиях.

Выбор четных записей:

Выбор нечетных записей:

13. Что делают функции NVL и NVL2? Чем они отличаются?

Как NVL(exp1, exp2), так и NVL2(exp1, exp2, exp3) исследуют значение exp1 на предмет NULL. Функция NVL заменяет значение, если встречается NULL. Функция NVL2 проверяет значение exp1. Если оно не NULL, то возвращается exp2, иначе – exp3.

14. Важен ли в составном индексе порядок столбцов?

Важен. Когда строится составной индекс, сначала индексируется первый столбец, а потом строятся индексы других столбцов, на основании главного (первого).

15. В чем разница между однорядными и многорядными функциями? Для чего используется GROUP BY?

Однорядные функции одновременно работают только с одной строкой, а многорядные функции – с данными из нескольких строк.

Команда GROUP BY объединяет все записи, имеющие одинаковые значения в определенном поле или любой группе полей.

16. В чем разница между условиями WHERE и HAVING?

Если в запросе не используется GROUP BY, то условия WHERE и HAVING эквивалентны.

Но при использовании GROUP BY:

  • Условие HAVING используется для фильтрации значений из группы (т. е. для проверки условий после выполнения агрегации в группы).
  • Условие WHERE используется для фильтрации записей из результата до срабатывания какой-либо группировки.

17. Что выведет приведенный запрос, если в таблице Employee 10 записей?

Этот запрос вернет 10 записей, т. к. TRUNCATE выполняется в транзакции.

18. Можно ли явным образом задать значение поля AUTO_INCREMENT?

Да, можно. Например, так:

19. Как получить последний id без использования функции max?

В MySQL:

В SQL Server:

20. Чем отличается IN от EXISTS?

Это еще один из популярных вопросов по SQL.

IN:

  • Работает результирующим набором.
  • Не применяется во вложенных запросах.
  • Сравнивает все значения в списке результатов
  • Имеет сравнительно низкую производительность при работе с большими результатами и подзапросами.

EXISTS:

  • Работает с виртуальными таблицами.
  • Используется со связанными запросами.
  • Выводит результаты сравнения, если true.
  • Обладает высокой производительностью, что облегчает обработку больших подзапросов.
Мы рассмотрели основные из распространенных вопросов по SQL.

Среди них встречаются не совсем понятные и очевидные, но это делает их более интересными. Тренируйтесь, пробуйте, читайте и у вас получится пройти собеседование на должность вашей мечты.

Мы что-то упустили? Напишите нам о каверзных вопросах по SQL, которые вам встречались.

Другие материалы по теме:

Инетесуетесь базами данных?

Подпишитесь на нашу рассылку, чтобы получать больше интересных материалов:

И не беспокойтесь, мы тоже не любим спам. Отписаться можно в любое время.




Комментариев: 8

  1. Сергей Чаулин

    Собрали в кучу несколько СУБД (IDENTITY_INSERT — MS SQL, NVL — Oracle/MySql и т.д.)

  2. Иван Шевяков

    Truncate операция DDL. С какого перепугу она стала транзакционной?

    1. «TRUNCATE выполняется в транзакции» — здесь нет указания на то, что данная операция транзакционная.
      Truncate — это DML (Data Manipulation Language) (а не DDL) операция и она схожа с DELETE без WHERE.
      Под транзакцией имелся ввиду набор последовательных действий, производимых в БД в логическом порядке.

  3. Святослав Шульпин

    В п. 7 опечатка. Запрос
    «update TBL set Nmbr = case when Nmbr = 0 then Nmbr+2 else Nmbr+3 end;»
    даст не 2 вместо 0 и 3 вместо 1, а 4 вместо 1. В данном примере надо исправить на
    «update TBL set Nmbr = case when Nmbr = 0 then 2 else 3 end;»
    или
    «update TBL set Nmbr = case Nmbr when 0 then 2 else 3 end;»
    или, еще лаконичнее:
    «update TBL set Nmbr = Nmbr+2;»

    Смысл п. 9 непонятен, вероятно, ответ неверен: в общем случае условие «AND a!=X» никак не гарантирует отсутствие дубликатов. 1) в таблице может быть сколько угодно одинаковых записей с a=Z, 2) и первый запрос объединения может возвращать дублирующиеся строки, 3) вводя условие «AND a!=X» можно отфильтровать вовсе даже не дублирующие записи.
    Как вариант: в вопросе пропущены важные условия.

    п. 12 неточная формулировка: «12. Как выбрать все четные записи из таблицы?» Записи в таблице не упорядочены без использования order by, стоит уточнить: «12. Как выбрать все записи С ЧЕТНЫМИ ID?»

    В п. 18 проблема с формулировкой:
    «18. Можно ли неявно вставить строку в столбец идентификаторов?»
    Столбец в строку можно вставить при транспонировании таблицы, но, судя по ответу, вопрос должен быть таким: «Можно ли ЯВНЫМ образом ЗАДАТЬ ЗНАЧЕНИЕ поля AUTO_INCREMENT?»

    1. Спасибо за помощь — мы учли ваши замечания.

  4. Мария Павлова

    В п.7 ошибка либо в условии, либо в варианте решения.

  5. Александр Дайнеко

    Решение 7 задачи не соответствует постановке, потому что после запуска апдейта вместо 0 будут 2, а вместо 1 — 4

  6. Alexander Fedorov

    В первом же запросе ошибка.

Добавить комментарий