Databases Flashcards

1
Q
  1. Что такое транзакции и зачем они нужны.
A

Транзакции — это набор операций, которые выполняются как единое целое. Они играют ключевую роль в управлении базами данных и обеспечивают выполнение нескольких операций в рамках одной логической единицы работы, с гарантией того, что все операции будут либо полностью завершены, либо полностью отменены.
Вот основные характеристики транзакций, часто обозначаемые акронимом ACID:
1. Атомарность (Atomicity): Транзакция рассматривается как неделимая единица работы. Либо все её операции выполняются успешно, либо ни одна из них не выполняется. Если во время выполнения транзакции происходит ошибка, все изменения, сделанные в рамках этой транзакции, отменяются, и состояние базы данных возвращается в исходное состояние.
2. Согласованность (Consistency): Транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что после выполнения транзакции база данных должна оставаться в согласованном состоянии, удовлетворяя всем предопределённым правилам и ограничениям.
3. Изолированность (Isolation): Изменения, произведённые одной транзакцией, не видны другим транзакциям до тех пор, пока первая транзакция не завершится успешно. Это предотвращает ситуации, когда одна транзакция может вмешиваться в другую или видеть промежуточные состояния данных.
4. Долговечность (Durability): После успешного завершения транзакции изменения, внесённые ею в базу данных, становятся постоянными и не могут быть утеряны, даже в случае сбоя системы.
Зачем нужны транзакции:
* Поддержка целостности данных: Они помогают предотвратить потерю или порчу данных, гарантируя, что операции на базе данных будут выполнены полностью или не будут выполнены вообще.
* Избежание конфликтов: Они обеспечивают, что одновременные операции от разных пользователей или процессов не приведут к неконсистентности данных.
* Обеспечение корректности: Они помогают поддерживать бизнес-правила и обеспечивают корректность выполнения сложных операций, которые требуют нескольких шагов.
Транзакции важны в сценариях, где требуется высокая надежность и целостность данных, таких как финансовые системы, системы учёта и любые другие приложения, где ошибки могут иметь серьёзные последствия.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
  1. Что случится если во время транзакции сервер базы данных будет аварийно отключен.
A

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

  1. Возврат к последнему согласованному состоянию: Современные СУБД используют журналы транзакций для обеспечения восстановления после сбоя. Если сервер отключается, СУБД проверяет журнал транзакций при следующем запуске и восстанавливает состояние базы данных до последнего согласованного состояния. Это означает, что изменения, выполненные в рамках транзакций, которые не были завершены (коммитированы), будут отменены. Транзакции, которые были завершены до сбоя, будут сохранены.
  2. Атомарность и откат (Rollback): Если транзакция ещё не была завершена, её изменения будут отменены, и база данных вернётся к состоянию до начала этой транзакции. Это обеспечивает атомарность транзакций, которая гарантирует, что все операции в рамках транзакции будут либо полностью выполнены, либо не выполнены вовсе.
  3. Коммит и устойчивость: Если транзакция была завершена до сбоя (т.е. был выполнен коммит), то изменения этой транзакции будут сохранены и не будут потеряны. Устойчивость транзакции обеспечивает, что завершённые транзакции сохраняются даже в случае сбоя системы.

Как это работает на практике:

  1. Журнал транзакций: СУБД ведёт журнал всех транзакционных операций. В случае сбоя система использует этот журнал для восстановления состояния базы данных. Это может включать запись изменений, которые были сделаны транзакциями до сбоя, и откат изменений, если транзакция не была завершена.
  2. Механизм восстановления: При следующем запуске СУБД выполняет процесс восстановления, используя журнал транзакций. Если транзакция была завершена до сбоя, её изменения будут применены. Если транзакция не была завершена, система откатывает все изменения, выполненные в рамках этой транзакции.

Примеры поведения:
* Системы с поддержкой журналов (например, SQL Server, PostgreSQL, Oracle) обеспечивают восстановление до последнего согласованного состояния благодаря своим механизмам журналирования и восстановления.
* Транзакционные логи помогают минимизировать потерю данных и сохранить консистентность базы данных, даже если происходит аварийное отключение сервера.

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q
  1. Что такое уровни изоляции. Какие уровни изоляции существуют.
A

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

  1. READ COMMITTED: Это установка по умолчанию для большинства запросов SQL Server. Она определяет, что транзакция в текущем сеансе не может читать данные, которые были модифицированы другой транзакцией. Тем самым при этой установке предотвращается грязное чтение.
  2. REPEATABLE READ: С этой установкой транзакция не только может читать данные, которые зафиксированы другой модифицирующей транзакцией, но также накладывает ограничение, чтобы никакая другая транзакция не могла модифицировать данные, которые читаются, пока первая транзакция не завершит работу. Это устраняет проблему неповторяющихся чтений.
  3. SERIALIZABLE: Этим уровнем изоляции устанавливается множество свойств. Этот уровень изоляции является наиболее ограничительным по сравнению с другими, в результате чего могут возникнуть некоторые проблемы с производительностью при установке этого уровня. Вот упомянутые свойства:
  4. Текущая транзакция может читать только зафиксированные данные, модифицированные другой транзакцией данные.
  5. Другие транзакции ставятся в очередь ожидания пока первая транзакция не завершит выполнение.
  6. Никаким транзакциям не разрешается вставлять данные, которые отвечают условию текущей транзакции.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
  1. Что такое индексы. Какие индексы существуют. Отличия кластерного и некластерного идекса. Почему кластерный индекс может быть только один.
A

Кластеризованный индекс

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

Некластеризованный индекс

