Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Индексы в среде MS SQL Server




Индекс представляет собой средство, помогающее ускорить поиск необходимых данных за счет физического или логического их упорядочивания. Индекс представляет собой набор ссылок, упорядоченных по определенному столбцу таблицы, который в данном случае будет называться индексированным столбцом. Индексы - это наборы уникальных значений для некоторой таблицы с соответствующими ссылками на данные. Они расположены в самой таблице и являются удобным внутренним механизмом системы SQL-сервера, с помощью которого осуществляется доступ к данным наиболее оптимальным способом. В среде SQL Server реализованы эффективные алгоритмы поиска нужного значения в строго определенной последовательности данных. Ускорение поиска достигается именно за счет того, что данные представляются упорядоченными (хотя физически, в зависимости от типа индекса, они могут храниться в соответствии с очередностью их добавления в таблицу). К настоящему времени разработаны эффективные математические алгоритмы поиска данных в упорядоченной последовательности. Наиболее эффективной структурой для поиска данных в машинном представлении являются B-деревья – многоуровневая иерархическая структура с переменным количеством элементов в каждом узле.

Создание индекса

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

В среде SQL Server реализовано несколько типов индексов:

  • кластерные индексы;
  • некластерные индексы;
  • уникальные индексы.

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

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

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

  • информацию об идентификационном номере файла, в котором хранится строка;
  • идентификационный номер страницы соответствующих данных;
  • номер искомой строки на соответствующей странице;
  • содержимое столбца.

В большинстве случаев следует ограничиваться 4-5 индексами.

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

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

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

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

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

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

При создании в таблице первичного ключа (PRIMARY KEY) сервер автоматически создает для него кластерный индекс, если его не существовало ранее или если при определении ключа не был явно указан другой тип индекса.

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

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

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

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

Уникальные индексы следует определять только тогда, когда это действительно необходимо. Для обеспечения целостности данных в столбце можно определить ограничение целостности UNIQUE или PRIMARY KEY, а не прибегать к уникальным индексам. Их использование только для обеспечения целостности данных является неоправданной тратой пространства в базе данных. Кроме того, на их поддержание тратится и процессорное время.

Средства языка SQL предлагают несколько способов определения индекса:

  • автоматическое создание индекса при создании первичного ключа;
  • автоматическое создание индекса при определении ограничения целостности UNIQUE;
  • создание индекса с помощью команды CREATE INDEX.

Последняя команда имеет следующий формат:

<создание_индекса>::= CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX имя_индекса ON имя_таблицы(имя_столбца [ASC|DESC][,...n]) [WITH [PAD_INDEX] [[,] FILLFACTOR=фактор_заполнения] [[,] IGNORE_DUP_KEY] [[,] DROP_EXISTING] [[,] STATISTICS_NORECOMPUTE] ] [ON имя_группы_файлов ]

Рассмотрим некоторые параметры приведенной команды.

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

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

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

Параметр NONCLASTERED позволяет создавать некластерные индексы.

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

Параметр PAD_INDEX определяет заполнение внутреннего пространства индекса и применяется совместно с FILLFACTOR.

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

Параметр STATISTICS_NORECOMPUTE определяет функции автоматического обновления статистики для таблицы.

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

Удаление индекса

Удаление индекса выполняется командой

DROP INDEX 'имя_индекса'[,...n]

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

CREATE UNIQUE CLUSTERED INDEX index_klient1 ON Клиент (Фамилия) WITH DROP_EXISTING ON PRIMARY

Пример 3.5. Создание уникального кластерного индекса. (html, txt)

Пример 3.6. Создать уникальный некластерный индекс для таблицы Клиент по столбцам Фамилия и Имя в первичной группе файлов. Кроме того, элементы индекса будут упорядочены по убыванию. Также запретим автоматическое обновление статистики при изменении данных в таблице и установим фактор заполнения индексных страниц на уровне 30%.

CREATE UNIQUE NONCLUSTERED INDEX index_klient2 ON Клиент (Фамилия DESC,Имя DESC) WITH FILLFACTOR=30, STATISTICS_NORECOMPUTE ON PRIMARY

Пример 3.6. Создание уникального некластерного индекса. (html, txt)

 

4. Лекция: Эффективное выполнение запросов для извлечения данных

 

