Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Работа Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
 Задачи для SQL-джунов (с ответами)  [new]
Пельмени
Member

Откуда:
Сообщений: 390
В общем, решил погуглить типичные задачи на собеседованиях, чтобы не так скучно было учиться. Делюсь.

1. Что вернет условие
2 <> NULL
?
+
Сравнение с NULL — это, наверное, первый подводный камень, на который натыкаются люди при работе с базой данных. Вопреки привычной логике условие

2 <> NULL
возвращает ложь (FALSE), как впрочем и условие
2 = NULL

Дело здесь в том, что тип значения NULL в SQL имеет несколько другой оттенок значения, чем в прикладных языках программирования. Если в С-подобных языках NULL значит отсутствие какого-то значения, то в SQL он значит лишь то, что мы не знаем этого значения. По этой причине любое сравнение с NULL возвращает ложь.

Возвращаясь к сути вопроса, мы не можем сказать «Два не равно NULL» потому, что мы не знаем значения справа от знака неравенства, а там как раз может оказаться двойка.


2. Что вернет условие
3 NOT IN (1, 2, NULL)
?
+
Здесь та же история, что и в предыдущем случае. Условие
3 NOT IN (1, 2, NULL)
возвращает ложь (FALSE), как и условие
3 IN (1, 2, NULL)

Причина этого заключается в особенностях работы оператора IN. Проверяя, что определенное значение входит в коллекцию, оператор IN просто сравнивает это значение с каждым элементом коллекции.

Другими словами:
3 IN (1, 2, NULL)
это то же самое, что и
(3 = 1) OR (3 = 2) OR (3 = NULL)

В случае с NOT IN условие:
3 NOT IN (1, 2, NULL)
это то же самое, что и
(3 <> 1) AND (3 <> 2) AND (3 <> NULL)

Как мы знаем из предыдущего примера, 3 <> NULL возвращает ложь, а значит и все условие
(3 <> 1) AND (3 <> 2) AND (3 <> NULL)
тоже будет ложным.


3. Выполнится ли этот запрос?
SELECT 
order_id,
order_code,
SUM(order_value)
FROM
orders
GROUP BY
order_id
+
Едино правильного ответа на этот вопрос нет — все зависит от базы данных. Проблема этого запроса заключается в том, что колонка order_code не указана в выражении GROUP BY и при этом для нее не определена агрегатная функция. То есть по отношению к колонке order_code мы не знаем группировать ее или группировать по ней.

Если этот запрос будет выполняться в MySQL, то колонка order_code добавится в выражение GROUP BY автоматически и запрос выполнится нормально. Если же этот запрос будет выполняться MS SQL Server, то по умолчанию будет сгенерирована ошибка. Впрочем, это поведение настраивается.


4. Почему не выполнится этот запрос?
SELECT 
user_name,
YEAR(user_birth_date) AS year_of_birth
FROM
users
WHERE
year_of_birth = 2000
+
Запрос не выполнится из-за обращения к псевдониму year_of_birth в выражении WHERE. Дело в том, что псевдонимы полей в SQL используются для форматирования данных уже полученных из базы. Поэтому их можно использовать только в выражениях, которые отвечают за оформление результата, таких как GROUP BY, ORDER BY и HAVING. В выражениях, отвечающих за получение данных, таких как WHERE, нужно использовать оригинальные имена полей.

WHERE
YEAR(user_birth_date) = 2000


5. Имеет ли значение порядок колонок в составном индексе?
+
Да.

CREATE NONCLUSTERED INDEX MyInd on users (user_name, user_birth_date);
это не то же самое, что
CREATE NONCLUSTERED INDEX MyInd on users (user_birth_date, user_name);

При создании составного индекса сначала строится обычный индекс для его первой колонки, а потом уже на основе него строится индекс для второй колонки и так дальше.

Другими словами, колонки, по которым поиск выполняется чаще всего, должны стоять в составном индексе первыми.


6. Какая разница между TRUNCATE TABLE table_name и DELETE FROM table_name?
+
Фактически обе эти команды вызовут удаление всех строк из таблицы под названием table_name, но вот произойдет это совсем по-разному:

