Выполнение соединений
Соединение является подмножеством более общей комбинации данных двух таблиц, называемой декартовым произведением (см. раздел 4.1.2). Декартово произведение двух таблиц представляет собой другую таблицу, состоящую из всех возможных пар строк, входящих в состав обеих таблиц. Набор столбцов результирующей таблицы представляет собой все столбцы первой таблицы, за которыми следуют все столбцы второй таблицы. Если ввести запрос к двум таблицам без задания конструкции WHERE, результат выполнения запроса в среде SQL будет представлять собой декартово произведение этих таблиц. Кроме того, стандарт ISO предусматривает специальный формат оператора SELECT, позволяющий вычислить декартово произведение двух таблиц: -."SELECT [DISTINCT. | ALL] {* j columnList] FROM tableNamel CROSS JOIN СаЫеУлте2 Еще раз рассмотрим пример 5.24, в котором соединение таблиц client и Viewing выполняется с использованием общего столбца clientNo, При работе с таблицами, содержимое которых приведено в табл. 3.6 и 3.8, декартово произведение этих таблиц будет включать 20 строк (4 строки таблицы Client x 5 строк таблицы viewing = 20 строк). Это эквивалентно выдаче используемого в примере 5.24 запроса, но без применения конструкции WHERE. Процедура генерации таблицы, содержащей результаты соединения двух таблиц с помощью оператора SELECT, состоит в следующем. 1. Формируется декартово произведение таблиц, указанных в конструкции FROM. 2. Если в запросе присутствует конструкция WHERE, применение условий поиска к каждой строке таблицы декартова произведения и сохранение в таблице только тех строк, которые удовлетворяют заданным условиям. В терминах реляционной алгебры эта операция называется ограничением декартового произведения.
3. Для каждой оставшейся строки определяется значение каждого элемента, указанного в списке выборки SELECT, в результате чего формируется отlельная строка результирующей таблицы. 4. Если в исходном запросе присутствует конструкция SELECT DISTINCT, из результирующей таблицы удаляются все строки-дубликаты. В реляционной алгебре действия, выполняемые на 3 и 4 этапах, эквивалентны операции проекции по столбцам, заданным в списке выборки SELECT. 5. Если выполняемый запрос содержит конструкцию ORDER BY, осуществляется переупорядочивание строк результирующей таблицы. Внешние соединения При выполнении операции соединения данные из двух таблиц комбинируются с образованием пар связанных строк, в которых значения сопоставляемых столбцов являются одинаковыми. Если одно из значений в сопоставляемом столбце одной таблицы не совпадает ни с одним из значений в сопоставляемом столбце другой таблицы, то соответствующая строка удаляется из результирующей таблицы. Именно это правило применялось во всех рассмотренных выше примерах соединения таблиц. Стандартом ISO предусмотрен и другой набор операторов соединений, называемых внешними соединениями (см. раздел 4.1.3). Во внешнем соединении в результирующую таблицу помещаются также строки, не удовлетворяющие условию соединения. Чтобы понять особенности выполнения операций внешнего соединения, воспользуемся упрощенными таблицами Branch и PropertyForRent, содержимое которых представлено в табл. 5.31 и 5.32. Таблица 5.31. Таблица Branch"! Таблица 5.32. Таблица PropertyForRentl Обычное (внутреннее) соединение этих таблиц выполняется с помощью следующего оператора SQL: SELECT b.*, p.* FROM Branchl b, PropertyForRentl p WHERE b.bCity = p.pCity; Результаты выполнения этого запроса представлены в табл. 5.33. Таблица 5.33. Результат внутреннего соединения упрощенных таблиц
Как можно видеть, в результирующей таблице запроса имеются только две строки, содержащие одинаковые названия городов, выбранные из обеих таблиц.
Обратите внимание, что в исходных данных нет соответствия для отделения компании в Глазго и для объекта, сдаваемого в аренду в городе Абердин. Если в результирующую таблицу потребуется включить и эти не имеющие соответствия строки, то следует использовать внешнее соединение. Существуют три типа внешнего соединения: левое, правое и полное. Рассмотрим особенности каждого из них на приведенных ниже примерах. Пример 5.28. Левое внешнее соединение Перечислите отделения компании и сдаваемые в аренду объекты, которые расположены в одном и том же городе, а также прочие отделения компании, не удовлетворяющие условию запроса. Используем левое внешнее соединение этих двух таблиц, которое выглядит следующим образом: SELECT Ь.*, р.* FROM Branchl b LEFT JOIN PropertyForRentl p ON b.bCity = p.pCity; Результаты выполнения этого запроса представлены в табл. 5.34. В этом примере за счет применения левого внешнего соединения в результирующую таблицу попали не только две строки, в которых имеется соответствие между названиями городов, но также та строка первой из соединяемых таблиц (левой), которая не нашла себе соответствия во второй таблице (правой). В этой строке все поля второй таблицы заполнены значениями NULL. Таблица 5.34. Результат выполнения запроса из примера 5.28 Пример 5.29. Правое внешнее соединение Перечислите отделения компании и сдаваемые в аренду объекты, которые расположены в одном и том же городе, а также все остальные объекты собственности, не удовлетворяющие условию запроса. Используем правое внешнее соединение этих двух таблиц, которое выглядит следующим образом: SELECT b. *, p.* FROM Branchl b RIGHT JOIN PropertyForRentl p ON b.bCity = p.pCity; Результаты выполнения этого запроса представлены в табл. 5.35. В этом примере при выполнении правого внешнего соединения в результирующую таблицу были включены не только те две строки, которые имеют одинаковые значения в сопоставляемых столбцах с названием города, но также и те строки из второй (правой) таблицы, которые не нашли соответствия со строками в первой (левой) таблице. В этой строке все поля из первой таблицы получили значения NULL. Таблица 5.35. Результат выполнения запроса из примера 5.29
Пример 5.30. Полное внешнее} соединение Перечислите отделения компании и сдаваемые в аренду объекты, расположенные в одном и том же городе, а также все остальные отделения и объекты собственности, не удовлетворяющие условию запроса. Используем полное внешнее соединение этих таблиц, которое выглядит следующим образом: SELECT Ь.*(р.* FROM Branchl b FULL JOIN PropertyForRent p ON b.bCity = p.pCity; Результаты выполнения этого запроса представлены в табл. 5.36. В случае полного внешнего соединения в результирующую таблицу помещаются не только те две строки, которые имеют одинаковые значения в сопоставляемых столбцах с названием города, но и все остальные строки исходных таблиц, не нашедшие себе соответствия. В этих строках все столбцы той таблицы, в которой не было найдено соответствия, заполняются значениями NULL. Таблица 5.36. Результат выполнения запроса из примера 5.30
Читайте также: Hепpавильное выполнение мантpы Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|