Дается синтаксис оператора SELECT. Описываются предложение FROM и использование синонимов. Определяется построение условий выбора данных с применением операторов сравнения, логических операторов IS NULL, BETWEEN, IN, LIKE и логических связок OR и AND. Предлагаются способы использования оператора ORDER BY для сортировки записей в запросах выборки.

Предложение SELECT

Оператор SELECT – один из наиболее важных и самых распространенных операторов SQL. Он позволяет производить выборки данных из таблиц и преобразовывать к нужному виду полученные результаты. Будучи очень мощным, он способен выполнять действия, эквивалентные операторам реляционной алгебры, причем в пределах единственной выполняемой команды. При его помощи можно реализовать сложные и громоздкие условия отбора данных из различных таблиц.

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

Оператор SELECT имеет следующий формат:

SELECT [ALL | DISTINCT ] {*|[имя_столбца [AS новое_имя]]} [,...n] FROM имя_таблицы [[AS] псевдоним] [,...n] [WHERE <условие_поиска>] [GROUP BY имя_столбца [,...n]] [HAVING <критерии выбора групп>] [ORDER BY имя_столбца [,...n]]

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

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

Предложение FROM

Предложение FROM задает имена таблиц и просмотров, которые содержат поля, перечисленные в операторе SELECT. Необязательный параметр псевдонима – это сокращение, устанавливаемое для имени таблицы.

Обработка элементов оператора SELECT выполняется в следующей последовательности:

  • FROM – определяются имена используемых таблиц;
  • WHERE – выполняется фильтрация строк объекта в соответствии с заданными условиями;
  • GROUP BY – образуются группы строк, имеющих одно и то же значение в указанном столбце;
  • HAVING – фильтруются группы строк объекта в соответствии с указанным условием;
  • SELECT – устанавливается, какие столбцы должны присутствовать в выходных данных;
  • ORDER BY – определяется упорядоченность результатов выполнения операторов.

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

Пример 4.1. Составить список сведений о всех клиентах.

SELECT * FROM Клиент

Пример 4.1. Список сведений о всех клиентах. (html, txt)

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

Пример 4.2. Составить список всех фирм.

SELECT ALL Клиент.Фирма FROM Клиент Или (что эквивалентно) SELECT Клиент.Фирма FROM Клиент

Пример 4.2. Список всех фирм. (html, txt)

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

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

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

Откорректированный пример 4.2 выглядит следующим образом:

SELECT DISTINCT Клиент.Фирма FROM Клиент

 

Предложение WHERE

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

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

Сравнение

В языке SQL можно использовать следующие операторы сравнения: = – равенство; < – меньше; > – больше; <= – меньше или равно; >= – больше или равно; <> – не равно.

Пример 4.3. Показать все операции отпуска товаров объемом больше 20.

SELECT * FROM Сделка WHERE Количество>20

Пример 4.3. Операции отпуска товаров объемом больше 20. (html, txt)

Более сложные предикаты могут быть построены с помощью логических операторов AND, OR или NOT, а также скобок, используемых для определения порядка вычисления выражения. Вычисление выражения в условиях выполняется по следующим правилам:

  • Выражение вычисляется слева направо.
  • Первыми вычисляются подвыражения в скобках.
  • Операторы NOT выполняются до выполнения операторов AND и OR.
  • Операторы AND выполняются до выполнения операторов OR.

Для устранения любой возможной неоднозначности рекомендуется использовать скобки.

Пример 4.4. Вывести список товаров, цена которых больше или равна 100 и меньше или равна 150.

SELECT Название, Цена FROM Товар WHERE Цена>=100 And Цена<=150

Пример 4.4. Список товаров, цена которых больше или равна 100 и меньше или равна 150. (html, txt)

Пример 4.5. Вывести список клиентов из Москвы или из Самары.

SELECT Фамилия, ГородКлиента FROM Клиент WHERE ГородКлиента=”Москва” Or ГородКлиента=”Самара”

Пример 4.5. Список клиентов из Москвы или из Самары. (html, txt)

Диапазон

Оператор BETWEEN используется для поиска значения внутри некоторого интервала, определяемого своими минимальным и максимальным значениями. При этом указанные значения включаются в условие поиска.

Пример 4.6. Вывести список товаров, цена которых лежит в диапазоне от 100 до 150 (запрос эквивалентен примеру 4.4).