В отличие от кластеризованного индекса, листья некластеризованного индекса содержат только те столбцы (ключевые), по которым определен данный индекс, а также содержит указатель на строки с реальными данными в таблице. Это означает, что системе подзапросов необходима дополнительная операция для обнаружения и получения требуемых данных. Содержание указателя на данные зависит от способа хранения данных: кластеризованная таблица или куча. Если указатель ссылается на кластеризованную таблицу, то он ведет к кластеризованному индексу, используя который можно найти реальные данные. Если указатель ссылается на кучу, то он ведет к конкретному идентификатору строки с данными. Некластеризованные индексы не могут быть отсортированы в отличие от кластеризованных, однако вы можете создать более одного некластеризованного индекса на таблице или представлении, вплоть до 999. Это не означает, что вы должны создавать как можно больше индексов. Индексы могут как улучшить, так и ухудшить производительность системы. В дополнение к возможности создать несколько некластеризованных индексов, вы можете также включить дополнительные столбцы (included column) в свой индекс: на листьях индекса будет храниться не только значение самих индексированных столбцов, но и значения этих не индексированных дополнительных столбцов. Этот подход позволит вам обойти некоторые ограничения, наложенные на индекс. К примеру, вы можете включить неидексируемый столбец или обойти ограничение на длину индекса (900 байт в большинстве случаев).

Типы индексов

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

Составной индекс

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

Уникальный индекс

Такой индекс обеспечивает уникальность каждого значения в индексируемом столбце. Если индекс составной, то уникальность распространяется на все столбцы индекса, но не на каждый отдельный столбец. К примеру, если вы создадите уникальных индекс на столбцах ИМЯ и ФАМИЛИЯ, то полное имя должно быть уникально, но отдельно возможны дубли в имени или фамилии.
Уникальный индекс автоматически создается когда вы определяете ограничения столбца: первичный ключ или ограничение на уникальность значений:

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

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. Что такое триггеры и как они работают.
A

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

Основные характеристики триггеров:
1. События, вызывающие триггеры:
o INSERT: Триггер срабатывает при вставке новых строк в таблицу.
o UPDATE: Триггер срабатывает при изменении существующих строк в таблице.
o DELETE: Триггер срабатывает при удалении строк из таблицы.

  1. Время выполнения триггеров:
    o Before: Триггер выполняется до того, как соответствующее событие изменяет данные в таблице.
    o After: Триггер выполняется после того, как соответствующее событие изменило данные в таблице.
    o Instead Of: Триггер выполняется вместо выполнения операции (обычно используется в представлениях).

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

  1. Автоматическое обновление данных:
    o Пример: Триггер может автоматически обновлять значения в другой таблице. Например, при обновлении количества товара на складе можно автоматически обновлять общее количество доступного товара в другой таблице.
  2. Журналирование изменений:
    o Пример: Триггер может записывать изменения в отдельную таблицу журнала. Например, можно создавать триггер, который сохраняет старые значения строк перед их обновлением для отслеживания истории изменений.
  3. Обработка сложных бизнес-правил:
    o Пример: Триггер может выполнять сложные бизнес-правила, которые требуют выполнения нескольких операций. Например, при вставке новой строки заказа можно автоматически создавать записи о доставке и оплате.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. Отличия хранимой процедуры от функции. Применимость хранимых процедур.
A

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

Основные отличия хранимой процедуры от функции
1. Цель и использование:
o Хранимая процедура: Предназначена для выполнения определенной последовательности действий. Может выполнять любые операции, включая изменения в базе данных, и возвращать несколько значений через параметры.
o Функция: Предназначена для вычисления и возврата значения. Обычно используется для вычислений и преобразований данных и должна возвращать одно значение.

  1. Возвращаемое значение:
    o Хранимая процедура: Не обязана возвращать значение, хотя может использовать параметры OUT для возвращения данных.
    o Функция: Обязана возвращать значение. Возвращает одно значение через оператор RETURN.
  2. Вызов в SQL-запросах:
    o Хранимая процедура: Не может быть вызвана непосредственно в SQL-запросах. Вызывается с помощью оператора CALL или EXEC.
    o Функция: Может быть вызвана в SQL-запросах (SELECT, WHERE, HAVING и т.д.) как часть выражения.
  3. Параметры:
    o Хранимая процедура: Может иметь параметры типов IN (входные), OUT (выходные) и INOUT (входные/выходные).
    o Функция: Обычно имеет только входные параметры (IN).
  4. Ограничения на использование:
    o Хранимая процедура: Может содержать вызовы других процедур и функций, а также включать операторы управления транзакциями (COMMIT, ROLLBACK).
    o Функция: Обычно не должна содержать операторы управления транзакциями и ограничена в изменении данных (хотя это зависит от конкретной СУБД).

Применимость хранимых процедур
Хранимые процедуры используются в различных сценариях, где важно выполнение последовательности операций на сервере базы данных. Вот некоторые примеры применимости:
1. Бизнес-логика:
o Описание: Включение бизнес-логики в базу данных для обеспечения согласованности и уменьшения избыточности кода на уровне приложения.
o Пример: Процедура для обработки заказов, которая включает проверки доступности товара, расчёт общей стоимости заказа, обновление состояния заказа и создание записи в журнале транзакций.

  1. Автоматизация задач:
    o Описание: Автоматизация регулярных задач, таких как резервное копирование данных, обновление отчетов, очистка устаревших данных и т.д.
    o Пример: Процедура для ежедневного архивирования старых данных из таблицы транзакций в архивную таблицу.
  2. Оптимизация производительности:
    o Описание: Уменьшение объема передаваемых данных между сервером и клиентом, выполнение сложных операций на сервере для улучшения производительности.
    o Пример: Процедура для выполнения сложных вычислений и агрегирования данных, чтобы вернуть только необходимые результаты.
  3. Целостность данных:
    o Описание: Обеспечение целостности данных при выполнении сложных операций изменения данных.
    o Пример: Процедура для выполнения транзакций, включающая несколько операций вставки и обновления, с использованием логики обработки ошибок и отката.
  4. Управление транзакциями:
    o Описание: Управление транзакциями, включающими несколько операций, с использованием операторов COMMIT и ROLLBACK для обеспечения целостности данных.
    o Пример: Процедура для перевода средств между счетами, включающая проверки баланса и выполнение операций дебетования и кредитования с использованием транзакции.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. Что такое нормализация и нормальные формы, зачем они нужны. Когда уместно применять денормализацию.