При вызове команды TRUNCATE таблица полностью сбрасывается и создается снова, в то время как команда DELETE удаляет каждую строку таблицы по отдельности. Из-за этого TRUNCATE отрабатывает значительно быстрее.
Как следствие первого пункта, команда TRUNCATE не вызывает срабатывание триггеров и правил внешних ключей, то есть, очищая таблицу таким способом, можно не бояться каскадного удаления или изменения данных в других таблицах.
В отличие от DELETE команда TRUNCATE не транзакционная. То есть, если в момент ее вызова, таблица table_name будет заблокирована какой-либо транзакцией — может возникнуть ошибка.


7. Какая разница между типами CHAR и VARCHAR?
+
Оба эти типа используются для хранения текстовой информации ограниченной длины, а различия между ними следующие:

Тип CHAR хранит значение фиксированной длины. Если строка, помещаемая в колонку данного типа, имеет меньшую длину, чем длина типа — строка будет дополнена пробелами. Например, если в колонку типа CHAR(10) записать строку SQL, то она сохранится как SQL .
Тип VARCHAR хранит значение переменной длины. Под каждое значение этого типа выделяется столько памяти, сколько нужно для этого конкретного значения.

Для типа CHAR используется статическое распределение памяти, из-за чего операции с ним быстрее, чем с VARCHAR.
Таким образом, тип CHAR подходит для хранения строковых данных фиксированной длины (например, инвентарных номеров, хешей), а для остальных строк больше подойдут VARCHAR или NVARCHAR.


8. Какая разница между типами VARCHAR и NVARCHAR?
+
Тип NVARCHAR, пожалуй, самый универсальный из строчных типов данных в БД. Он позволяет хранить строки переменной длины в формате Unicode. В этом формате каждый символ занимает 2 байта, а сама кодировка содержит 65 536 символов и включает в себя все языки мира, в том числе иероглифы.

Тип VARCHAR хранит данные в формате SACII. В этом формате каждый символ занимает 1 байт, но отельная кодировка содержит всего 256 символов. Из-за этого для каждого мирового языка выделяется своя кодировка.

Таким образом, в формате VARCHAR стоит хранить строчные данные, которые точно не придется переводить (например, адреса электронной почты). Для других случаев больше подойдет NVARCHAR.


9. Какая разница между UNION и UNION ALL?
+
Выражения UNION и UNION ALL — это очень надежные поставщики лишних или недостающих строк в результате запроса. Оба эти выражения используются, чтобы объединить результаты нескольких независимых друг от друга запросов. А разница между ними заключается в том, что, если в результатах запросов есть одинаковые строки, то UNION удалит дубликаты, оставив только одну из таких строк. В то же время UNION ALL, как можно догадаться из названия, просто объединит результаты запросов, не обращая внимания на дубликаты.


10. Какая разница между выражениями WHERE и HAVING?
+
Ну и наконец, вопрос, который задают практически на каждом собеседовании по базам данных: про HAVING.
Выражения WHERE и HAVING используются для фильтрации результата запроса и ожидают после себя некоторое условие, по которому нужно отфильтровать данные. Но, если WHERE работает само по себе и фильтрует данные каждой строки результата по отдельности, то выражение HAVING имеет смысл только в сочетании с выражением GROUP BY и фильтрует уже сгруппированные значения.
4 сен 18, 20:17    [21664669]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 748
Пельмени,

а сюда-то это зачем? Типа мега-полезно для поиска работы?
4 сен 18, 20:24    [21664678]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35752
Ага, а потом на всех собеседованиях страны несут чушь, что truncate пересоздает таблицу.
4 сен 18, 20:28    [21664684]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Пельмени
Member

Откуда:
Сообщений: 390
Кстати, да. Я подумал уже, что в эйчарне могут взять вопросы отсюда и мне будет стыдно за такую диверсию.
Часть вопросов не самые адекватные.
4 сен 18, 20:34    [21664691]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Augustus
Member

Откуда:
Сообщений: 307
Эти книги для начинающих хороши:
http://svyatoslav.biz/database_book/
https://vk.com/wall-54530371_2781
4 сен 18, 20:36    [21664694]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Пельмени
Member

Откуда:
Сообщений: 390
Некоторые распространенные вопросы на собеседовании по базам данных.

Что такое первичный ключ?
+
В теории реляционных баз данных логическая группировка элементов данных называется «отношением», а определенный экземпляр отношения - «кортежем». Так вот первичный ключ — это множество атрибутов отношения, которое уникально определяет кортеж этого отношения.

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

Например, рассмотрим таблицу заказов, состоящую из столбцов:

