Перевод статьи подготовлен для студентов курса «MS SQL Server разработчик»




Реляционные базы данных являются одними из наиболее часто используемых баз данных по сей день, и поэтому навыки работы с SQL для большинства должностей являются обязательными. В этой статье с вопросами по SQL с собеседований я познакомлю вас с наиболее часто задаваемыми вопросами по SQL (Structured Query Language — язык структурированных запросов). Эта статья является идеальным руководством для изучения всех концепций, связанных с SQL, Oracle, MS SQL Server и базой данных MySQL.


Наша статья с вопросами по SQL — универсальный ресурс, с помощью которого вы можете ускорить подготовку к собеседованию. Она состоит из набора из 65 самых распространенных вопросов, которые интервьюер может задать во время собеседования. Оно обычно начинается с базовых вопросов по SQL, а затем переходит к более сложным на основе обсуждения и ваших ответов. Эти вопросы по SQL с собеседований помогут вам извлечь максимальную выгоду на различных уровнях понимания.
Давайте начнем!


Вопросы по SQL с собеседований


Вопрос 1. В чем разница между операторами DELETE и TRUNCATE?


DELETE TRUNCATE
Используется для удаления строки в таблице Используется для удаления всех строк из таблицы
Вы можете восстановить данные после удаления Вы не можете восстановить данные (прим. перевод.: операции логируются по разному, но в SQL Server есть возможность сделать откат) транзакции)
DML-команда DDL-команда
Медленнее, чем оператор TRUNCATE Быстрее

№ Вопрос 2. Из каких подмножеств состоит SQL?


  • DDL (Data Definition Language, язык описания данных) — позволяет выполнять различные операции с базой данных, такие как CREATE (создание), ALTER (изменение) и DROP (удаление объектов).
  • DML (Data Manipulation Language, язык управления данными) — позволяет получать доступ к данным и манипулировать ими, например, вставлять, обновлять, удалять и извлекать данные из базы данных.
  • DCL (Data Control Language, язык контролирования данных) — позволяет контролировать доступ к базе данных. Пример — GRANT (предоставить права), REVOKE (отозвать права).

Вопрос 3. Что подразумевается под СУБД? Какие существуют типы СУБД?


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


Существует два типа СУБД:


  • Реляционная система управления базами данных: данные хранятся в отношениях (таблицах). Пример — MySQL.
  • Нереляционная система управления базами данных: не существует понятия отношений, кортежей и атрибутов. Пример — Mongo.

Вопрос 4. Что подразумевается под таблицей и полем в SQL?


Таблица — организованный набор данных в виде строк и столбцов. Поле — это столбцы в таблице. Например:
Таблица: Student_Information
Поле: Stu_Id, Stu_Name, Stu_Marks


Вопрос 5. Что такое соединения в SQL?


Для соединения строк из двух или более таблиц на основе связанного между ними столбца используется оператор JOIN. Он используется для объединения двух таблиц или получения данных оттуда. В SQL есть 4 типа соединения, а именно:


  • Inner Join (Внутреннее соединение)
  • Right Join (Правое соединение)
  • Left Join (Левое соединение)
  • Full Join (Полное соединение)

Вопрос 6. В чем разница между типом данных CHAR и VARCHAR в SQL?


И Char, и Varchar служат символьными типами данных, но varchar используется для строк символов переменной длины, тогда как Char используется для строк фиксированной длины. Например, char(10) может хранить только 10 символов и не сможет хранить строку любой другой длины, тогда как varchar(10) может хранить строку любой длины до 10, т.е. например 6, 8 или 2.


Вопрос 7. Что такое первичный ключ (Primary key)?



  • Первичный ключ — столбец или набор столбцов, которые однозначно идентифицируют каждую строку в таблице.
  • Однозначно идентифицирует одну строку в таблице
  • Нулевые (Null) значения не допускаются

_Пример: в таблице Student StuID является первичным ключом.


Вопрос 8. Что такое ограничения (Constraints)?


Ограничения (constraints) используются для указания ограничения на тип данных таблицы. Они могут быть указаны при создании или изменении таблицы. Пример ограничений:


  • NOT NULL
  • CHECK
  • DEFAULT
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY

Вопрос 9. В чем разница между SQL и MySQL?