A

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

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

Преимущества нормализации
1. Уменьшение избыточности данных: Нормализация помогает минимизировать дублирование данных, что уменьшает объем хранения и снижает вероятность ошибок при обновлении данных.
2. Повышение целостности данных: Обеспечивает согласованность и целостность данных, уменьшает вероятность аномалий вставки, обновления и удаления.
3. Упрощение обслуживания базы данных: Легче поддерживать структуру базы данных и выполнять изменения, когда данные организованы логично и без избыточности.

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

Когда уместно применять денормализацию
1. Повышение производительности запросов: Денормализация может быть полезна, если частые соединения между таблицами приводят к значительным накладным расходам и замедляют выполнение запросов. Например, объединение нескольких таблиц в одну для уменьшения количества join-операций.
2. Аналитические запросы: В системах, предназначенных для анализа данных (OLAP), часто требуются быстрые выборки больших объемов данных, и денормализация может помочь улучшить производительность таких запросов.
3. Кэширование часто используемых данных: Если определённые данные часто запрашиваются, их можно денормализовать и хранить в более удобной для чтения форме, чтобы ускорить доступ.
4. Предотвращение сложных операций: В ситуациях, когда сложные операции обновления или соединения данных могут быть затруднены или медленны, денормализация может упростить выполнение этих операций.

Примеры денормализации
1. Создание дополнительных столбцов: Добавление столбцов в таблицу для хранения агрегированных данных, которые часто запрашиваются. Например, добавление столбца с суммой заказов в таблицу клиентов.
2. Объединение таблиц: Объединение связанных таблиц в одну для уменьшения количества join-операций. Например, объединение таблиц заказов и клиентов в одну таблицу, содержащую всю информацию о заказах и клиентах.
3. Копирование данных: Дублирование данных из одной таблицы в другую для уменьшения количества сложных запросов. Например, хранение адресов клиентов как в таблице заказов, так и в таблице клиентов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q
  1. Что такое первичный, внешний, уникальный ключ.
A

Первичный ключ (Primary Key)
Определение: Первичный ключ — это уникальный идентификатор для каждой строки в таблице. Он обеспечивает уникальность каждой записи и не допускает дублирования или NULL значений.

Характеристики:
1. Уникальность: Значение первичного ключа должно быть уникальным для каждой строки в таблице.
2. Не NULL: Первичный ключ не может содержать NULL значения.
3. Ограничение целостности: СУБД автоматически создает ограничение первичного ключа (PRIMARY KEY constraint), чтобы гарантировать уникальность и отсутствие NULL значений.
4. Составной ключ: Первичный ключ может состоять из одного столбца или комбинации нескольких столбцов (составной ключ).

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

Характеристики:
1. Ссылка на первичный ключ: Внешний ключ ссылается на первичный ключ другой (или той же) таблицы.
2. Ограничение целостности: СУБД обеспечивает, чтобы значение внешнего ключа соответствовало значению первичного ключа связанной таблицы, или было NULL.
3. Поддержка целостности данных: Обеспечивает целостность данных, предотвращая удаление или обновление строк в родительской таблице, если на них есть ссылки в дочерней таблице.

Уникальный ключ (Unique Key)
Определение: Уникальный ключ — это столбец или комбинация столбцов, значения которых должны быть уникальными для каждой строки в таблице, но в отличие от первичного ключа, уникальный ключ может содержать NULL значения (один или несколько).

Характеристики:
1. Уникальность: Значения уникального ключа должны быть уникальными в пределах таблицы.
2. NULL значения: Допускаются NULL значения, если они не нарушают уникальность.
3. Ограничение целостности: СУБД создает ограничение уникального ключа (UNIQUE constraint), чтобы обеспечить уникальность значений.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. Что такое ограничения (сonstraints) и каких типов они бывают.
A

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

Типы ограничений:

  1. NOT NULL:
    o Описание: Указывает, что столбец не может содержать NULL значения.
    o Пример:
    CREATE TABLE employees (
    employee_id INT NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL
    );
  2. UNIQUE:
    o Описание: Гарантирует, что все значения в столбце или комбинации столбцов уникальны.
    o Пример:
    CREATE TABLE employees (
    employee_id INT NOT NULL,
    email VARCHAR(100) UNIQUE
    );
  3. PRIMARY KEY:
    o Описание: Комбинирует NOT NULL и UNIQUE. Обеспечивает уникальную идентификацию строк в таблице.
    o Пример:
    CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL
    );
  4. FOREIGN KEY:
    o Описание: Устанавливает связь между столбцом (или столбцами) в одной таблице и столбцом (или столбцами) в другой таблице. Обеспечивает целостность ссылок.
    o Пример:
    CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
    );
  5. CHECK:
    o Описание: Гарантирует, что значение в столбце соответствует заданному условию.
    o Пример:
    CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    age INT,
    CHECK (age >= 18)
    );
  6. DEFAULT:
    o Описание: Устанавливает значение по умолчанию для столбца, если при вставке строки значение не указано.
    o Пример:
    CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    hire_date DATE DEFAULT CURRENT_DATE
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. Что такое соединения (joins) и какие они бывают.
A

Соединения (joins) в SQL используются для объединения строк из двух или более таблиц на основе связанных столбцов. Они позволяют извлекать данные, которые связаны между собой, из различных таблиц, обеспечивая целостность и взаимосвязь данных.

  1. INNER JOIN
    Описание: Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах. Если нет совпадающих строк, то они не включаются в результат.

Пример:
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;

Этот запрос выберет все заказы и соответствующие имена клиентов, у которых есть совпадающие customer_id.

  1. LEFT JOIN (или LEFT OUTER JOIN)
    Описание: Возвращает все строки из левой таблицы и совпадающие строки из правой таблицы. Если совпадающие строки отсутствуют в правой таблице, результат содержит NULL для всех столбцов правой таблицы.

Пример:
SELECT employees.employee_id, departments.department_name
FROM employees
LEFT JOIN departments ON employees.department_id = departments.department_id;

Этот запрос выберет всех сотрудников и названия отделов, даже если у некоторых сотрудников нет соответствующих отделов (NULL в столбце department_name).

  1. RIGHT JOIN (или RIGHT OUTER JOIN)
    Описание: Возвращает все строки из правой таблицы и совпадающие строки из левой таблицы. Если совпадающие строки отсутствуют в левой таблице, результат содержит NULL для всех столбцов левой таблицы.

Пример:
SELECT employees.employee_id, departments.department_name
FROM employees
RIGHT JOIN departments ON employees.department_id = departments.department_id;

Этот запрос выберет все отделы и соответствующих сотрудников, даже если в некоторых отделах нет сотрудников (NULL в столбце employee_id).

  1. FULL JOIN (или FULL OUTER JOIN)
    Описание: Возвращает все строки, когда есть совпадение в левой или правой таблице. Если совпадения отсутствуют, результат содержит NULL для столбцов той таблицы, в которой нет совпадающих строк.

Пример:
SELECT employees.employee_id, departments.department_name
FROM employees
FULL JOIN departments ON employees.department_id = departments.department_id;

Этот запрос выберет всех сотрудников и все отделы, показывая NULL, где нет совпадений.

  1. CROSS JOIN
    Описание: Возвращает декартово произведение строк из обеих таблиц. Каждый ряд первой таблицы соединяется со всеми рядами второй таблицы.

Пример:
SELECT products.product_name, categories.category_name
FROM products
CROSS JOIN categories;

Этот запрос выберет все возможные комбинации продуктов и категорий.

  1. SELF JOIN
    Описание: Соединение таблицы с самой собой. Используется для связи строк в таблице.

Пример:
SELECT e1.employee_id AS Employee, e2.employee_id AS Manager
FROM employees e1
JOIN employees e2 ON e1.manager_id = e2.employee_id;

Этот запрос выберет всех сотрудников и их менеджеров.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. Какие SQL оптимизации существуют.
A
  1. Оптимизация запросов
    Использование индексов
    Индексы значительно ускоряют поиск данных, сортировку и выполнение условий WHERE. Создавайте индексы на столбцах, которые часто используются в запросах.
    Пример:
    CREATE INDEX idx_employee_name ON employees(name);

Избегайте SELECT *
Извлечение всех столбцов может быть неэффективным. Выбирайте только те столбцы, которые вам действительно нужны.
Пример:
SELECT name, age FROM employees;

Ограничение количества возвращаемых строк
Используйте LIMIT или TOP для ограничения количества строк, возвращаемых запросом.
Пример:
SELECT name, age FROM employees LIMIT 10;

Использование подходящих условий WHERE
Обеспечьте использование условий WHERE для фильтрации данных на уровне базы данных, а не в приложении.
Пример:
SELECT name, age FROM employees WHERE department_id = 1;

Избегание сложных выражений и функций
Если возможно, избегайте использования сложных выражений и функций в условиях WHERE, так как они могут замедлить выполнение запроса.
Пример:
SELECT name, age FROM employees WHERE birth_date > ‘1980-01-01’;

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

Пример:
SELECT e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

  1. Индексация
    Создание индексов
    Создавайте индексы на столбцах, которые часто используются в условиях WHERE, JOIN, ORDER BY, и GROUP BY.

Композитные индексы
Используйте композитные индексы, когда запросы часто фильтруются или сортируются по нескольким столбцам.
Пример:
CREATE INDEX idx_emp_dept ON employees(department_id, name);

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

  1. Нормализация и денормализация
    Нормализация
    Применяйте нормализацию для устранения избыточности данных и обеспечения целостности данных. Используйте нормальные формы до третьей нормальной формы (3NF).

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

  1. Профилирование и мониторинг
    Профилирование запросов
    Используйте инструменты профилирования запросов, чтобы выявить медленные запросы и узкие места.
    Пример инструмента: EXPLAIN или EXPLAIN ANALYZE в PostgreSQL, SHOW PROFILE в MySQL.
    EXPLAIN ANALYZE SELECT name, age FROM employees WHERE department_id = 1;

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

  1. Оптимизация схемы базы данных

Вертикальное и горизонтальное разбиение
Используйте разбиение таблиц для управления большими объемами данных и повышения производительности.
* Горизонтальное разбиение (sharding): Деление таблицы на более мелкие таблицы на основе значений строк.
* Вертикальное разбиение: Разделение таблицы на более мелкие таблицы по столбцам.

