Обновить

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

Форматирование - вообще никакое. Неужели трудно посмотреть, что публикуете?

Нечитабельно.

Поправил

Не знаю, что там с форматированием, но смысловая нагрузка и полезность хорошая. Даже ссылок на всякие курсы нет!

апд. Ах, чертова дюжина, все таки есть, не дочитал до конца прям.

Я когда открывал - был уверен, что будет.

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

А так, ещё раз, автору респект

Любое сравнение с NULL даёт NULL (не TRUE и не FALSE).

Ну-ну... а, между прочим, СУБД у вас в тегах не указана. Так что берём, значит, MySQL (можно и MariaDB), спрашиваем

SELECT NULL <=> NULL AS compare_two_nulls;

и получаем единичку, а вовсе даже не обещанный NULL.

Эту задачу дают постоянно — выучите наизусть. 

WHERE NOT EXISTS как минимум не хуже, чем LEFT JOIN WHERE IS NULL. А порой - намного эффективнее.

Задача с собеседования: «Кто потратил больше 10 000₽?»

Незачёт. Вас спросили кто, но не спрашивали сколько.

На собеседовании лучше показать оба способа и объяснить разницу — это покажет глубину понимания. 

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

То же относится и к Задача 4: «Топ-3 покупателя»

Найдите email, которые встречаются больше одного раза.

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

И это не баг, как вы пишете, а ошибка проектирования. Если email должен быть уникален, то должен существовать соответствующий constraint. А при его существовании обнаружение дублирования уже не просто не баг, а разрушение таблицы данных.

Найдите сумму второго по величине заказа.

Решение - ошибочное. Первые два заказа могут иметь одинаковую сумму.

Задача 3: «Пользователи без заказов за последний месяц»

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

Заголовок и условие - это две разные задачи. Зарегистрировался 3 месяца назад, сделал последнюю покупку 2 месяца назад - соответствует условию в названии и не соответствует условию в тексте.

Правило простое: всё, что не внутри агрегатной функции (COUNT, SUM...) — должно быть в GROUP BY.

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

Но SQL выполняет в другом порядке:

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

Middle — то, что отличает от джуна

Всё, что ниже - это ещё джун. Middle - это как минимум табличные и оконные функции, хранимые объекты, латеральные запросы и рекурсивные CTE. А по-хорошему - уровни изоляции, блокировки, репликация, хотя бы на уровне понимания основ.

Middle - это как минимум табличные и оконные функции, хранимые объекты, латеральные запросы и рекурсивные CTE. А по-хорошему - уровни изоляции, блокировки, репликация, хотя бы на уровне понимания основ.

А поделитесь, пожалуйста, примерами ситуаций, когда тестировщику миддлу могут потребоваться эти знания?

Вот знаете... если человек освоил выборку и фильтрацию, но ни уха ни рыла в группировке - то практически ничего он и не освоил. Это вообще самые основные основы. Или вы всерьёз полагаете, что на проверке валидности данных в таблице БД работа тестировщика заканчивается? А такой фигнёй как "выбрать топ-3 из имеющихся данных" тестировщик имхо вообще не должен заниматься. Я даже представить не могу, как подобная задача коррелирует хоть с каким-то тестированием, только если это не тестирование кандидата на знание основ SQL.

Между тем, что перечислено в статье, и тем, что перечислил я, есть вполне зримая квалификационная граница. А между двумя списками, что в статье, имхо границы нет вообще. Разница между ними лишь в том, дочитан ли букварь по SQL до конца или заброшен на середине.

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

Для тех кто осилил основы SQL и хочет подтянуть практику: sqltest.online

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации