Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Общие свойства конструкции inner JOIN и конструкции whereСодержание книги
Поиск на нашем сайте
До сих пор при описании особенностей конструкции INNER JOIN фактически затрагивались только те концепции, которые применимы к соединениям любых других типов, поскольку принципы определения порядка расположения столбцов в результирующем наборе и применения псевдонимов являются полностью одинаковыми для конструкций JOIN любых типов. А то, в чем конструкция INNER JOIN отличается от конструкций JOIN других типов осталось не рассмотренным. Отметим, что ее помощью можно создавать исключительное соединение, т.е. соединение, в котором исключены все строки, не имеющие определенного значения в обеих таблицах (в левой таблице, как называют таблицу, указанную в первую очередь, и в правой таблице, заданной во вторую очередь). Рассмотрим несколько примеров того, как проявляется это свойство. Допустим, что имеется таблица Departments, в которой собраны все данные о департаментах компании. Но наличие большого списка департаментов отнюдь не означает, что на текущий момент в компании были увольнения во всех департаментах. Фактически можно смело предположить, что в текущий момент имеются такие департаменты, в которых не было увольнений. Например, требуется выполнить запрос, позволяющий отобрать информацию обо всех департаментах, в которых были увольнения. Пример 3. SELECT DISTINCT d.department_id, d.department_name FROM departments d inner join job_history j on d.department_id=j.department_id
Рисунок №51 – Результат выборки из примера №3.
Обратите внимание на то, что в запросе используется ключевое слово DISTINCT, поскольку достаточно знать только количество департаментов, имевших уволенных сотрудников (причем достаточно только одного упоминания каждого департамента), а не количество увольнений. Если бы в этом запросе отсутствовало ключевое слово DISTINCT, то была бы возвращена отдельная строка, относящаяся к каждому департаменту для каждой строки из таблицы Jobs_History, в которой имеется информация об увольнениях в департаментах. Теперь попытаемся получить информацию об общем количестве заказчиков и для этого вызовем на выполнение следующий простой запрос с агрегирующей функцией COUNT:
Пример 4. SELECT COUNT (*) AS "No. Of Records" FROM departments
Рисунок №52 – Результат выборки из примера №4
Применение конструкции INNER JOIN приводит к исключению строк в связи с тем, что не обнаруживаются соответствующие им строки в другой таблице, а использование конструкции WHERE приводит к исключению строк из возвращаемого набора, поскольку эти строки не соответствуют сданным критериям. Рассмотрим еще один пример – база данных имеет таблицы departments, Jobs и Employees (таблица 11).
Таблица 11 - Столбцы таблиц departments, Jobs и Employees.
На этот раз нам предстоит задача составить запрос, который возвращает названия департаментов, входящих в компанию, и названия должностей, в компании. Прежде всего необходимо точно выяснить, какие данные должны быть получены из базы данных. В рассматриваемом задании речь идет о том, что должны быть возвращены два различных фрагмента информации — названия департаментов и названия должностей. Теперь необходимо приступить к соединению двух указанных таблиц. Но для ИТОГО требуется найти столбец, по которому должно быть выполнено соединение. В связи с этим в ходе решения данной задачи возникает первая проблема - обнаруживается, что такой столбец отсутствует. Оказывается, что в этих двух таблицах нет общих столбцов, на которых можно было бы сформировать соединение с помощью конструкции JOIN. Теперь становится ясно, для чего нужна третья из таблиц, приведенных в таблице 6. Иногда соединения могут быть сформированы только с помощью такой таблицы, как employees, которая позволяет проложить связь между двумя другими таблицами. Для обозначения подобных таблиц, обеспечивающих возможность связать две другие таблицы, применяются разные термины, но чаще всего приходилось встречаться с терминами связующая таблица, или таблица ассоциации. Связующей таблицей (иногда называемой также таблицей ассоциации, или таблицей слияния) называют любую таблицу, основным назначением которой является не хранение собственных данных, а создание связей между данными, хранимыми в других таблицах. Такие таблицы можно рассматривать как средства "обеспечения взаимодействие", или "создания связей" между двумя или несколькими таблицами. В частности, связующие таблицы позволяют найти выход в такой часто складывающейся ситуации, когда имеет место так называемая связь "многие ко многим" между таблицами. В такой ситуации две таблицы содержат связанные друг с другом данные, причем и в той и в другой таблице может находиться большое количество строк, которые согласуются со многими строками в другой таблице. СУБД SQL Server не позволяет непосредственно реализовывать подобные связи, поэтому применяются связующие таблицы, позволяющие разделить связь "многие ко многим" на две связи "один ко многим", а последние поддерживаются СУБД SQL Server. Данная конкретная таблица, employees, не отвечает всем критериям определения связующей таблицы в самом строгом смысле этого термина, но все же соответствует общему назначению связующих таблиц, поэтому рассматривается именно как таковая. Применение указанной третьей таблицы, employees, позволяет косвенно соединить таблицы departments и jobs, формируя соединения между каждой из этих таблиц и связующей таблицей. Соединение между таблицами departments и employees формируется на основе столбца department_id, a соединение между таблицами jobs и employees — на основе столбца job_id. Введение указанной третьей таблицы в конструкции JOIN не составляет труда, этого достаточно снова указать в конструкции FROM таблицу, в которой находится требуемая информация, и задать ключевые слова JOIN.
Пример 5: SELECT distinct d.department_name, j.job_title FROM departments d join employees e on d.department_id = e.department_id join jobs j on e.job_id = j.job_id
Рисунок №53 - Результат выборки из примера №5.
Обратите внимание на то, что таблицам присвоены псевдонимы, поэтому необходимо вернуться в начало оператора и внести изменения в конструкцию SELECT с учетом использования псевдонимов, но на этом составление оператора SELECT с соединением трех таблиц заканчивается.
КОНСТРУКЦИИ OUTER JOIN Применение конструкции JOIN такого типа, как OUTER JOIN, скорее можно считать исключением, а не правилом: Чаще всего при выборке данных с использованием оператора соединения необходимо обеспечить, чтобы данные соответствовали всем заданным критериям, а этого позволяет добиться только конструкция INNER JOIN. - Многие разработчики, использующие язык SQL, осваивают лишь внутреннее соединение, осуществляемое с помощью конструкции INNER JOIN, но так и не заходят глубже; иными словами, многие разработчики просто не умеют пользоваться разновидностью оператора соединения с конструкцией OUTER. - Цели, которые позволяет достичь применение конструкции OUTER JOIN, часто достижимы с помощью других методов. - Разработчики зачастую просто забывают о том, что может использоваться подобная конструкция. При использовании конструкции INNER JOIN исключаются все строки, не соответствующие всем заданным критериям, а при использовании конструкции OUTER существует возможность включить в результирующий набор строки, которые соответствуют хотя бы одному из заданных критериев.
Простой вариант оператора с конструкцией OUTER JOIN Задача освоения первого варианта синтаксиса является несложной, и большинство разработчиков с ней успешно справляются: SELECT * FROM имя_таблицы1 LEFT|RIGHT OUTER JOIN имя_таблицы2 ON имя_тоблицы1. столбец1 = имя_таблицы2.столбец2
Следует отметить, что ключевое слово OUTER является необязательным, достаточно лишь включить ключевое слово LEFT или RIGHT (например, LEFT JOIN). Таблица, имя которой упоминается перед ключевым словом JOIN, рассматривается как левая таблица, LEFT, а таблица, имя которой следует за ключевым словом JOIN, — как правая таблица, RIGHT. Как уже было сказано, применение операторов с конструкцией OUTER JOIN приводит к получению не только тех данных, которые соответствуют всем критериям, но и данных, соответствующих лишь некоторым критериям, а то, какие именно строки, соответствующие лишь некоторым критериям, будут включены в результирующий набор, зависит от выбора той или иной стороны соединения. При использовании конструкции LEFT OUTER JOIN включается вся информация из таблицы, указанной слева ОТ ключевого слова JOIN, а при использовании конструкции RIGHT OUTER JOIN— вся информация из таблицы, указанной справа от этого ключевого слова. Рассмотрим практические примеры применения запросов с левым и правым внешним соединениями, позволяющие лучше понять сказанное.
Предположим, что необходимо узнать, из каких департаментов состоит фирма, имеются ли уволенные, идентификационный номер сотрудника и занимаемой им должности. В базе данных находятся таблицы departments и job_history, которые определены следующим образом:
Эти таблицы имеют общий столбец, department_id, поэтому можно попытаться непосредственно выполнить их соединение. Оператор, составленный с применением обычной конструкции INNER JOIN, должен выглядеть примерно таким образом:
Пример 6: SELECT d.department_id, department_name, job_id, employee_id FROM departments d inner join job_history jh ON (d.department_id = jh.department_id)
Рисунок №54 - Результат выборки из примера №6.
Однако наше задание отнюдь нельзя назвать выполненным. Нам требовались результаты, в которых содержалась бы информация обо всех департаментах, а не только о тех, в которых были увольнения. Тем не менее выполнение данного запроса привело к получению только данных о департаментах компании, в которых были увольнения, а ответ на заданный вопрос не получен. В действительности требуется такая конструкция, которая позволяет получить сведения обо всех департаментах. Для получения сведений о каждом департаменте, достаточно только изменить тип конструкции JOIN в запросе следующим образом: Пример 7: SELECT d.department_id, department_name, job_id, employee_id FROM departments d LEFT OUTER JOIN job_history jh ON (d.department_id = jh.department_id)
Рисунок №55 - Результат выборки из примера №7.
Теперь рассмотрим, что произойдет после перехода к применению соединения типа RIGHT OUTER JOIN
Пример 8: SELECT d.department_id, department_name, job_id, employee_id FROM departments d RIGHT OUTER JOIN job_history jh ON (d.department_id = jh.department_id)
Рисунок №56 - Результат выборки из примера №8.
Даже несмотря на то, что эта модификация на первый взгляд кажется весьма незначительной, фактически она приводит к резкому изменению состава результирующего набора. Если теперь оператор SELECT * будет выполнен применительно к таблице departments, то обнаружится, что в состав результатов запроса включены все строки из таблицы job_history, причем при наличии соответствующей строки в таблице departments отображается относящаяся к этой строке информация о должности. А во всех остальных случаях столбцы, взятые из таблицы таблице job_history, заполняются NULL-значениями. Итак, если допустить, что таблица departments всегда будет упоминаться в запросе в первую очередь, а таблица таблице job_history — во вторую, то, чтобы получить информацию обо всех департаментах, нужно использовать конструкцию LEFT JOIN, а для ознакомления с информацией обо всех увольнениях - конструкцию RIGHT JOIN.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2017-02-09; просмотров: 462; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.23.103.203 (0.01 с.) |