Внутреннее (естественное) соединение таблиц

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

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

а) выборка из декартового произведения

Начнем с примеров. Пусть требуется вывести фамилии всех студентов и их оценки. Текст запроса будет выглядеть так:


select students.name_st, marks.mark

from students, marks

where students.cod_st=marks.cod_st

б) операция соединения [inner] join

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


select students .name_st, marks.mark

from students join marks

on students.cod_st=marks.cod_st

 

Результаты запросов (а, б) будут абсолютно аналогичны и могут выглядеть примерно так:

name_st mark
Иванов Иванов … Петров Петров Петров…  

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

Обратим внимание на некоторые особенности приведенных выше примеров.

Во-первых, в тексте запросов используются составные имена столбцов, записанные с использованием точечной нотации:

имя_таблицы.имя_столбца

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

Во-вторых, в обоих приведенных выше запросах явно задано условие соединения в виде равенства столбцов связи (students.cod_st=marks.cod_st). Казалось бы, можно сократить текст запроса, ведь в таблицах students и marks только один общий столбец cod_st. Однако соединение двух таблиц вовсе не обязательно должно выполняться только по первичному и внешнему ключу. Любые два столбца, совпадающие по типу, могут быть использованы в условии соединения таблиц.

Разумеется, связывать строки, используя неключевые столбцы для связи, нужно с предельной осторожностью. Допустим, запрос, в котором устанавливается связь с помощью условия students.cod_st=marks.cod_sub, будет синтаксически правильным (он даже исполнится и возвратит результаты), но абсолютно бессмысленным. Будьте предельно внимательны при записи условий соединения!








Дата добавления: 2015-08-26; просмотров: 1445;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.