Pull to refresh

Comments 24

Ну насчёт табличной функции не совсем точно указано. Если табличная функция возвращает одно поле и одну запись, то её можно использовать и в секции select.

Еще можно добавить, что TRUNCATE (по крайней мере в MySQL) сбрасывает значение AUTO_INCREMENT для первичного ключа таблицы

Необязательно первичного ключа, любого автоинкрементного поля это должно работать. В SQL server также все происходит.

CTE -- это просто синтаксическая конструкция, будет ли результат подзапроса временно сохраняться в памяти или подзапрос просто распарсится и встроится в общий запрос, зависит от реализации.

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

Я не об этом. Я говорю, что СТЕ-подзапрос вообще не обязан выполняться отдельно, соответственно, нет никаких отдельных результатов, которые надо было бы где-то хранить. По типу как вьюшка, ее текст просто встраивается в общий запрос, так и СТЕ может вести себя аналогичным образом. Взять, к примеру, Оракл. У него есть поведение по умолчанию: если СТЕ в дальнейшем используется всего один раз, парсер поведет себя, как с обычной вьюшкой, а если используется два и более раз, тогда выполнит отдельно и будет использовать полученные результаты. И да, есть хинты MATERIALIZE и INLINE, которыми это поведение по умолчанию можно поменять.

Оператор GROUP BY используется вместе с оператором SELECT и требует, чтобы в операторе SELECT использовалась хотя бы одна агрегатная функция

Нет такого требования, по крайней мере в большинстве основных СУБД.

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

Что такое self-join и когда используется

Зачем это отдельным пунктом выносить, если там нет никакой доп. семантики? Это обычный джоин, просто таблица джоинится сама с собой.

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

Ну известно же, что это неправильная картинка. Правильная вот:

https://imgur.com/Hs9auHg.jpg

А если серьёзно, то эти круги надо рисовать не на множествах A и B, а на декартовом произведении AxB, от чего наглядность несколько улетучивается.

Честно говоря все фишки нужно представлять. Точное знание на память особо не нужно, так как можно все посмотреть в справочнике по SQL под конкретную СУБД.

Постоянно собеседую кандидатов в команду на системных аналитиков, QA и ETL разработчиков. Так вот, первые 2 вопроса задаю всем и только 70% отвечают верно, некоторые вообще её знаю что это, даже после поправки на primary и foreign key. И отмечу, это позиции мидлов и синьоров ?

Ну я сеньеров на такие вопросы не отвечающих еще не встречал.

Так и тут в тексте описание неверное. Вот посмотрим например википедию:

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

Вы тут видите первичный ключ? Я нет. И это правильно. Тут потенциальный ключ во второй таблице. Смотрим что у оракла, к примеру:

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name, ...)
REFERENCES tbl_name (col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

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

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

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

Иными словами, практически все что тут написано в абзаце - либо ошибочно, либо неполно.

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

Вы ошибаетесь. Это верно не для всех БД. Например в Clickhouse первичный ключ не гарантирует отсутствие дубликатов в любой момент времени.

Приведённый вопросник не указывает однозначно, про какую СУБД идёт речь - отсюда спорность, а местами и ошибочность некоторых утверждений.

Третий вопрос - как раз яркий пример абсолютной СУБД-зависимости. Если для SQL Server ответ подходит, то для MySQL это сплошной пердимонокль, ибо в этой СУБД термины DATABASE и SCHEMA являются синонимами.

В шестом вопросе - очень странно, почему даже не упомянут весьма базовый CROSS JOIN.

В девятом... не скажу за все СУБД, но во многих DELETE и TRUNCATE отличаются механизмом выполнения. DELETE методично удаляет всё указанное по одной записи, что, понятное дело, получается медленным и печальным. А TRUNCATE, не заморачиваясь, удаляет саму таблицу, после чего создаёт её заново, но без записей. Конечно, предварительно проверяется, что это не поломает внешние ссылки, иначе в выполнении будет отказано. А все перечисленные в ответе разницы - всего лишь следствие этой разности механизмов выполнения.

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

По вопросу 14 - например, в PostgreSQL многие табличные функции, преобразующие CSV/JSON/массивы/прочее в набор записей, прекрасно себе используются в списке вывода, словно они скалярные, а СУБД обеспечивает необходимое "размножение" остальных полей выходного набора.

Ну и вообще от статьи остаётся ощущение тупо передранного чужого конспекта.

Внешний ключ – это столбец или набор столбцов, которые ссылаются на первичный ключ другой таблицы.

Внешний ключ также может ссылаться на столбцы с ограничением уникальности.

Оператор GROUP BY используется вместе с оператором SELECT и требует, чтобы в операторе SELECT использовалась хотя бы одна агрегатная функция

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

SELECT field1
FROM table1
GROUP BY field1

Еще одно различие между DELETE и TRUNCATE заключается в том, что DELETE можно откатить с помощью журнала транзакций, а TRUNCATE – нет

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

Внешний ключ также может ссылаться на столбцы с ограничением уникальности.

В некоторых СУБД (скажем, MySQL) даже уникальности не требуется. Достаточно просто наличия индекса.

https://dbfiddle.uk/OD5T_He3

И ни слова о связываемых переменных (prepared statements).

С терминологией какая то беда у вас, вы элементарные вопросы задаёте так, что опытный разработчик может просто не понять. Например: "такое обобщенное табличное выражение (CTE)" это же просто подзапрос или self-join какой-то придумали. Короче это вопрос не на знания и опыт, а на недавнее прочтение одной книжки с автором вопросов.

Sign up to leave a comment.

Articles