order_id (уникальный номер заказа — первичный ключ)
order_date (дата совершения заказа)
order_customer (покупатель, сделавший покупку)
order_sum (сумма заказа).
В этой таблице столбец order_id является первичным ключом и уникально определяет каждую строку таблицы, т.е. заказ.


Что такое внешний ключ?
+
Когда поле таблицы ссылается на другое поле в другой таблице, оно называется внешним ключом. Поле, на которое он ссылается, является первичным ключом.

Например, в таблице заказов, очевидно, должно быть поле order_customer, которое определяет покупателя сделавшего покупку. Мы могли бы в это поле записывать просто ФИО покупателя. Но как быть, если нам нужно выбрать все заказы, сделанные конкретным покупателем? Велика вероятность, что в таблице могут находится люди, у которых полностью совпадает ФИО.

Во избежание подобных проблем (примеров можно придумать массу) в поле order_customer необходимо хранить внешний ключ, который будет ссылаться на первичный ключ в таблице customers (покупатели).

Например, в таблице заказов будет строка, где в поле order_customer содержится внешний ключ — 3246. Далее в таблице customers необходимо отыскать строку с первичным ключом, равным 3246, в этой строке и будут содержаться все данные покупателя, включая и ФИО.


Что такое нормализация БД?
+
Процесс приведения базы данных к виду, в котором она будет соответствовать правилам нормальных форм, называется нормализацией базы данных.

Нормализация базы данных сводит к минимуму количество избыточной информации. Ее целью является сохранять данные только один раз, но в нужном месте.

Нормализованная база данных исключает дублирование и многократное обслуживание данных, а также появление проблем с целостностью данных, возникающих при повторном вводе одинаковых данных.

Первоначально доктором Эдгаром Коддом были определены только 3 нормальные формы. Дальнейшая разработка реляционной теории привела к появлению еще нескольких форм и на данный момент их насчитывается 6.

На практике соответствие базы данных правилам 3-ей нормальной формы вполне достаточно.


Что такое денормализация БД? Для чего она нужна?
+
Денормализация — это процесс осознанного приведения базы данных к виду, в котором она не будет соответствовать правилам нормализации. Обычно это необходимо для повышения производительности и скорости извлечения данных, за счет увеличения избыточности данных.

Если приложению необходимо часто выполнять выборки, которые занимают слишком много времени (например, объединение данных из множества таблиц), то следует рассмотреть возможность проведения денормализации.

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

Прежде чем приступать к денормализации, необходимо убедится, что ожидаемые результаты оправдывают издержки, с которыми придется столкнуться.


Что такое кластерный и некластерный индекс?
+
Индексы делятся на 2 вида — кластерный и некластерный.

Обычно СУБД хранит строки в том порядке, в котором они добавляются в таблицу.

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

Некластерный индекс хранит указатели на строки в таблице. Такой способ хранения подразумевает после обращения к индексу обращение к самой таблице для получения строк.

Наиболее часто используемые типы индексов:
B-деревья
Хеши
R-деревья
Полнотекстовые
В отличие от некластерного индекса, таблица может иметь только один кластерный индекс.


Какие типы соединений (join) таблиц существуют? В чем их разница?
+
Существуют следующие типы соединений таблиц:
INNER JOIN
FULL OUTER JOIN
LEFT OUTER JOIN
RIGHT OUTER JOIN
CROSS JOIN

CROSS JOIN является полным декартовым произведением, т.е. возвращает все возможные сочетания записей таблиц A и B. В стандартном SQL CROSS JOIN выполняется без условия ON, однако, например, в MySQL этого ограничения нет и CROSS JOIN является аналогом INNER JOIN.

(Картинки не вставлял)


Что такое SQL курсор?
+
Иногда бывает нужно в результирующем наборе SQL-запроса обрабатывать строки по одной. Для этого обычно используются циклы и объект, называемый курсором.

SQL курсор можно представить как указатель в результирующем наборе. Его можно перемещать, обрабатывая каждую строку, пока не закончится результирующий набор.


Опишите шаги по созданию и использованию курсора?
+
Продемонстрируем использование курсора на простом примере:
CURSOR cselectitem
IS
SELECT id, name FROM items; /* Объявляем курсор, привязывая к нему SQL — запрос. */
BEGIN
OPEN cselectitem; /* Далее перед использованием курсор необходимо открыть */
LOOP
FETCH cselectitem
INTO item_id, item_name; /* В цикле вытаскиваем каждую строку,
используя конструкцию FETCH, и значения
полей выборки записываем в переменные,
которые должны быть заранее объявлены */
EXIT WHEN cselectitem%NOTFOUND; /* Выходим из цикла, когда достигнут конец
результирующего набора */
END LOOP;