Кэширование
Используйте кэширование результатов часто запрашиваемых данных на уровне приложения или с помощью специальных инструментов кэширования (например, Redis, Memcached).

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

Пример:
INSERT INTO employees (name, age, department_id) VALUES
(‘John’, 30, 1),
(‘Jane’, 25, 2),
(‘Doe’, 35, 3);

Минимизация блокировок
Используйте транзакции для группировки операций и уменьшения блокировок.

Пример:
BEGIN TRANSACTION;
UPDATE employees SET salary = salary * 1.1 WHERE department_id = 1;
UPDATE employees SET salary = salary * 1.05 WHERE department_id = 2;
COMMIT;

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. Какие бывают типы отношений между таблицами.
A
  1. Один к одному (One-to-One)
    Описание: В отношении один к одному каждая строка в одной таблице соответствует ровно одной строке в другой таблице. Такое отношение часто используется для разделения данных, которые редко используются, или для обеспечения безопасности данных.
  2. Один ко многим (One-to-Many)
    Описание: В отношении один ко многим каждая строка в одной таблице может соответствовать нескольким строкам в другой таблице. Это наиболее распространенный тип отношения и используется для моделирования иерархий и списков.
  3. Многие ко многим (Many-to-Many)
    Описание: В отношении многие ко многим каждая строка в одной таблице может соответствовать нескольким строкам в другой таблице, и наоборот. Для реализации таких отношений используется промежуточная таблица (связующая таблица), которая содержит внешние ключи на обе связанные таблицы.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q
  1. Отличие HAVING от WHERE.
A

HAVING и WHERE — это два ключевых оператора SQL, используемых для фильтрации данных, но они применяются на разных этапах обработки запроса и имеют различные назначения. Вот основные отличия между ними:

  1. Этап выполнения:
    o WHERE: Применяется для фильтрации строк до агрегации данных, то есть до выполнения группировок и агрегатных функций.
    o HAVING: Применяется для фильтрации групп строк после агрегации данных, то есть после выполнения группировок и агрегатных функций.
  2. Область применения:
    o WHERE: Используется для фильтрации индивидуальных строк в таблице.
    o HAVING: Используется для фильтрации агрегированных результатов.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. В чем отличие реляционных и нереляционных моделей.
A

Реляционные и нереляционные модели баз данных (БД) представляют собой два различных подхода к хранению, организации и управлению данными. Основные отличия между ними касаются структуры данных, способов доступа и типов операций, которые они поддерживают.
Реляционные базы данных (RDBMS)
Основные характеристики:
1. Структура данных:
o Данные организованы в виде таблиц (реляций), состоящих из строк (записей) и столбцов (атрибутов).
o Каждая таблица имеет схему, которая определяет типы данных для каждого столбца.
2. Связи между данными:
o Отношения между таблицами определяются с помощью внешних ключей.
o Поддерживаются сложные связи между таблицами, включая “один к одному”, “один ко многим” и “многие ко многим”.
3. Целостность данных:
o Система строго соблюдает ограничения целостности данных (например, уникальные ключи, внешние ключи).
o Транзакции поддерживают ACID-свойства (атомарность, согласованность, изолированность, долговечность).
4. Язык запросов:
o SQL (Structured Query Language) — стандартный язык для управления и манипуляции данными.
o SQL обеспечивает мощные возможности для создания запросов, обновления данных и управления структурой БД.
Примеры RDBMS: MySQL, PostgreSQL, Oracle, Microsoft SQL Server.
Преимущества:
* Высокая степень целостности данных.
* Поддержка сложных запросов и транзакций.
* Широкая распространенность и стандартность.
Недостатки:
* Сложность масштабирования для больших объемов данных.
* Не всегда эффективно для работы с неструктурированными или полуструктурированными данными.
Нереляционные базы данных (NoSQL)
Основные характеристики:
1. Структура данных:
o Данные могут быть организованы в различных форматах: документо-ориентированные, графовые, колоночные, ключ-значение.
o Гибкая схема или отсутствие схемы.
2. Связи между данными:
o Часто данные хранятся в виде вложенных структур, что позволяет избежать необходимости в сложных соединениях (joins).
o Используются другие методы для определения связей между данными, такие как встроенные ссылки или денормализованные данные.
3. Целостность данных:
o Поддержка слабых гарантий целостности данных.
o Транзакции часто поддерживают свойства BASE (Basic Availability, Soft state, Eventual consistency).
4. Язык запросов:
o Нет стандартного языка запросов; каждый тип базы данных может иметь свой собственный язык или API.
o Примеры: MongoDB использует собственный язык запросов, Cassandra поддерживает CQL (Cassandra Query Language).
Примеры NoSQL: MongoDB, Cassandra, Redis, Neo4j, Amazon DynamoDB.
Преимущества:
* Легкость масштабирования, особенно горизонтального.
* Гибкость в работе с неструктурированными и полуструктурированными данными.
* Высокая производительность для определенных типов операций.
Недостатки:
* Слабые гарантии целостности данных.
* Отсутствие стандартного языка запросов и инструментов для управления.
* Может потребоваться больше усилий для обеспечения целостности данных и управления транзакциями.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Какое значение имеет порядок колонок в индексах?

A

The order of columns in a non-clustered index can be quite important for query performance. Here’s why:

Query Matching: The order of columns in the index determines how effectively the index can support different types of queries. If your queries often filter or sort by specific columns, those columns should be placed earlier in the index. For example, if you frequently query based on columns A and B, but A is more selective (filters results more effectively) than B, then placing A before B in the index can be more beneficial.

Index Efficiency: Non-clustered indexes are most efficient when they match the order of columns in the query’s WHERE clause, JOIN conditions, or ORDER BY clause. If the columns in your index match the columns used in these clauses, the index can be used to quickly locate the rows without needing to scan the entire table.