SQL — стандартный язык структурированных запросов (Structured Query Language) на основе английского языка, тогда как MySQL — система управления базами данных. SQL — язык реляционной базы данных, который используется для доступа и управления данными, MySQL — реляционная СУБД (система управления базами данных), также как и SQL Server, Informix и т. д.


Вопрос 10. Что такое уникальный ключ (Unique key)?


  • Однозначно идентифицирует одну строку в таблице.
  • Допустимо множество уникальных ключей в одной таблице.
  • Допустимы NULL-значения (прим. перевод.: зависит от СУБД, в SQL Server значение NULL может быть добавлено только один раз в поле с UNIQUE KEY).

Вопрос 11. Что такое внешний ключ (Foreign key)?


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

Вопрос 12. Что подразумевается под целостностью данных?


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


Вопрос 13. В чем разница между кластеризованным и некластеризованным индексами в SQL?


  1. Различия между кластеризованным и некластеризованным индексами в SQL:
    Кластерный индекс используется для простого и быстрого извлечения данных из базы данных, тогда как чтение из некластеризованного индекса происходит относительно медленнее.
  2. Кластеризованный индекс изменяет способ хранения записей в базе данных — он сортирует строки по столбцу, который установлен как кластеризованный индекс, тогда как в некластеризованном индексе он не меняет способ хранения, но создает отдельный объект внутри таблицы, который указывает на исходные строки таблицы при поиске.
  3. Одна таблица может иметь только один кластеризованный индекс, тогда как некластеризованных у нее может быть много.

Вопрос 14. Напишите SQL-запрос для отображения текущей даты.


В SQL есть встроенная функция GetDate (), которая помогает возвращать текущий timestamp/дату.


Вопрос 15. Перечислите типы соединений


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



Inner join (Внутреннее соединение): в MySQL является наиболее распространенным типом. Оно используется для возврата всех строк из нескольких таблиц, для которых выполняется условие соединения.


Left Join (Левое соединение): в MySQL используется для возврата всех строк из левой (первой) таблицы и только совпадающих строк из правой (второй) таблицы, для которых выполняется условие соединения.


Right Join (Правое соединение): в MySQL используется для возврата всех строк из правой (второй) таблицы и только совпадающих строк из левой (первой) таблицы, для которых выполняется условие соединения.


Full Join (Полное соединение): возвращает все записи, для которых есть совпадение в любой из таблиц. Следовательно, он возвращает все строки из левой таблицы и все строки из правой таблицы.


Вопрос 16. Что вы подразумеваете под денормализацией?


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


Вопрос 17. Что такое сущности и отношения?


Сущности: человек, место или объект в реальном мире, данные о которых могут храниться в базе данных. В таблицах хранятся данные, которые представляют один тип сущности. Например — база данных банка имеет таблицу клиентов для хранения информации о клиентах. Таблица клиентов хранит эту информацию в виде набора атрибутов (столбцы в таблице) для каждого клиента.


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


Вопрос 18. Что такое индекс?


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


Вопрос 19. Опишите различные типы индексов.


Есть три типа индексов, а именно:


  1. Уникальный индекс (Unique Index): этот индекс не позволяет полю иметь повторяющиеся значения, если столбец индексируется уникально. Если первичный ключ определен, уникальный индекс может быть применен автоматически.
  2. Кластеризованный индекс (Clustered Index): этот индекс меняет физический порядок таблицы и выполняет поиск на основе значений ключа. Каждая таблица может иметь только один кластеризованный индекс.
  3. Некластеризованный индекс (Non-Clustered Index): не изменяет физический порядок таблицы и поддерживает логический порядок данных. Каждая таблица может иметь много некластеризованных индексов.

Вопрос 20. Что такое нормализация и каковы ее преимущества?


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


  • Лучшая организация базы данных
  • Больше таблиц с небольшими строками
  • Эффективный доступ к данным
  • Большая гибкость для запросов
  • Быстрый поиск информации
  • Проще реализовать безопасность данных
  • Позволяет легко модифицировать
  • Сокращение избыточных и дублирующихся данных
  • Более компактная база данных
  • Обеспечивает согласованность данных после внесения изменений

Вопрос 21. В чем разница между командами DROP и TRUNCATE?


Команда DROP удаляет саму таблицу, и нельзя сделать Rollback команды, тогда как команда TRUNCATE удаляет все строки из таблицы (прим. перевод.: в SQL Server Rollback нормально отработает и откатит DROP).