CLOSE cselectitem; /* Закрываем курсор */
END


Что такое транзакция?
+
По определению, транзакция — это логическая единица работы.

Транзакция предполагает, что все, входящие в нее SQL-запросы будут обязательно выполнены, причем одновременно.

Начать транзакцию можно при помощи команды BEGIN TRANSACTION. Завершить можно либо сохранив изменения в базе данных при помощи команды COMMIT, либо удалив все сделанные транзакцией изменения командой ROLLBACK

Приведем пример транзакции, которая снимает деньги с одного пользовательского счета и переводит их на другой:
BEGIN TRANSACTION
UPDATE user_account SET balance=balance-100 WHERE account_id=1 /* Снимаем деньги со счета,
ID которого равен 1 */
UPDATE user_account SET balance=balance+100 WHERE account_id=2 /* И переводим эти деньги на
счет, ID которого равен 2 */
COMMIT
Понятно какие-бы проблемы могли бы возникнуть, если бы одна часть этой транзакции была бы выполнена успешно, а другая нет. Однако использование транзакций не допускает подобных ситуаций.

При работе с транзакциями возможны 2 варианта:
результаты выполнения всех запросов, входящих в транзакцию, будут применены к базе данных
все внесенные изменения в базу данных будут отменены (откатаны).
Пока результаты выполнения запросов, входящих в транзакцию не будет применены к базе данных при помощи оператора COMMIT, они остаются невидимы для других пользователей базы данных.


Что такое блокировка?
+
Существует 2 вида взаимодействий с базой данных, которые требуют блокировки 2-х разных типов:
Разделяемая блокировка
Когда пользователь считывает данные, его совершенно не волнует кто эти данные считывает еще.
При подобных операциях на данные накладывается разделяемая блокировка, которая говорит о том, что любая транзакция может выполнять эту же операцию с данными, т.к. она не изменяет их и не сможет привести ни к каким побочным эффектам.

Монопольная блокировка
В случае, если выполняемая операция изменяет данные, на них накладывается монопольная блокировка, которая позволяет изменять данные только одному пользователю.
СУБД не может устанавливать монопольную блокировку на данные, на которые уже установлена разделяемая блокировка. Такое ограничение имеет смысл как для пользователя, который записывает данные, так и для пользователя, который их считывает.


Что такое deadlock?
+
Взаимная блокировка (или deadlock) — это ситуация, при которой возник конфликт между несколькими операциями записи.

Рассмотрим пример (не описываю)

В описанном примере обе операции могут снять блокировку с данных только после полного завершения своей работы. Но для завершения работы операции 1 нужно снятие блокировки с данных B, а для операции 2 снятие блокировки с данных A. Обе операции вступают в бесконечное ожидание снятия блокировки с данных.

Обойти эту проблему никак нельзя, поскольку СУБД не может разрешить двум операциям вносить изменения в один и тот же фрагмент данных одновременно, не потеряв при этом весь контроль над целостностью данных.

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

Другими словами команда COMMIT должна выполняться сразу, как только операция записи станет возможна, для сокращения времени, в течение которого данные заблокированы.


Что такое триггер? (Какие типы триггеров вы знаете?)
+
Триггеры — это части кода, запускаемые автоматически и основанные на каком-либо действии или событии в таблице базы данных.

Триггеры могут применять в таблице во время выполнения операторов INSERT, UPDATE или DELETE, а затем работать или перед, или после этих действий.

Некоторые СУБД также позволяют работать триггерам на уровне оператора или на уровне каждой строки данных во время ее изменения.


В чем разница между WHERE и HAVING?
+
Конструкцию HAVING можно использовать только при наличии конструкции GROUP BY. Она действует по отношению к результатам конструкции GROUP BY аналогично тому, как конструкция WHERE отсеивает строки, возвращаемые оператором SELECT, в соответствии с указанным условием.


Что такое подзапрос (sub-query)?
+
Подзапрос — это запрос, вложенный в другой запрос.