SELECT Название, Цена FROM Товар WHERE Цена Between 100 And 150

Пример 4.6. Список товаров, цена которых лежит в диапазоне от 100 до 150. (html, txt)

При использовании отрицания NOT BETWEEN требуется, чтобы проверяемое значение лежало вне границ заданного диапазона.

Пример 4.7. Вывести список товаров, цена которых не лежит в диапазоне от 100 до 150."

SELECT Товар.Название, Товар.Цена FROM Товар WHERE Товар.Цена Not Between 100 And 150 Или (что эквивалентно) SELECT Товар.Название, Товар.Цена FROM Товар WHERE (Товар.Цена<100) OR (Товар.Цена>150)

Пример 4.7. Список товаров, цена которых не лежит в диапазоне от 100 до 150. (html, txt)

Принадлежность множеству

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

Пример 4.8. Вывести список клиентов из Москвы или из Самары (запрос эквивалентен примеру 4.5).

SELECT Фамилия, ГородКлиента FROM Клиент WHERE ГородКлиента in (”Москва”, ”Самара”)

Пример 4.8. Список клиентов из Москвы или из Самары (html, txt)

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

Пример 4.9. Вывести список клиентов, проживающих не в Москве и не в Самаре.

SELECT Фамилия, ГородКлиента FROM Клиент WHERE ГородКлиента Not in (”Москва”,”Самара”)

Пример 4.9. Список клиентов, проживающих не в Москве и не в Самаре. (html, txt)

 

Соответствие шаблону

С помощью оператора LIKE можно выполнять сравнение выражения с заданным шаблоном, в котором допускается использование символов-заменителей:

  • Символ % – вместо этого символа может быть подставлено любое количество произвольных символов.
  • Символ _ заменяет один символ строки.
  • [] – вместо символа строки будет подставлен один из возможных символов, указанный в этих ограничителях.
  • [^] – вместо соответствующего символа строки будут подставлены все символы, кроме указанных в ограничителях.

Пример 4.10. Найти клиентов, у которых в номере телефона вторая цифра – 4.

SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон Like ”_4%”

Пример 4.10. Выборка клиентов, у которых в номере телефона вторая цифра – 4. (html, txt)

Пример 4.11. Найти клиентов, у которых в номере телефона вторая цифра – 2 или 4.

SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон Like ”_[24]%”

Пример 4.11. Выборка клиентов, у которых в номере телефона вторая цифра – 2 или 4. (html, txt)

Пример 4.12. Найти клиентов, у которых в номере телефона вторая цифра 2, 3 или 4.

SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон Like ”_[2-4]%”

Пример 4.12. Выборка клиентов, у которых в номере телефона вторая цифра 2, 3 или 4. (html, txt)

Пример 4.13. Найти клиентов, у которых в фамилии встречается слог «ро».

SELECT Клиент.Фамилия FROM Клиент WHERE Клиент.Фамилия Like ”%ро%”

Пример 4.13. Выборка клиентов, у которых в фамилии встречается слог «ро». (html, txt)

Значение NULL

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

Пример 4.14. Найти сотрудников, у которых нет телефона (поле Телефон не содержит никакого значения).

SELECT Фамилия, Телефон FROM Клиент WHERE Телефон Is Null

Пример 4.14. Выборка сотрудников, у которых нет телефона (поле Телефон не содержит никакого значения). (html, txt)

IS NOT NULL используется для проверки присутствия значения в поле.

Пример 4.15. Выборка сотрудников, у которых есть телефон (поле Телефон содержит какое-либо значение).

SELECT Клиент.Фамилия, Клиент.Телефон FROM Клиент WHERE Клиент.Телефон Is Not Null

Пример 4.15. Найти сотрудников, у которых есть телефон (поле Телефон содержит какое-либо значение). (html, txt)

Предложение ORDER BY