Вопрос 22. Объясните различные типы нормализации.


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


  • Первая нормальная форма (1NF) — нет повторяющихся групп в строках
  • Вторая нормальная форма (2NF) — каждое неключевое (поддерживающее) значение столбца зависит от всего первичного ключа
  • Третья нормальная форма (3NF) — каждое неключевое значение зависит только от первичного ключа и не имеет зависимости от другого неключевого значения столбца

Вопрос 23. Что такое свойство ACID в базе данных?


ACID означает атомарность (Atomicity), согласованность (Consistency), изолированность (Isolation), долговечность (Durability). Он используется для обеспечения надежной обработки транзакций данных в системе базы данных.


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


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


Изолированность. Основной целью изолированности является контроль механизма параллельного изменения данных.


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


Вопрос 24. Что вы подразумеваете под «триггером» в SQL?


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


Вопрос 25. Какие операторы доступны в SQL?


В SQL доступно три типа оператора, а именно:


  1. Арифметические Операторы
  2. Логические Операторы
  3. Операторы сравнения

Вопрос 26. Совпадают ли значения NULL со значениями нуля или пробела?


Значение NULL вовсе не равно нулю или пробелу. Значение NULL представляет значение, которое недоступно, неизвестно, присвоено или неприменимо, тогда как ноль — это число, а пробел — символ.


Вопрос 27. В чем разница между перекрестным (cross join) и естественным (natural join) соединением?


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


Вопрос 28. Что такое подзапрос в SQL?


Подзапрос — это запрос внутри другого запроса, в котором определен запрос для извлечения данных или информации из базы данных. В подзапросе внешний запрос называется основным запросом, тогда как внутренний запрос называется подзапросом. Подзапросы всегда выполняются первыми, а результат подзапроса передается в основной запрос. Он может быть вложен в SELECT, UPDATE или любой другой запрос. Подзапрос также может использовать любые операторы сравнения, такие как >, < или =.


Вопрос 29. Какие бывают типы подзапросов?


Существует два типа подзапросов, а именно: коррелированные и некоррелированные.


  • Коррелированный подзапрос: это запрос, который выбирает данные из таблицы со ссылкой на внешний запрос. Он не считается независимым запросом, поскольку ссылается на другую таблицу или столбец в таблице.
  • Некоррелированный подзапрос: этот запрос является независимым запросом, в котором выходные данные подзапроса подставляются в основной запрос.

Вопрос 30. Перечислите способы получить количество записей в таблице?


Для подсчета количества записей в таблице вы можете использовать следующие команды:
SELECT * FROM table1
SELECT COUNT(*) FROM table1
SELECT rows FROM sysindexes WHERE id = OBJECT_ID(table1) AND indid < 2




Ещё 35 вопросов с ответами опубликуем в следующей части… Следите за новостями!

