Л А Б О Р А Т О Р И Я

актуальных

РЕШЕНИЙ


Статья в разработке

SQL - типичные вопросы на собеседовании

разбираем вопросы, которые часто задают программистам-соискателям, особенно тем, кто занимается backend или fullstack разработкой

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

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

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

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

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

Приступим!

  Нормализация базы данных  

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

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

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

Всего выделяют условия 8 нормальных форм (в некоторых источниках используется другое количество), но в основном в реляционных базах данных на практике используются требования первых 3-4 нормальных форм.

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

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

  CRUD  

Аббревиатура CRUD обозначает набор элементарных действий над данными:

  • CREATE (создание) - создание данных - занесение в место хранения (таблицу/таблицы);
  • READ (чтение) - получение копии данных из места хранения;
  • UPDATE (обновление) - изменение содержимого (состава) данных в месте хранения, без изменения типа;
  • DELETE (удаление) - удаление данных из места хранения;

Несмотря на то, что данная аббревиатура изначально не имела отношения именно к базам данных, но использование аналогичного функционала в работе с базами данных закрепило ее применение и при работе с данными в различных СУБД (система управления базами данных).

  SELECT  

Оператор Select (выборка) - получение данных из места хранения.

синтаксис

SELECT column1, column2, columnN FROM table_name;

где column1, column2, columnN - названия полей (колонок) таблицы из которых будут получены данные, table_name - имя таблицы, из которой будут получены данные.

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

SELECT * FROM table_name;

  INSERT  

INSERT INTO используется для добавления новых строк данных в таблицу хранения в базе данных.

синтаксис

INSERT INTO table_name (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN);

где column1, column2, columnN - названия полей (колонок) таблицы в которые будут добавлены данные, table_name - имя таблицы, в которую будут добавлены данные, value1, value2, value3,...valueN - значения добавляемых данных.

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

INSERT INTO table_name VALUES (value1,value2,value3,...valueN);

  UPDATE  

UPDATE используется для изменения существующих записей в таблице.

синтаксис

UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN;

где column1, column2, columnN - названия полей (колонок) таблицы в которых будут обновлены данные, table_name - имя таблицы, в которой будут обновлены данные, value1, value2,...valueN - новые значения данных.

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

UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];

где [condition] - условие для поиска соответствующего поля таблицы.

  DELETE  

DELETE используется для удаления существующих записей из таблицы.

синтаксис

DELETE FROM table_name;

где table_name - имя таблицы, из которой будут удалены данные.

Если необходимо удалить только определенные строки, то можно использовать следующий синтаксис:

DELETE FROM table_name WHERE [condition];

где [condition] - условие для поиска соответствующего поля таблицы.

  LEFT JOIN  

LEFT JOIN возвращает все значения из левой таблицы, плюс совпавших значений из таблицы справа или NULL, в случае отсутствия совпадения.

синтаксис

SELECT table1.column1, table2.column2... FROM table1

LEFT JOIN table2 ON table1.common_field = table2.common_field;

где table1 - имя таблицы слева, из которой будут получены все данные,

table2 - имя таблицы справа, из которой будут получены значения при совпадении требований или NULL, при отсутствии,

column1, column2... - названия соответствующих колонок таблиц,

table1.common_field = table2.common_field - требование для отбора, соответствующие значения полей в левой и правой таблице.

  ALIASES  

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

синтаксис

column_name [ AS ] alias_column;

table_name [ AS ] alias_table;

где column_name - имя колонки в базе данных, alias_column - временное имя колонки в пределах запроса,

table_name - имя таблицы в базе данных, alias_table - временное имя таблицы в рамках запроса.

[ AS ] может не применяться (опускаться) в свежих версиях СУБД.

пример

SELECT p.product_id as "product code", p.product_name, s.supplier_name

FROM products p

INNER JOIN suppliers s

ON p.supplier_id = s.supplier_id

ORDER BY p.product_name;

стоит обратить внимание, что если алиас состоит из раздельных слов, то название надо брать в кавычки.