В общем случае строки в результирующей таблице SQL-запроса никак не упорядочены. Однако их можно требуемым образом отсортировать, для чего в оператор SELECT помещается фраза ORDER BY, которая сортирует данные выходного набора в заданной последовательности. Сортировка может выполняться по нескольким полям, в этом случае они перечисляются за ключевым словом ORDER BY через запятую. Способ сортировки задается ключевым словом, указываемым в рамках параметра ORDER BY следом за названием поля, по которому выполняется сортировка. По умолчанию реализуется сортировка по возрастанию. Явно она задается ключевым словом ASC. Для выполнения сортировки в обратной последовательности необходимо после имени поля, по которому она выполняется, указать ключевое слово DESC. Фраза ORDER BY позволяет упорядочить выбранные записи в порядке возрастания или убывания значений любого столбца или комбинации столбцов, независимо от того, присутствуют эти столбцы в таблице результата или нет. Фраза ORDER BY всегда должна быть последним элементом в операторе SELECT.

Пример 4.16. Вывести список клиентов в алфавитном порядке.

SELECT Клиент.Фамилия, Клиент.Фирма FROM Клиент ORDER BY Клиент.Фамилия

Пример 4.16. Список клиентов в алфавитном порядке. (html, txt)

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

Пример 4.17. Вывести список фирм и клиентов. Названия фирм упорядочить в алфавитном порядке, имена клиентов в каждой фирме отсортировать в обратном порядке.

SELECT Клиент.Фирма, Клиент.Фамилия FROM Клиент ORDER BY Клиент.Фирма, Клиент.Фамилия DESC

Пример 4.17. Список фирм и клиентов. Названия фирм в алфавитном порядке, имена клиентов в каждой фирме в обратном порядке. (html, txt)

 

5. Лекция: Соединения и теоретико-множественные операции над отношениями

 

Рассматриваются специальные операции над отношениями: выборка, проекция, декартово произведение, соединение. Приводятся различные типы соединений: соединение по эквивалентности, естественное, внешнее соединение, полусоединение. Операции над отношениями иллюстрируются на примерах оператора SELECT. Рассматриваются примеры выбора данных из нескольких таблиц. Приводится объединение результатов нескольких запросов.

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

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

Отношение R
R.a1 R.a2
A  
A  
B  
B  
B  
CREATE TABLE R(a1 CHAR(1), a2 INT, PRIMARY KEY(a1,a2))
Отношение S
S.b1 S.b2
  h
  g
  h
CREATE TABLE S(b1 INT PRIMARY KEY, b2 CHAR(1))

Операции выборки и проекции являются унарными, поскольку они работают с одним отношением.

Операция выборки

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

Операция выборки работает с одним отношением R и определяет результирующее отношение, которое содержит только те кортежи (строки) отношения R, которые удовлетворяют заданному условию F (предикату).

σF(R) или σпредикат(R).

Пример 5.1. Операция выборки в SQL.

Выборка σ(a2=1)(R)={(a, 1), (b, 1)} записывается следующим образом:

SELECT a1, a2FROM RWHERE a2=1

Пример 5.1. Операция выборки в SQL. (html, txt)

Операция проекции

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

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

Πa1, a2,... an(R)

Пример 5.2. Операция проекции в SQL.

Проекция Πb2(S)={(h), (g)) записывается следующим образом:

SELECT b2FROM S

Пример 5.2. Операция проекции в SQL. (html, txt)

К основным операциям над отношениями относится декартово произведение.

Декартово произведение

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

RxS={(a, 1, 1, h), (a, 2, 1, h), (b, 1, 1, h),... }SELECT R.a1, R.a2, S.b1, S.b2FROM R, S

Пример 5.1. Декартово произведение отношений в SQL. (html, txt)

Результат декартова произведения двух отношений показан в таблице.

Таблица 5.1.
R x S
R.a1 R.a2 S.b1 S.b2
a     h
a     g
a     h
a     h
a     g
a     h
b     h
b     g
b     h
b     h
b     g
b     h
b     h
b     g
b     h

Если одно отношение имеет N записей и K полей, а другое M записей и L полей, то отношение с их декартовым произведением будет содержать NxM записей и K+L полей. Исходные отношения могут содержать поля с одинаковыми именами, тогда имена полей будут содержать названия таблиц в виде префиксов для обеспечения уникальности имен полей в отношении, полученном как результат выполнения декартова произведения.

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

Операция соединения по двум отношениям (таблицам)

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

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

Формат операции:

FROM имя_таблицы_1 {INNER | LEFT | RIGHT} JOIN имя_таблицы_2 ON условие_соединения

Существуют различные типы операций соединения:

  • тета-соединение R FS;
  • соединение по эквивалентности R =S;
  • естественное соединение R S;
  • внешнее соединение R S; R S;
  • полусоединение R FS.

