Навигация по лекциям
1
Лекция 1. Введение в проектирование баз данных
2
Лекция 2. Компетенции специалистов БД. Нормализация реляционных таблиц (отношений). Группы операторов SQL.
3
Лекция 3. Внешние и внутренние соединения таблиц БД.
Презентации:
03_проектирование баз данных. ч.1_лекция 3_новая.pdf
4
Лекция 4. Type I, Type II. Пользовательские представления
5
Лекция 5. Бизнес-правила
6
Лекция 6. Правила физического именования объектов и сопоставления связей
7
Лекция 7. Отслеживание изменения данных
8
Лекция 8. Язык управления транзакциями

Лекция 3. Внешние и внутренние соединения таблиц БД.

**1-ый учебный вопрос: Реляционная алгебра и общая интерпретация реляционных операций.** Реляционная алгебра - замкнутая система операций над отношениями в реляционной модели данных. Операции реляционной алгебры также называют реляционными операциями. В своей классической интерпретации, реляционная алгебра Кодда состоит из 8-ми основных операций, поделенных на две группы. В состав теоретико-множественных операций входят операции: - объединения отношений; - пересечения отношений; - взятия разности отношений; - взятия декартова произведения отношений. Специальные реляционные операции включают: - ограничение отношения; - проекцию отношения; - соединение отношений; - деление отношений. Кроме того, в состав алгебры включается операция присваивания, позволяющая сохранить в базе данных результаты вычисления алгебраических выражений, и операция переименования атрибутов, дающая возможность корректно сформировать заголовок (схему) результирующего отношения. При выполнении операции объединения (UNION) двух отношений произво¬дится отношение, включающее все кортежи, входящие хотя бы в одно из отношений-операндов. Операция пересечения (INTERSECT) двух отношений производит отношение, включающее все кортежи, входящие в оба отношения-операнда. Отношение, являющееся разностью (MINUS) двух отношений, включает все кортежи, входящие в отношение-первый операнд, такие, что ни один из них не входит в отношение, являющееся вторым операндом. При выполнении декартова произведения (TIМES) двух отношений производится отношение, кортежи которого являются конкатенацией (сцеплением) кортежей первого и второго операндов. Результатом ограничения (WHERE) отношения по некоторому условию яв¬ляется отношение, включающее кортежи отношения-операнда, удовлетворяющее этому условию. При выполнении проекции (PROJECT) отношения на заданное подмножество множества его атрибутов производится отношение, кортежи которого производятся путем взятия соответствующих значений из кортежей отношения-операнда. При соединении (JOIN) двух отношений по некоторому условию образуется результирующее отношение, кортежи которого являются конкатенацией кортежей первого и второго отношений и удовлетворяют этому условию. У операции реляционного деления (DIVIDE BY) два операнда - бинарное и унарное отношения. Результирующее отношение состоит из унарных кортежей, включающих значения первого атрибута кортежей первого операнда таких, что множество значений второго атрибута (при фиксированном значении первого атрибута) включает множество значений второго операнда. Операция переименования (RENAME) производит отношение, тело которого совпадает с телом операнда, но имена атрибутов могут быть изменены. Операция присваивания (:=) позволяет сохранить результат вычисления реляционного выражения в существующем отношении БД. Поскольку результатом любой реляционной операции (кроме операции присваивания) является некоторое отношение, можно образовывать реляционные выражения, в которых вместо отношения-операнда некоторой реляционной операции находится вложенное реляционное выражение. При построении реляционного выражения могут участвовать все реляционные операции, кроме операции присваивания. Вычислительная интерпретация реляционного выражения диктуется установленными приоритетами операций: RENAME > WHERE = PROJECT >= TIMES = JOIN = INTERSECT = DIVIDE BY >= UNION = MINUS **2-ый учебный вопрос: Операция соединения в реляционной алгебре. Описание оператора SQL “JOIN”.** Операция соединения, предназначена для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. Отличительными особенностями операции соединения являются следующее: - в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов; - каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда. Определение того, какие именно исходные строки войдут в результат и в каких сочетаниях, зависит от типа операции соединения и от явно заданного условия соединения. При необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно). Операция соединения выполняется при помощи оператора языка SQL JOIN. JOIN – оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Входит в раздел FROM операторов SQL SELECT, UPDATE и DELETE. Разберем описание команды, включающей в себя оператор JOIN. 1-ая строка: осуществляется выбор первого столбца для будущего соединения. 2-ая строка: осуществляется выбор первой таблицы соединения. 3-4-ые строки: осуществляется выбор типа соединения. 5-ая строка: осуществляется приглашение к соединению. 6-ая строка: осуществляется выбор второй таблицы соединения. 7-ая строка: условие и предикат соединения. **3-ий учебный вопрос: Типы соединений (на примере соединений, реализуемых в СУБД MS SQL Server).** Выделяют пять основных типов соединений таблиц. Для их демонстрации, предположим существование в базе данных двух таблиц следующего содержания (рис. 1) ![Рисунок 1. Таблицы, используемые при соединении.](/uploads/msu_image/image/23/1.jpg) 1. Внутреннее соединение - Inner join (IJ) Внутреннее соединение находит пары строк, которые соединяются и удовлетворяют предикату соединения. Для рис. 1 предположим, что некоторый запрос по скрипту inner join для некоторых таблиц использует предикат cоединения "S.Cust_Id = C.Cust_Id", позволяющий найти все продажи и сведения о клиенте с одинаковыми значениями Cust_Id (рис. 2). ![Рисунок 2. Результат выполнения внутреннего соединения.](/uploads/msu_image/image/24/2.jpg) Ряд комментариев к приведенному на рис. 1 и рис. 2 примеру. а) Cust_Id = 3 купил два наименования, поэтому он фигурирует в двух строках результирующего набора; б) Cust_Id = 1 не купил ничего и потому не появляется в результате; в) для Cust_Id = 4 тоже был продан товар, но поскольку в таблице нет такого клиента, сведения о такой продаже не появились в результате; г) если Customers – это А, а Sales – это B, то справедливо правило: "A inner join B" и "B inner join A" эквивалентны. 2. Внешнее соединение - Outer join (OJ) Соединение двух таблиц, в результат которого в обязательном порядке входят строки либо одной, либо обеих таблиц. Бывает левое внешнее соединение, правое внешнее соединение или же полное внешнее соединение. Покажем на примере из рис. 1 как работает левое внешнее соединение (left outer join), рис. 3. ![Рисунок 3. Результат выполнения левого внешнего соединения.](/uploads/msu_image/image/25/3.jpg) В данном случае, сервер базы данных возвращает вместо данных о клиенте значение NULL, поскольку для проданного товара Printer нет соответствующей записи клиента. Покажем на примере из рис. 1 как работает полное внешнее соединение (full outer join), рис. 4. ![Рисунок 4. Результат выполнения полного внешнего соединения.](/uploads/msu_image/image/26/4.jpg) При проектирования результатов внешнего соединения разумно пользоваться следующей таблицей для общих случаев (табл. 1). Таблица 1. Результаты трех видов внешних соединений. ![Результаты трех видов внешних соединений.](/uploads/msu_image/image/27/5.jpg) 3. Перекрестное соединение - Cross join (CJ) Перекрестное соединение выполняет полное декартово произведение двух таблиц. То есть это соответствие каждой строки одной таблицы - каждой строке другой таблицы. Для перекрестного соединения нельзя определить предикат, используя для этого предложение ON. Покажем на примере из рис. 1 как работает перекрестное соединение (cross join), рис. 5. ![Рисунок 5. Результат выполнения перекрестного соединения.](/uploads/msu_image/image/28/6.jpg) Перекрестные соединения используются довольно редко. Никогда не стоит пересекать две большие таблицы, поскольку это задействует очень дорогие операции и получится очень большой по объему результирующий набор. 4. Полусоединение - Semi-join (SJ) и анти-полусоединение - Anti-semi-join (ASJ). Полусоединение возвращает строки только одной из соединяемых таблиц, без выполнения соединения полностью. Анти-полусоединение возвращает те строки таблицы, которые не годятся для соединения с другой таблицей; т.е. они в обычном внешнем соединении выдавали бы значение NULL. Чаще всего полусоединение используется в плане подзапроса с оператором EXISTS. Существуют левые и правые полусоединения. Левое полусоединение возвращает строки левой (первой) таблицы, которые соответствуют строкам из правой (второй) таблицы, в то время как правое полусоединение возвращает строки из правой таблицы, которые соответствуют строкам из левой таблицы. Подобным образом может использоваться анти-полусоединение для обработки подзапроса с NOT EXISTS. Покажем на примере из рис. 1 как работает полусоединение (semi-join), рис. 6. ![Рисунок 6. Результат выполнения полусоединения.](/uploads/msu_image/image/29/7.jpg)