Комментарии (80)


  1. usharik
    23.07.2019 18:27

    Вопросы простые, но нужные. Жду следующей части!


  1. gleb_l
    23.07.2019 18:33
    +1

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


    1. Maksclub
      24.07.2019 09:08

      Все верно, в данном посте инструмент SQL, знающий его человек сможет построить такую механику, не знающий — нет. Как определить знающего — задать некоторые вопросы выше.

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

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


      1. NoRegrets
        24.07.2019 10:50

        Это не вопросы на собеседовании. Это вопросы, которые, по мнению джуниора прочитавшего теорию по SQL, могут задать на собеседовании.
        Откуда вообще эти вопросы набрали?


      1. gleb_l
        24.07.2019 12:39

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


  1. vvm13
    23.07.2019 18:47

    Объединение — это UNION / UNION ALL,
    а JOIN — это соединение.


  1. Rambalac
    23.07.2019 18:55

    В SQL не существует VARCHAR2.


    1. alexxprg
      23.07.2019 19:55

      Оракл накладывает определённый отпечаток на мышление )


  1. vvm13
    23.07.2019 18:55

    В SQL есть встроенная функция GetDate ()
    Вообще говоря, если в ораклином или микрософьем диалекте SQL это есть, то вовсе не факт, что во всех остальных диалектах это тоже есть. Подобное можно написать и про другие вопросы.


    1. Rusty_Fox
      24.07.2019 21:23
      +2

      Oracle — sysdate, в PostgreSQL — now(), в MySQL — now(), curdate(), MsSQL — getdate.
      А вот ANSI SQL знает вот такое CURRENT_TIMESTAMP. По идее, должна работать везде (проверил на Oracle и PostgreSQL ).


      1. vdem
        25.07.2019 12:50

        В MySQL/MariaDB тоже CURRENT_TIMESTAMP есть.


  1. osipov_dv
    23.07.2019 19:00

    Ну вот, даже про транзакцию не спросили… Не говоря уже про WAL и как работает движок базы данных.
    Какой смысл этих вопросов, их можно посмотреть в справочнике, а понимание этих механизмов объяснит работу почти любой БД.


    1. eefadeev
      24.07.2019 14:22

      Строго говоря WAL никак не связан с SQL. Если покопаться можно найти нежурналируемые реализации РСУБД.


  1. vvm13
    23.07.2019 19:01

    Вопрос 17. Что такое сущности и отношения?
    А вспомните-ка для начала, почему реляционные базы называются «реляционными». Что есть relation.

    Про НФ тоже странно… Не, неохота дальше комментировать…


  1. Daemonis
    23.07.2019 19:07

    «Inner join в MySQL»
    А в остальных СУБД?


  1. vdem
    23.07.2019 19:14

    Невычитано от слова совсем, даже лень список багов составлять.

    P.S. 1) «SQL — ядро реляционной базы данных» — что это было? 2) «Допустимы нулевые значения» (это про unique key) — нулевые это которые? 0 или таки NULL? 3) «Значение NULL представляет значение, которое недоступно, неизвестно, присвоено или неприменимо» — может таки неприсвоено? И не указано, что в т.ч. NULL не равен самому себе.


    1. KristinaMyLife
      25.07.2019 11:37

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


  1. CrushBy
    23.07.2019 19:51

    А можно уточнить, а по какому SQL стандарту это вопросы? SQL-92 или самому свежему SQL-2016 (который кстати, полностью далеко не все СУБД поддерживают)?
    Например, в SQL-92 не нахожу функции GetDate.


  1. ncix
    23.07.2019 19:55
    +1

    16 Денормализация — это всего лишь сознательное нарушение одной из нормальных форм.


    Вообще некоторые ответы довольно спорные.


    1. McKinseyBA
      23.07.2019 20:33

      я бы сказал, что больше половины спорные.

      Чего стоит одно объяснение ACID — в русской википедии намного корректнее.


    1. minamoto
      24.07.2019 18:04

      Вообще я не увидел ни одного корректного вопроса/ответа. Косяк либо в постановке вопроса, либо в формулировке ответа, либо в нужности самого вопроса (типа NATURAL JOIN, который я, за много лет работы с базой, ни разу не видел и знать не знаю).


  1. McKinseyBA
    23.07.2019 20:21

    А где же ключевой вопрос «икспертов» — чем LEFT JOIN отличается от RIGHT JOIN?


    1. ncix
      23.07.2019 21:16

      И что будет, если написать просто JOIN


      1. alexhott
        23.07.2019 21:27

        а если написать left hash join или left loop join


        1. ncix
          23.07.2019 21:31
          -1

          попахивает майкрософтщиной


  1. taliban
    23.07.2019 21:04

    Вы можете восстановить данные после удаления

    Как это восстановить данные после удаления?


    1. ncix
      23.07.2019 21:32

      REVERT TRANSACTION?


      1. taliban
        23.07.2019 22:31

        1. точно ли имеется ввиду незакомиченые операции?
        1.1 точно ли с truncate так же нельзя (в статье указывается truncate как опозит)?
        2. вы меня спрашиваете или это ответ на мой вопрос?
        3. Я не думаю что автор это имел ввиду )


        1. vdem
          23.07.2019 22:34

          С TRUNCATE точно нельзя. Ну т.е. если эта команда и была вызвана в транзакции, то после отката таблица все равно останется пустой.

          UPD:

          После операции TRUNCATE для некоторых СУБД (например, Oracle) следует неявная операция COMMIT. Поэтому удаленные в таблице записи нельзя восстановить операцией ROLLBACK. Но существуют и СУБД, в которых операция TRUNCATE может участвовать в транзакциях, например, Microsoft SQL Server.

          Короче, не следует полагаться на то, что после отката на некой СУБД данные, удаленные TRUNCATE, вернутся.


          1. taliban
            23.07.2019 22:43

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


            1. vdem
              23.07.2019 23:35
              +1

              Я тоже очень удивился, прочитав слово «восстановление», потом уже дошло, что имелся в виду откат транзакции :) В общем или сам источник кривой, или криво переведено да еще и не вычитано, а скорее всего и то и другое.


  1. Tyusha
    23.07.2019 21:10
    +2

    Наверное следует поправить следы машинного перевода в вопросе 4, но само по себе это здорово:

    SВопросL


    1. harlong
      24.07.2019 04:15
      +1

      Энциклонги приветствуют Вас. Подозреваю, что в оригинале в заголовках вопросов было Q1, Q2, ..., Qx


  1. alexhott
    23.07.2019 21:26

    триггеры в MS SQL выполняются либо вместо либо после выполнения инструкции.
    и чем отличается count(*) от count(column_name)?


    1. InChaos
      24.07.2019 12:07

      А Вы сравните сами, а если вдруг одно поле окажется binary с файлами по несколько мегабайт то сюрприз.
      Я вообще всегда использую Count(1)


      1. alexhott
        24.07.2019 16:47

        на самом деле есть еще сюрприз
        если делать count по конкретному полю то результатом может быть не полное количество строк, а только те где данное поле не null
        как тут отработает Count(1) не знаю


        1. eefadeev
          24.07.2019 17:38

          Сюрприз?! Серьёзно?
          А если подумать — как же может отработать COUNT(1) если нам доподлинно известно что 1 IS NOT NULL? Интрига…


        1. epee
          24.07.2019 18:57

          как тут отработает Count(1) не знаю

          в MS SQL Server отпработает без всяких сюрпризов — посчитает все строки. тоже использую COUNT именно так


      1. minamoto
        24.07.2019 17:54

        Если вы работаете с MS SQL, то можете выполнить count(1) и count(*) и посмотреть планы. Сюрприз — они одинаковые, т.е. ваша попытка оптимизации лишняя. ЕМНИП, то ли с 2000-й, то ли с 2005-й версии SQL Server.


        1. epee
          24.07.2019 19:04

          именно, поэтому если видишь как кто-то использует COUNT(1) можно быть почти уверенным что он пользуется SQL Server с довольно древних версий :)))


    1. unfilled
      24.07.2019 12:28

      count(*) считает все строки, count(column_name) — строки, в которых column_name is not null


    1. AlexToArt
      25.07.2019 10:01

      count(column_name) посчитает количество NOT NULL значений в column_name


  1. x_shader
    23.07.2019 22:32
    +3

    Вопросы никак не для собеседования на SQL разработчика.
    Для фронтенда, чтоб проверить кругозор. А скорее, умение повторить справочник перед интервью.


  1. gudvinr
    24.07.2019 00:14

    То есть 65 — только самые распространенные и это не предел? А чтоб к остальным подготовиться — надо знать назубок ANSI SQL и держать шпаргалку с документацией по постгресу/ораклу/мускулу?


  1. MinamotoSoft
    24.07.2019 01:44
    +2

    даже при шансе перманетного бана — ХУЙНЯ полная!


  1. saboteur_kiev
    24.07.2019 04:19

    Нереляционная система управления базами данных: не существует понятия отношений, кортежей и атрибутов. Пример — Mongo

    Причем тут кортежи и атрибуты?

    Реляционные базы — это базы, с отношениями между таблицами. Все остальное — может быть реализовано, а может не быть.

    Вопросы дублируются (1 и 21)

    Язык слишком академический, и неестественный — автор явно сам не слишком хорошо в SQL.

    Часто путает сам SQL и его конкретную реализацию в Оракле или MySQL, те же триггеры.

    Если планируется еще одна статья — настойчиво рекомендую пригласить нормального ДБА-шника и потратить хотя бы 1-2 вечера на вычитывание. Пусть это будет не 65 а топ-20 вопросов по SQL, зато реально полезных и описанных по-человечески.


    1. Magikan
      24.07.2019 04:46

      пологаю DBA, прочитавшие эту статью, уже пишут свой топ в ответку с со всеми вытекающими )


    1. Pydeg
      24.07.2019 05:33

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


  1. Anton_Zh
    24.07.2019 07:25

    По-моему определение 1NF совсем неправиельно, ну либо переводчик так криво перевел, что смысл потерялся.


  1. unfilled
    24.07.2019 07:33

    q1 TRUNCATE «Вы не можете восстановить данные»
    Если речь идёт об откате транзакции — то это зависит от СУБД. В MS SQL Server можете.

    q5 JOIN во всех русскоязычных книгах/материалах (встречавшихся мне) переводится как СОЕДИНЕНИЕ, а не ОБЪЕДИНЕНИЕ.

    q10 «Допустимы нулевые значения.» в Unique key — «NULL»евые

    q13 «чтение из некластеризованного индекса происходит относительно медленнее» да неужели? А если он покрывающий?

    q15 на хабре совсем недавно был материал, почему «диаграммы Венна» плохо подходят для джойнов. Можно было бы и ссылку дать.

    q18 «Индексы относятся к методу настройки производительности, позволяющему быстрее извлекать записи из таблицы. Индекс создается для каждого значения и, следовательно, позволяет быстрее получать данные.» если кому-то стало понятно «Что такое индекс» после такого ответа — я ему очень завидую.

    q21 «DROP удаляет саму таблицу, и ее нельзя откатить из базы данных» что тут написано? Что нельзя откатить? Таблицу? Дроп? Опять-таки зависит от СУБД. В MS SQL Server можно откатить транзакцию с DROP TABLE.

    q23 «Изолированность. Основной целью изолированности является контроль параллелизма.» Классный ответ. Параллелизма чего? Чем традиционное определение не устраивает?

    «Долговечность подразумевает, что если транзакция запущена, она будет происходить независимо от того, что может встать у нее на пути, например, потеря питания, сбой или ошибки любого рода.» о, а можно мне хоть в одной СУБД такую «долговечность»? Я такую очень хочу.

    Сначала думал, что мои вопросы к первоисточнику, но оказалось, примерно 50/50. Те же свойства ACID в источнике описаны корректно. Самые пуканоразрывающие вопросы (для меня) на совести переводчиков. Какой надмозг перевёл «concurrency control» как «параллелизм», «has been committed» как «была запущена», «NULL values» как «нулевые значения» и «You cannot rollback» как «вы не можете восстановить»?


    1. gudvinr
      24.07.2019 21:57

      Опять-таки зависит от СУБД. В MS SQL Server можно откатить транзакцию с DROP TABLE.

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


      1. saboteur_kiev
        25.07.2019 13:32

        Бэкап — это тоже вариант отката транзакций.
        Или GRP в оракле — еще одна помесь бэкапа и транзакций


        1. eefadeev
          25.07.2019 13:43

          Бэкап — это тоже вариант отката транзакций.

          Нет. Восстановление из бэкапа — это возврат к состоянию БД в некоторый момент времени. В некоторых частных случаях (когда в БД нет и не будет никаких других транзакций кроме вашей) — его можно считать вариантом «отката». Но это именно частный случай.


    1. KristinaMyLife
      25.07.2019 11:35

      спасибо большое, постарались подправить косяки, так же добавила комменты кое-где по SQL Server.


  1. winmasta
    24.07.2019 11:05

    В вопросе №1 DELETE — DML команда, но в вопросе №2 она уже DDL, как так?


  1. tas
    24.07.2019 11:27

    Вопрос немного посложнее:

    tablename1 имеет 2 поля fieldname1 и fieldname2. Также tablename1 имеет индекс по полю fieldname2.

    При выполнении запроса вида:

    SELECT fieldname1 FROM tablename1 WHERE fieldname2=1

    … имеем Index Scan в плане запроса.

    Назовите как MIN 3 причины, почему вместо Index Seek выполняется Index Scan?


    1. uaggster
      24.07.2019 21:32

      Эээ…
      1. fieldname2 имеет тип varchar, например, и, следовательно, каждое значение в столбце должно быть преобразовано в тип int для сравнения.
      2. Индекс по полю имеет низкую селективность, например, 80% значений = 1, и оптимизатор верно оценивает статистику.
      3. Значение лежит за пределами статистики по полю, например, вследствие ее устаревания, и оптимизатор неверно оценивает кардинальность.
      И потом, индекс скан какого индекса? По полю fieldname2, или скан какого-то другого индекса, кластерного например, или покрывающенго индекса, например вида fieldname1 include (fieldname2)?
      Т.е. «почему оптимизатор игнорирует индекс по полю, а использует другой».
      Ответ будет: потому, что оптимизатор оценивает издержки на Index seek + key lookup выше, чем скан стороннего индекса, с «добычей» искомого значения из include поля, ну, или из кластерного индекса.

      Так пойдет?


      1. eefadeev
        25.07.2019 05:04

        Я бы добавил
        4. Потому что размер индекса меньше некоторого порога (например в две страницы, могут быть различия в реализациях), но индекс при этом покрывающий. Оптимизатор вполне разумно решил что проще будет его просканить :)


      1. tas
        25.07.2019 10:13

        Да, Вы приняты :)

        Вы назвали 3 основных причины: преобразование типов, низкая селективность и проблема со статистикой. Ниже добавили 4-ю…

        На счет «индекс скан какого индекса?» — то в примере четко написано, что «tablename1 имеет индекс по полю fieldname2». Все! Не нужно усложнять себе задачу додумывая возможное наличие других индексов или условий…


        1. uaggster
          25.07.2019 13:16

          Ненене!
          "… имеем Index Scan в плане запроса. "
          Не сказано, Scan какого индекса. Т.е. возможен вариант скана в плане, но другого индекса :-)
          Так что не «додумывать», а предусматривать варианты.
          :-)


        1. DrunkBear
          26.07.2019 10:46

          Хм, когда отключили автообновление индекса и не сделали ребилд после заливки большого куска данных — вроде тоже будет печальный скан?
          К тому же, может быть всё уже хорошо, но старый план выполнения вместо поиска всё равно предложит скан.


          1. eefadeev
            26.07.2019 13:12

            То есть индекс невалидный? Какой смысл, тогда, его сканировать? Его перестраивать надо — в нём же половины данных просто нет!


          1. tas
            26.07.2019 17:14

            Этот вариант входит в «проблема со статистикой», конкретных причин там может быть много…


    1. npocmu
      25.07.2019 08:57

      Кмк, надо отделять мух от котлет.
      Т.е. вопросы по SQL для прикладных программистов и вопросы по тюннигу производительности для DBA (в том числе особенности работы индексов).


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


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


  1. DrunkBear
    24.07.2019 11:39

    Забыли про cross join в списке join, хотя про него многие забывают и если видят — делают огромные глаза и спрашивают «а шо это??»
    Типов СУБД гораздо больше — придёт человек и расскажет про k-v хранилища, графо-ориентированную СУБД или объектное хранилище, неудобно же будет.
    В том же MSSQL с 2012 появились колоночные индексы, с 2014 — in-memory таблицы.


    1. uaggster
      24.07.2019 21:48

      А с 2017 — графы.


  1. npocmu
    24.07.2019 14:15

    Правильное название для пункта 15 в его текущей редакции:


    "Вопрос 15. Перечислите самые распространенные мифы о типах соединений SQL."


    1. Rusty_Fox
      24.07.2019 23:23

      Вы об этом?


      1. npocmu
        25.07.2019 08:43

        Спасибо за ссылку. Там все изложено верно. Здесь тоже.


        К сожалению, подавляющее большинство программистов об этом не знает и свято верит в мифы изложенные в ответе на Вопрос 15.


  1. Rusty_Fox
    24.07.2019 21:12

    27 вопрос с подвохом. Вот зачем кому-то спрашивать, в чем разница между cross и natural? Почему именно между ними? Суть в том, что если в двух таблицах нет одинаковых столбцов, natural начинает работать как cross. Очевидно, автор видел такой вопрос, знает, как работают обе конструкции, но не понимает, откуда вопрос возник.


    1. uaggster
      26.07.2019 16:29

      Natural join — это, разве, не типичная оракуловская фишка?


  1. Victor_D
    25.07.2019 08:30

    На практике, на 95% собеседованиях по SQL, в основном, задают практические задачи с различными изощренными применениями joinов.


  1. eugeneyp
    25.07.2019 08:30

    Прямо таки набор заблуждений видимый сквозь призму одной БД.
    1) Два вида ББ, как мнение мое и не правильное. А как-же иерархические, сетевые и т.д.?
    2) Как писали многие RDBMS умеют откатывать DDL по rollback. Т.е. утверждение не верно.
    3) Нету вопроса про DOMAIN
    4) Где в foreign key модификаторы on delete set null, on update cascade? Как раз set null разрушение связи.
    5) Нормализация БД это приведение к нормальной форме. Всё остальное это следствие нормализации.
    6) Первая нормальная форма описана не правильно, смотрите описание в Wiki. В двух словах каждое поле должно содержать одно значение. Т.е. в современных реалиях РСУБД не позволит создать БД которая не удовлетворяет 1НФ.
    7) Про индексы написан бред. Насколько упадет производительность БД если в таблице будет много индексов на булевое поле, или на поле константы? Про индексы на несколько полей автор наверное не знает? Что сужествуюn hash, bitmap и т.д. виды индексов?
    8) про null надо спрашивать is [not] distinct from и в чер разнца с равенством и неравенством

    В итоге эта статья является списком вопросов и вариантами ответов которые показывают вашу некомпетентность.


    1. funca
      25.07.2019 22:55

      Т.е. в современных реалиях РСУБД не позволит создать БД которая не удовлетворяет 1НФ.

      Нормализация относится к схеме, а не данным. Понятие атомарности в терминах НФ зависит от предметной области. Ни кто не помешает разработчику создать текстовое поле, чтобы хранить там имя и фамилию человека. Если с ФИО будут работать как с неделимым значением, тогда выбор корректный для 1НФ. Если предполагаются связи по отдельным словам — тогда нет.


      1. eugeneyp
        26.07.2019 10:41

        По моему это теологический спор.
        Посмотрел wiki. Все ссылки на книги изданные после того как мне преподавали нормальные формы. Но они сводятся к тому что один атрибут к одной строке не может содержать два и более значения. К сожалению сейчас не используют термин DOMAIN, с ним некоторые вещи реализуются и объясняются проще.
        Если считать что поле содержит два значение разделенных запятой или переводом строки то структуру и записи в БД которые не удовлетворяют первой нормальной формы создать можно.
        Если считать что в поле можно запихнуть два INTEGER в виде SET или ARRAY то можно только в некоторых РСУБД.
        А если брать БД когда в полях храниться JSON/BSON/XML и т.д. то про какие нормальные формы вообще можно говорить?
        Если


        1. eefadeev
          26.07.2019 15:14

          если брать БД когда в полях храниться JSON/BSON/XML и т.д. то про какие нормальные формы вообще можно говорить?

          Ни про какие. Это уже не реляционные данные (точнее таблицы с такими полями не находятся даже в 1НФ если вы хоть как-то на стороне БД используете знание о наличии у них внутренней структуры).


        1. funca
          26.07.2019 23:59

          Тут лучше начинать вот с этой Википедии en.m.wikipedia.org/wiki/Relational_model.

          The relational model's central idea is to describe a database as a collection of predicates over a finite set of predicate variables, describing constraints on the possible values and combinations of values.
          .
          В реляционной модели данные представляют собой множества предикатов — логических утверждений касательно фактов предметной области, которые можно свести к true или false. Отсюда следует требование атомарности: один факт — одно значение. Если его не выполнить, то в модели проявятся логические противоречия — аномалии. Собственно нормализация это метод последовательной трансформации реляционной модели с целью исключения из нее этих вот самых аномалий.
          Домены накладывают дополнительные ограничения на допустимые значения конкретного атрибута. Это могут быть хоть простые типы, например целые числа, хоть даты (из которых за пределами модели можно извлекать компоненты: день, месяц, год и т.п.), хоть массивы, JSON, XML или даже
          отдельные отношения. Пока в вашей модели такое значение отражает единичный факт и для связи с другими фактами не требует углубляться во внутреннюю структуру, оно соответствует 1НФ.


  1. Mikluho
    25.07.2019 20:19

    Плохой, вредный оригинал, не надо было его переводить, и уж тем более использовать!
    В крайнем случае — как список того, как не надо отвечать на вопросы!
    Такое ощущение, что автор где-то нагуглил списки вопросов на собеседованиях, а потом нагуглил первые попавшиеся ответы…


    1. funca
      25.07.2019 23:02
      +1

      Сейчас такой вид постов в англоязычном интернете достаточно распространен. «10 удивительных фактов», «12 топовых вопросов», «5 основных функций». Подавляющее большинство из них откровенный мусор. Наверняка какая-то часть собирается автоматически тупо по набору ключевых слов.


      1. Mikluho
        25.07.2019 23:17

        Видимо они у себя там так за посещаемость борются. Но здесь-то это зачем?