Операция тета-соединения

Операция тета-соединения R FS определяет отношение, которое содержит кортежи из декартова произведения отношений R и S, удовлетворяющие предикату F. Предикат F имеет вид R.ai Θ S.bj, где вместо Θ может быть указан один из операторов сравнения (>, >=, <, <=, =, <>).

Если предикат F содержит только оператор равенства (=), то соединение называется соединением по эквивалентности.

Таблица 5.2.
R FS, F=(R.a2=S.b1)
R.a1 R.a2 S.b1 S.b2
a     h
a     g
b     h
b     h

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

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

Блоки данных из двух таблиц объединяются, как только в указанных полях будут найдены совпадающие значения.

Если в предложении FROM перечислено несколько таблиц и при этом не употребляется спецификация JOIN, а для указания соответствия полей из таблиц используется условие в предложении WHERE, то некоторые реляционные СУБД (например, Access) оптимизируют выполнение запроса, интерпретируя его как соединение.

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

SELECT R.a1, R.a2, S.b1, S.b2FROM R, SWHERE R.a2=S.b1 или SELECT R.a1, R.a2, S.b1, S.b2FROM R INNER JOIN S ON R.a2=S.b1

Пример 5.2. Тета-соединение отношений в SQL. (html, txt)

Естественное соединение

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

Таблица 5.3.
R S, F=(R.a2=S.b1)
R.a1 R.a2 или S.b1 S.b2
a   h
a   g
b   h
b   h
SELECT R.a1, R.a2, S.b2FROM R, SWHERE R.a2=S.b1 или SELECT R.a1, S.b1, S.b2FROM R INNER JOIN S ON R.a2=S.b1

Пример 5.3. Естественное соединение отношений в SQL. (html, txt)

Пример 5.4. Вывести информацию о проданных товарах.

SELECT *FROM Сделка, ТоварWHERE Сделка.КодТовара=Товар.КодТовара Или (что эквивалентно) SELECT *FROM Товар INNER JOIN Сделка ON Товар.КодТовара=Сделка.КодТовар

Пример 5.4. Выборка информации о проданных товарах. (html, txt)

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

Пример 5.5. Получить сведения о товарах, дате сделок, количестве проданного товара и покупателях.

SELECT Товар.Название, Сделка.Количество, Сделка. Дата, Клиент.ФирмаFROM Клиент INNER JOIN (Товар INNER JOIN СделкаON Товар.КодТовара=Сделка.КодТовара) ON Клиент.КодКлиента=Сделка.КодКлиента

Пример 5.5. Выборка сведений о товарах, дате сделок, количестве проданного товара и покупателях. (html, txt)

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

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

SELECT Т.Название, С.Количество, С.Дата, К.ФирмаFROM Клиент AS К INNER JOIN (Товар AS Т INNER JOIN Сделка AS С ON Т.КодТовара=С.КодТовара) ON К.КодКлиента=С.КодКлиента;

Пример 5.6. Выборка сведений о товарах, дате сделок, количестве проданного товара и покупателях с использованием псевдонима. (html, txt)

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

Какая из таблиц будет ведущей, определяет вид соединения. LEFT - левое внешнее соединение, ведущей является таблица, расположенная слева от вида соединения; RIGHT - правое внешнее соединение, ведущая таблица расположена справа от вида соединения.

Левое внешнее соединение

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

Таблица 5.4.
R S, F=(R.a2=S.b1)
R.a1 R.a2 S.b1 S.b2
a     h
a     g
b     h
b     h
b   null null
SELECT R.a1, R.a2, S.b1, S.b2FROM R LEFT JOIN S ON R.a2=S.b1

Пример 5.7. Левое внешнее соединение отношений в SQL. (html, txt)

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

SELECT R.a1, R.a2, S.b1, S.b2FROM R RIGHT JOIN S ON R.a2=S.b1

Пример 5.8. Правое внешнее соединение отношений в SQL. (html, txt)

Пример 5.9. Вывести информацию о всех товарах. Для проданных товаров будет указана дата сделки и количество. Для непроданных эти поля останутся пустыми.

SELECT Товар.*, Сделка.*FROM Товар LEFT JOIN Сделка ON Товар.КодТовара=Сделка.КодТо
Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...