Index Coverage: When columns are ordered correctly, the index can potentially cover more queries. For instance, if an index is created with columns (A, B, C), it can efficiently support queries that filter or sort by A, A and B, or A, B, and C. However, it won’t be as effective if you only filter by B or C without A.

Prefix Matching: Indexes work well when queries use the leading (leftmost) columns of the index. For example, an index on (A, B, C) can be used for queries filtering by A alone, A and B, or A, B, and C, but not efficiently for queries filtering by B alone or C alone without A.

Performance Impact: Poorly chosen column order can lead to suboptimal index performance, causing the database engine to either use less efficient access paths or not use the index at all for certain queries.

In summary, the order of columns in a non-clustered index should be aligned with your most common query patterns to maximize the index’s effectiveness and performance

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Что такое materialized view?

A

A materialized view is a database object that stores the result of a query physically on disk, rather than computing it on the fly each time it is accessed. Here’s a breakdown of what makes materialized views distinct and useful:

Characteristics of Materialized Views
Precomputed Data: Unlike a standard view, which is essentially a saved SQL query that is executed each time the view is accessed, a materialized view stores the query results as a snapshot of the data. This can significantly speed up query performance, especially for complex queries or aggregations.

Storage: Because the results are stored on disk, materialized views require additional storage space. This can be substantial depending on the size of the data and the complexity of the view.

Refresh Mechanism: The data in a materialized view can become stale as the underlying tables change. To handle this, materialized views can be configured to refresh automatically at specific intervals (e.g., every hour, daily) or on demand (manual refresh). Some systems also support incremental refreshes, updating only the changed parts of the view.

Performance: Materialized views improve performance by reducing the need to recompute complex queries every time they are accessed. This is particularly beneficial for reporting and analytical workloads where the same aggregated results are queried frequently.

Indexes: You can often create indexes on materialized views to further enhance query performance. This allows for faster access to the stored results.

Use Cases for Materialized Views
Reporting and Analytics: They are ideal for scenarios where reports need to aggregate large amounts of data, as they provide a quick way to access precomputed results without recalculating them.

Data Warehousing: In data warehouses, materialized views are used to precompute and store aggregated data from various tables, making querying and analysis faster.

Performance Optimization: When you have queries that involve expensive joins, aggregations, or calculations, materialized views can store the results of these operations to avoid recalculating them every time.

Examples in Different Database Systems
Oracle: Oracle refers to materialized views as “Materialized Views” and offers extensive features for managing and refreshing them.
PostgreSQL: PostgreSQL has support for materialized views with the ability to refresh them manually or incrementally.
SQL Server: In SQL Server, materialized views are known as “Indexed Views” and are used to improve query performance.
Overall, materialized views are a powerful tool for optimizing query performance and managing complex data retrieval scenarios efficiently.

17
Q

Union vs union all

A

UNION
Function: Combines the results of two or more SELECT queries and returns only distinct rows from the combined result set.

Duplicates: Removes duplicate rows from the final result set. This means that if the same row appears in multiple SELECT queries, it will only appear once in the output.

Performance: Because UNION involves removing duplicates, it can be slower than UNION ALL, especially for large datasets. The database engine needs to perform an additional step to eliminate duplicates, which can add overhead.

UNION ALL
Function: Combines the results of two or more SELECT queries and returns all rows, including duplicates.

Duplicates: Does not remove duplicates. If the same row appears in multiple SELECT queries, it will appear multiple times in the output.

Performance: Generally faster than UNION because it does not require the additional step of removing duplicates. This makes it more efficient for large datasets or when duplicates are not a concern.

Key Differences
Duplicate Handling:

UNION eliminates duplicate rows.
UNION ALL includes all rows, including duplicates.
Performance:

UNION can be slower due to the need to remove duplicates.
UNION ALL is generally faster as it directly combines results without duplicate checks.
Use Case:

Use UNION when you need a result set with unique rows and are concerned about duplicate entries.
Use UNION ALL when you need to include all results, including duplicates, and want to maximize performance.

18
Q

Оконные функции

A

Window functions are a category of SQL functions that perform calculations across a set of table rows that are related to the current row. Unlike aggregate functions that return a single value for a group of rows, window functions return a value for each row within the window of data defined by the function.

Here’s a comprehensive overview of window functions:

Key Features of Window Functions
Partitioning: Window functions operate over a subset of rows defined by a PARTITION BY clause. This clause divides the result set into partitions to which the window function is applied independently.

Ordering: Within each partition, window functions can be further refined by the ORDER BY clause, which specifies the order in which the function processes the rows.

Framing: You can define a frame of rows relative to the current row using the ROWS or RANGE clauses. This determines the subset of rows used in the calculation.

Non-Aggregate Nature: Unlike aggregate functions, window functions do not collapse the result set into a single row per group. Instead, they return a value for each row in the result set.

19
Q

Планировщик запросов

A

Планировщик запросов (или планировщик выполнения запросов) — это инструмент базы данных, который анализирует SQL-запросы и определяет наилучший способ их выполнения. Цель планировщика запросов — минимизировать время выполнения запросов и использовать ресурсы базы данных наиболее эффективно.

Основные аспекты работы планировщика запросов
Анализ Запроса: Планировщик сначала разбирает запрос, анализируя его структуру и синтаксис.

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

Исполнение Запроса: После выбора плана выполнения, запрос исполняется согласно этому плану.

Обратная Связь: В некоторых системах планировщик может корректировать планы выполнения запросов на основе статистики выполнения и анализа производительности.