Несколько примеров подзапросов:
SELECT * FROM tableA WHERE id IN (SELECT id FROM tableB)
SELECT * FROM tableA WHERE id > (SELECT AVG(id) FROM tableA)
SELECT tA.* FROM (SELECT * FROM tableA WHERE col IS NOT NULL) tA, tableB tB
WHERE tA.id=tB.id
4 сен 18, 20:55    [21664707]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
aleksrov
Member

Откуда:
Сообщений: 905
Пельмени,

Причем самое забавное что это спрашивают не в зависимости от того на какой уровень идешь, джун, мидл, сеньер, как правило вопросы именно такие, плюс минус.
Просто забавно, я когда переехал в Москву думал тут рынок насыщенней, конкуренция и все такое, и на уровень мидл будут хорошо гонять. Когда готовился пробежался по флагам основным, документрованным и нет, счеткикам (некоторые давненько не использовал, но они полезные) повторил архитектуру (также пробежался по книгам intetrnals 2012, а также 2016 от Короткевича), по оптимизации прошелся, in memory архитектуру также повторил, и все такое, и в общем прихожу я такой на собеседование с мыслью щас меня будут спрашивать вещи типа что за тип ожидания resource_semaphore, ну или хотя что такое memory grant, а меня начинают спрашивать чем right join от lefta отличаются и count(col) от count(*) и я такой думаю: "Черт, вы серьезно, вам там по описанию хренов гуру нужен, а вы такую хрень спрашиваете?!?!?", ладно, думаю наверно дальше будет сложнее и спросят наверно про операторы, раз с join'a начали (merge, hash. loop и adaptive в 2017, про последний никто кстати не спрашивал и вообще по ходу о нем никто не знает), а не фига, дальше такая же шняга и понимаю что собеседующие похоже не работали с БД, а взяли такие вопросики с инета и что нибудь глубже сами не знают.
5 сен 18, 08:20    [21665002]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Hawkmoon
Member

Откуда:
Сообщений: 631
sql-ex.ru
/thread
5 сен 18, 09:08    [21665052]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Augustus
Member

Откуда:
Сообщений: 307
aleksrov,

Ошибка выжившего, тупо повезло.
5 сен 18, 09:20    [21665074]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Чешипузик
Member

Откуда:
Сообщений: 2197
А что в самом первом вопросе не упомянут set ansi_nulls off в ms sql server? Непорядочек!
5 сен 18, 09:24    [21665082]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Алекссс
Member

Откуда:
Сообщений: 1898
Augustus
aleksrov,

Ошибка выжившего, тупо повезло.

+, меня ни одни москвичи не спрашивали про такую фигню
5 сен 18, 09:43    [21665111]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Пельмени
Member

Откуда:
Сообщений: 390
Алекссс
+, меня ни одни москвичи не спрашивали про такую фигню

А что спрашивали?
5 сен 18, 10:06    [21665145]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Алекссс
Member

Откуда:
Сообщений: 1898
Пельмени, недостатки bitmap индексов, методы коллекций, что быстрее commit или rollback, аналитические функции
5 сен 18, 10:48    [21665205]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 240
Пельмени,
ну и что, могу я теперь смело претендовать на вакансию http://www.sql.ru/forum/1300905/junior-oracle-sankt-peterburg-bez-opyta-ot-40-t-r ?
5 сен 18, 11:54    [21665324]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
0lenevod
Member [скрыт]

Откуда:
Сообщений: 370
У нас в Австралии на сеньора такие вопросы задают.


При транкейте еще индексы очищаются и идентификаторы начинают новый отсчет с нуля.
5 сен 18, 11:55    [21665326]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Дмитрий Мух
Member

Откуда: Зеленоград
Сообщений: 748
Пылинка
Пельмени,
ну и что, могу я теперь смело претендовать на вакансию http://www.sql.ru/forum/1300905/junior-oracle-sankt-peterburg-bez-opyta-ot-40-t-r ?

Конечно, главное смело...
5 сен 18, 12:16    [21665406]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Пельмени
Member

Откуда:
Сообщений: 390
Пылинка
Пельмени,
ну и что, могу я теперь смело претендовать на вакансию ...

В душе понятия не имею, куда вы можете претендовать, а куда нет. Это целиком и полностью ваше дело.
5 сен 18, 12:33    [21665453]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Пельмени
Member

Откуда:
Сообщений: 390
Нашел еще вопросы, но они вроде не копируются, потому оставляю ссыль.
И напоминаю про крутой сервис sql-ex.

+
https://jsehelper.blogspot.com/2016/01/sql-1.html
https://jsehelper.blogspot.com/2016/01/blog-post_13.html
5 сен 18, 12:40    [21665471]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Пельмени
Member