Как использовать планировщик запросов для оптимизации запросов
Понимание Плана Выполнения:

Получение Плана Выполнения: Многие СУБД предоставляют инструменты для получения плана выполнения запроса. Например, в PostgreSQL это EXPLAIN, в MySQL — EXPLAIN или EXPLAIN ANALYZE, в SQL Server — SHOWPLAN или SET SHOWPLAN.

EXPLAIN ANALYZE SELECT * FROM table WHERE column = ‘value’;
Анализ Плана: Изучите план выполнения, чтобы понять, как запрос обрабатывается. Обратите внимание на этапы выполнения, такие как сканирование таблиц, использование индексов, соединения и сортировка.
Оптимизация Запроса:

Индексы: Убедитесь, что вы используете индексы для часто используемых колонок в условиях WHERE, JOIN и ORDER BY. Проверьте, какие индексы используются в плане выполнения.
Структура Запроса: Оптимизируйте структуру запроса. Например, избегайте ненужных подзапросов, используйте соединения вместо подзапросов, когда это возможно.
Использование Операторов: Различные операторы могут быть более эффективными в определенных случаях. Например, JOIN может быть более эффективен, чем подзапросы, если правильно использовать индексы.
Анализ Статистики: Периодически обновляйте статистику таблиц, чтобы планировщик мог принимать обоснованные решения. Например, в PostgreSQL это делается командой ANALYZE.

ANALYZE table;
Оптимизация Таблиц: Убедитесь, что таблицы нормально нормализованы и нет избыточных данных или неоптимальных типов данных.

20
Q

Виды NoSQL баз данных и для чего они нужны

A

NoSQL databases are designed to handle a variety of data models that are not well-suited for traditional relational databases. They’re often used for large-scale data storage, high-performance needs, and flexible schema requirements. Here’s a brief overview of some of the most popular NoSQL databases and what they excel at:

  1. MongoDB
    Type: Document-oriented
    Best For: Flexible schema, complex queries, and hierarchical data.
    Strengths: MongoDB stores data in JSON-like BSON format, which allows for rich and nested data structures. It’s known for its ease of use, scalability, and powerful query language.
  2. Cassandra
    Type: Wide-column store
    Best For: High write throughput, large-scale deployments, and fault tolerance.
    Strengths: Designed for high availability and scalability, Cassandra can handle large amounts of data across many servers with no single point of failure. It’s ideal for applications with heavy read and write requirements.
  3. Redis
    Type: Key-value store
    Best For: Caching, real-time analytics, and high-speed transactions.
    Strengths: Redis is known for its extremely fast performance and support for various data structures like strings, lists, sets, and hashes. It’s often used for caching to improve application performance.
  4. Couchbase
    Type: Document-oriented and key-value store
    Best For: Low-latency operations and distributed caching.
    Strengths: Couchbase combines the benefits of a document store with the performance of a key-value store. It supports flexible JSON document storage and has built-in caching, which helps with high-speed data access.
  5. Neo4j
    Type: Graph database
    Best For: Complex queries involving relationships, like social networks and recommendation systems.
    Strengths: Neo4j specializes in storing and querying data that is highly interconnected. It uses graph structures (nodes and edges) to represent and query relationships efficiently.
  6. Amazon DynamoDB
    Type: Key-value and document store
    Best For: Scalable, managed NoSQL services in the cloud.
    Strengths: DynamoDB offers high availability and performance with automatic scaling and built-in support for complex querying and transactions. It’s fully managed by AWS, which simplifies deployment and management.
  7. Apache HBase
    Type: Wide-column store
    Best For: Large-scale data processing and real-time read/write access.
    Strengths: Built on top of Hadoop’s HDFS, HBase is designed for high throughput and scalability. It’s well-suited for big data applications and large-scale analytics.
  8. RavenDB
    Type: Document-oriented
    Best For: Embedded systems and .NET environments.
    Strengths: RavenDB provides a rich set of features for querying and indexing. It also has built-in support for transactions and distributed deployments.
    Summary
    Each NoSQL database has its own strengths and is designed with specific use cases in mind. When choosing a NoSQL database, consider factors such as the type of data you need to store, the scale of your application, and the specific features you require. Whether you need high-speed transactions, complex querying, or flexible schema designs, there’s likely a NoSQL database well-suited to your needs.
21
Q

В чем разница между базой данных и схемой?

A

The terms “database” and “schema” are often used in the context of database management systems, and while they are related, they refer to different concepts:

Database:

Definition: A database is a collection of data organized in a structured way. It typically includes data, as well as the system for managing and retrieving that data. Databases store data in tables, which can be related to one another, and provide mechanisms for querying, updating, and managing the data.
Components: A database includes tables, views, indexes, and sometimes other structures like stored procedures or triggers.
Functionality: Databases are designed to handle large amounts of data and facilitate efficient data operations. They also include features for data integrity, security, and concurrency.
Schema:

Definition: A schema is a blueprint or framework that defines the structure of a database. It specifies how data is organized within the database and how the relationships among data are managed. In essence, a schema outlines the tables, fields, relationships, and constraints that make up the database.
Components: A schema includes definitions for tables (e.g., column names and types), indexes, views, and relationships (e.g., foreign keys). It may also include rules and constraints that ensure data integrity.
Functionality: The schema is used to design the logical structure of the database. It helps ensure that the database follows certain rules and maintains consistency, but it doesn’t include the actual data itself.
In summary:

A database is the entire system that includes the data and the management tools for interacting with it.
A schema is a specific part of the database that defines its structure and organization.
You can think of a database as a whole warehouse full of data, while a schema is like the blueprint or layout plan for organizing that warehouse.

22
Q

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