Откуда:
Сообщений: 390
Пылинка
Пельмени,
ну и что, могу я теперь смело претендовать на вакансию ...

Я подумал над вашим вопросом и готов дать взвешенный ответ.
Считаю, что нет, не можете.

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

Если это ваша особенность, а не случайная ошибка, то в работе вы тоже будете задавать не те вопросы не тем людям и здоров отжирать ресурсы организации на возню с вами. Хорошим наставником эта проблема, конечно, исправляется. Но если и на собеседовании будут странные вопросы - до наставника дело не дойдет.
5 сен 18, 12:46    [21665485]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
DaniilSeryi
Member

Откуда:
Сообщений: 1197
Эм... Надо будет ещё примеров вопросов накидать.
5 сен 18, 13:40    [21665620]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
PinkCat
Member

Откуда:
Сообщений: 914
0lenevod,

У нас в Австралии на сеньора такие вопросы задают.
-----
Ну работа бывает интересна не только тем что там надо делать и сколько платят, но расположением.

Мне в моей деревне - до ближайшего городка ходит всего 3 паровоза в сутки - уже порядком поднадоело​.
Потому поехал на интервью в контору географически находившуюся в хорошем месте.

Изначальная позиция - C# developer with MS SQL backend.

Приехал раненько - бо, паровозов только три. Спокойненько добрался в университетский городок.
Зарулил в кафе, благо там все закоулки известны - два года отработал над проектом, спокойненько
взбодрился чашечкой эспрессо и потопал на интервью.

Интервьюеров - двое.
Мужик, он же директор, он же теам лид, он же СЕО и т.п.
И молодая девaxa - СТО​, она же чиф ДБА в конторе.
Есть ли еще народ - не знаю - других не видел.

Об конторе известно следующее - занимается картами лояльности и... имеет проблемы с
производительностью системы. Проще - на пике покупок сервера не справляются с потоком
запросов.

Все вопросы задавал мужик, деваха сидела, дремала и хлопала глазками, изредка что-то
пыталась говорить, но, в основном, не по теме, а отвлекая от темы.

По шарпу - вопросов не было.
Вопросы были по лоадбалансингу веб-сервисов и кластеризации сиквельного сервера.
Причем по сиквелу гоняли хуже, чем в других местах на ДБА-позицию.

Ну оно и понятно - у ребяток нарисовалась полная задница в архитектуре системы и даже
самое новое железо их из этой задницы уже не вытаскивает - надо менять архитектуру
системы.
Деваха (т.е. конторский ДБА!) при этом практически спала - ни по текущей организации,
ни по возможным модификациям никаких вопросов не задавала, уточнений не спрашивала.

Наконец интервью подошло к завершению и у меня спрашивают - У вас есть какие-нибудь вопросы?
Вопросов у меня не было... были матюки, но это Я выплюну после того, как выйду из конторы...
Но один вопросик Я все же решил задать. Версию номера 6 из списка выше.

Обращаюсь к ДБА и спрашиваю:
- У вас есть таблица на 10 лямов строк. Каков самый быстрый способ опустошить таблицу?
Тишина.
(Повторяю вопрос, слегка перестроив его грамматику.)
Тишина.
Потом МУЖИК начинает спрашивать об других таблицах и реляциях.
Поясняю:
- Нет там ничего - голая таблица, ни реляций, ни триггеров, ни процедур/функций
в базе. Как ее быстренько почистить? И если не сложно - Я хотел бы услышать ответ от
вашего ДБА... работать то придется либо с нею, либо за нее...

Ответа от девахи так и не было.
А ты говоришь СТО и чиф ДБА...
5 сен 18, 13:59    [21665664]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
0lenevod
Member [скрыт]

Откуда:
Сообщений: 370
PinkCat
0lenevod,

У нас в Австралии на сеньора такие вопросы задают.
-----
Ну работа бывает интересна не только тем что там надо делать и сколько платят, но расположением.

.......

Ответа от девахи так и не было.
А ты говоришь СТО и чиф ДБА...


3 месяца назад собеседовал меня некий Мустафа, он спрашивал чем отличаются хранимая процедура от функции. Мне отказали, потом еще два месяца искали себе разработчика БД. Вот такой Мустафа или Радж сядут на место и потом никого не пускают.