A

Self-join в SQL – это тип операции соединения, при которой таблица объединяется сама с собой. Это полезно, когда у вас есть таблица со связанными данными в разных строках, которые вы хотите объединить на основе общего поля.

Например, рассмотрим таблицу “employees” (“Сотрудники”) со столбцами для ID и имени сотрудника, а также ID менеджера. Столбец ID менеджера содержит ID менеджера сотрудника. Чтобы получить список всех сотрудников с именем их менеджера, можно использовать self-join.

Вот пример запроса:

SELECT e.name AS employee_name, m.name AS manager_name
FROM employees e
JOIN employees m ON e.manager_id = m.employee_id;
В этом запросе мы соединяем таблицу “employees” с самой собой, используя столбец “manager_id”, чтобы сопоставить каждого сотрудника с его руководителем. В результирующей таблице будут столбцы с именем сотрудника и именем его менеджера.

Self-join также можно использовать для поиска связей между данными в одной таблице. Например, если у вас есть таблица продуктов со столбцами для ID продукта, названия и ID “родительского” продукта, соединение внутри таблицы может быть использовано для поиска всех “дочерних” продуктов данного “родительского” продукта.

23
Q

В чем разница между внутренним и внешним соединением?

A

Внутреннее соединение возвращает только совпадающие строки из обеих таблиц на основе условия соединения.

С другой стороны, внешнее соединение возвращает все строки из одной таблицы и совпадающие строки из другой таблицы. Если во второй таблице нет совпадающих строк, результат будет содержать NULL-значения для всех столбцов этой таблицы. Внешние соединения также делятся на левое внешнее (left outer join), правое внешнее (right outer join) и полное внешнее соединение (full outer join).

24
Q

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

A

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

Некоррелированный подзапрос
Определение:
Некоррелированный подзапрос — это подзапрос, который независим от внешнего запроса. Он выполняется один раз, и его результат используется в основном запросе.

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

sql
Копировать код
SELECT ProductName
FROM Products
WHERE Price > (SELECT AVG(Price) FROM Products);
В этом примере подзапрос (SELECT AVG(Price) FROM Products) является некоррелированным, потому что он не зависит от внешнего запроса. Он вычисляется один раз, и результат используется для фильтрации результатов основного запроса.

Коррелированный подзапрос
Определение:
Коррелированный подзапрос — это подзапрос, который зависит от внешнего запроса. Каждый раз, когда внешний запрос выполняется, коррелированный подзапрос выполняется снова, используя значения из внешнего запроса.

Пример:
Предположим, у нас есть таблицы Orders и Customers, и мы хотим найти всех клиентов, у которых есть заказы на сумму больше 1000.

sql
Копировать код
SELECT CustomerID, CustomerName
FROM Customers C
WHERE EXISTS (
SELECT 1
FROM Orders O
WHERE O.CustomerID = C.CustomerID
AND O.OrderAmount > 1000
);
В этом примере подзапрос внутри EXISTS — коррелированный, потому что он зависит от значения CustomerID из внешнего запроса. Подзапрос выполняется для каждой строки в таблице Customers, проверяя, есть ли у этого клиента заказы с суммой больше 1000.

Основные различия
Зависимость:

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

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

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

25
Q

Что такое обобщенное табличное выражение (CTE) и как оно используется?

A

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

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

WITH cte_name AS (
SELECT column1, column2, …
FROM table_name
WHERE condition
)
SELECT *
FROM cte_name

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

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

В целом, CTE – это мощная функция SQL, которая позволяет упростить сложные запросы и повысить производительность.

26
Q

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

A

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

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

Оператор TRUNCATE используется для удаления всех строк из таблицы за один раз. Это более быстрый метод удаления данных по сравнению с DELETE. Однако, TRUNCATE не позволяет использовать предложение WHERE и не может выборочно удалять определенные строки.

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

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

27
Q

Что такое временная таблица и как она используется?

A

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

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

Временные таблицы можно создать с помощью оператора CREATE TEMPORARY TABLE. Они могут быть созданы в памяти или на диске, в зависимости от системы базы данных и конфигурации.

Временные таблицы можно использовать как обычные таблицы в SQL-запросах и заполнять данными с помощью операторов INSERT. Их также можно объединять с другими таблицами или использовать в подзапросах.

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

28
Q

В чем разница между транзакцией и batch?

A

В SQL транзакция – это единая логическая единица работы, включающая один или несколько операторов SQL. Транзакция выполняется атомарно. Это значит, что все операторы внутри транзакции должны быть либо зафиксированы, либо отменены как единое целое.

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

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

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

29
Q

В чем разница между скалярной и табличной функцией?

A

В SQL функция – это набор инструкций, которые могут быть использованы для выполнения определенной задачи. Существует два типа функций: скалярные и табличные.

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

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

Одно из ключевых различий между скалярными и табличными функциями заключается в том, что скалярные функции можно вызывать внутри запроса, то есть использовать их как часть предложений SELECT, WHERE или ORDER BY. Табличные функции должны вызываться как часть предложения FROM, поскольку они возвращают таблицу.

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

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

30
Q

Разница между COUNT(*), COUNT(1) и COUNT(column_name)

A

COUNT(): Counts all rows, regardless of NULL values.
COUNT(1): Counts all rows, with the constant 1 always being non-NULL. Functionally equivalent to COUNT(
) in most databases.
COUNT(column_name): Counts only the rows where the specified column has a non-NULL value.
In terms of performance, for most modern SQL databases, COUNT(*) and COUNT(1) are optimized similarly and should provide equivalent performance. COUNT(column_name) is different as it only counts rows with non-NULL values in the specified column.