Вчера был в одной конторе, они разрабатывают свой дата варехаус. Мне показали их разработку, что-то там про Кимбал модель терли. Весь варехаус состоит только из факт тейбл, и ни одной дименшн. Точнее там есть три дименшн тейбл созданных по шаблону, видимо взяли из адвенчур воркс, и никак не привязанных к факт тейбл. В общем я не нашел ни одного форейн кей ни на одной факт тейбл. Рылся в базе полдня, так и не нашел стар или сноуфлейк схем.

В конце меня спросили как оптимизировать производительность сервера. Я глянул, там при 24 ГБ памяти на сервере на единственный инстанс отдали всего 7 ГБ. На сегодня планировали обсуждение, а не поменять ли в сп_конфигуре макс сервер мемори до 16 ГБ. На сервере только один инстанс, другого софта нет. Темпдб на диске С, все по дефолту.
5 сен 18, 14:25    [21665727]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
PinkCat
Member

Откуда:
Сообщений: 914
0lenevod,

В общем я не нашел ни одного форейн кей ни на одной факт тейбл.
-----
У меня сейчас такие в работе.
3 различных инсталляции по две базы в каждой - одна 350 таблиц, другая - 400. ​Версии - немного отличаются.
Планируется апгрейд - другой сервер, другие версии баз... будет по 700-800 таблиц на базу...
Ни реляций, ни возможности построить модель...
Но это еще хорошо - хоть типы полей в джойнах согласованы.
До этого была радость где даже типы не совпадали...
5 сен 18, 14:35    [21665742]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 2982
0lenevod
3 месяца назад собеседовал меня некий Мустафа, он спрашивал чем отличаются хранимая процедура от функции. Мне отказали, потом еще два месяца искали себе разработчика БД. Вот такой Мустафа или Радж сядут на место и потом никого не пускают.
Как утверждал один чегорян, если приходишь на собеседование и напротив тебя сидит хотя бы один индус, можно смело вставать, разворачиваться и уходить - толку все равно не будет. Несмотря на некоторую размашистость квантора, вынужден согласиться, что подход скорее оправдан, по крайне мере в Ме / Си, где собеседований может быть много и экономия времени имеет смысл.
5 сен 18, 15:06    [21665803]     Ответить | Цитировать Сообщить модератору
 Re: Задачи для SQL-джунов (с ответами)  [new]
Пельмени
Member

Откуда:
Сообщений: 390
Тема:
Вопросы по собеседованию разработчик БД
http://www.sql.ru/forum/1173187/voprosy-po-sobesedovaniu-razrabotchik-bd

Ту тему тоже зафлудили, как зафлудят мою. Хоть я и надеялся, что это будет тема с задачами и вопросами, а не очередным нытьем "какие все плохие и глупые".
+
автор
T-SQL, индексы, анализ плана запроса, оптимизация запросов

автор
JOIN-ны всех видов, транзакции-блокировки-дедлоки-уровни изоляции, индексы, оптимальное хранение данных, какие новые фичи в последних sql server-ах есть, для хранилищ -- оконные функции, MERGE, OUTPUT, параметризация запросов, трассировка производительности, что в планах запросов, что значит, как читать план.

автор
джуниор левел - про знать джоины, группировку, подзапросы. Задача - найти дубликаты. Теория - pk, fk, немного о нормализации. Все исключительно не привязанное к конкретной субд, голый sql.
p.s. Мой кейс - если кандидат не знает про оконные функции - ему объясняешь - если сможет после этого сделать поиск дубликатов через оконные функции - зачет!
p.p.s - если какндидат путается в джоинах и не может придумать поиск дубликатов - негоден к джуниор позиции.

мидл левел - в дополнение знать как устроены и когда полезны индексы, виды индексов, представлять план запроса, зачем там кост,статистика, виды джоинов. Знать оконные функции, мат. вью. Желательно представлять различия в субд, какие бывают, блокировчники/версионники. Плюсы минусы нормализации.

Сеньер - не буду писать - тут уже не однозначно и зависит от задач, субд, требований и .т.п

автор
Как уже советовали - для Junior - JOIN, GROUP BY, со всеми тонкостями.
Cразу после ВУЗа про HAVING знает только каждый пятый.

Если нужны более интересные вопросы:
- Особенности строковой агрегации - сравнить как это обычно реализуют в Oracle, а как в MS SQL.
- Отличия Table scan и Index scan, Index seek и Index scan - со всеми подробностями, как это работает внутри.
- Что такое партиции. Рассмотреть случай, когда создали таблицу, заполнили её данными, а потом включили в другую таблицу как партицию.
- Уровни изоляции транзакций - последнее время этот вопрос задают практически везде.

Тема 15-го года, не уверен, что сейчас про HAVING знает каждый пятый.
a_voronin
Хотите подивиться и поразвлекаться на собеседованиях. Задайте такой вопрос:

В таблице А 5 записей, в таблице B 10 записей. Что вернёт запрос

SELECT COUNT(*) FROM A, B

?

Потом расскажете, какое кол-во людей скажет: "вернёт ошибку".

я даю ему подсказку, "хорошо, запятая здесь означает CROSS JOIN, так каков результат?"

Так вот лишь в небольшом числе случаев человек взбадривается и говорит, "а ну тогда понятно -- 50". В большинстве случаев он остаётся в ступоре

автор
Я бы задал претенденту следующий вопрос (с учетом привычной для меня предметной области - банков):

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

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

"Скажем, хранение остатков за каждую дату; хранение остатков за дату их изменения; хранение за диапазоны дат с одинаковым значением остатка; что-нибудь еще?".

Попутно добавлю, что порицаю использование старого синтаксиса (FROM a,...,z). Новый синтаксис по умолчанию более понятно описывает тип и условия соединений, группируя их в одном месте запроса - это делает запросы более читабельными и удобными для отладки (кстати, за то же самое одобряю использование СТЕ вместо вложений).

автор
Чтобы не уехать в офф-топик "бизнес-требований" и прочих страшных слов, может переформулируем так:

Мы разрабатываем АБС. Какую модель ведения остатков по счетам Вы можете предложить и от каких параметров, по Вашему мнению, будет зависить выбор той или иной модели?

iv_an_ru
тильда
посоветуйте пожалуйста какие вопросы по БД могут затронуть на собеседовании на позицию разработчика БД.


Самый милый изврат, про который я слышал, был таким. Есть таблица, в которой перечислены некие "специальные" дни. Написать запрос, который имел бы два параметра --- год и число колонок, и возвращал одну длинную строку с символами перевода строки --- календарь, в котором эти специальные дни были бы помечены звёздочками, например, 2015-й год в три колонки выглядел бы так:

                            2015
      January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
             1  2  3   1  2  3  4  5  6  7   1  2  3  4  5  6  7
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   8  9 10 11 12 13 14
11 12 13 14 15 16 17  15 16 17 18 19 20 21  15 16 17 18 19 20 21
18 19 20 21 22 23 24  22 23 24 25 26 27 28  22 23 24 25 26 27 28
25 26 27 28 29 30 31                        29 30 31


       April                  May                   June
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4                  1  2      1  2  3  4  5  6
 5  6  7  8  9 10 11   3  4  5  6  7  8  9   7  8  9 10 11 12 13
12 13 14 15 16 17 18  10 11 12 13 14 15 16  14 15 16 17 18 19 20
19 20 21 22 23 24 25  17 18 19 20 21 22 23  21 22 23 24 25 26 27
26 27 28 29 30        24 25 26 27 28 29 30  28 29 30
                      31*

        July                 August              September
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4                     1         1  2  3  4  5
 5  6  7  8  9 10 11   2  3  4  5* 6  7  8   6  7  8  9 10 11 12
12 13 14 15 16 17 18   9 10 11 12 13 14 15  13 14 15 16 17 18 19
19 20 21 22 23 24 25  16 17 18 19 20 21 22  20 21 22 23 24 25 26
26 27 28 29 30 31     23 24 25 26 27 28 29  27 28 29 30
                      30 31

      October               November              December
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
             1  2  3   1  2  3  4  5  6  7         1  2  3  4  5*
 4  5  6  7  8  9 10   8  9 10 11 12 13 14   6  7  8  9 10 11 12
11 12 13 14 15 16 17  15 16 17 18 19 20 21  13 14 15 16 17 18 19
18 19 20 21 22 23 24  22 23 24 25 26 27 28  20 21 22 23 24 25 26
25 26 27 28 29 30 31  29 30                 27 28 29 30 31


И вторая задача --- то же самое, но в каждом месяце недели должны напечататься колонками, а не строчками.


Продолжение следует.
5 сен 18, 15:21    [21665837]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4 5 6   вперед  Ctrl      все
Все форумы / Работа Ответить