КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Выборка из нескольких таблиц.
FROM Список_имен_базовых таблиц
список имен таблиц, "опрашиваемых" данной выборкой, вида
Имя_таблицы1 [Локальный алиас1],…, Имя_таблицыn [Локальный алиасn]
Либо
Имя_таблицы [Локальный алиас] [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN * Имя_таблицы [Локальный алиас] [ON Условие_связи]
Первый вариант синтаксиса выборки из нескольких базовых таблиц означает (с точки зрения логики, но не реализации исполнения) выборку из их именованного декартова произведения т.е. выборку всевозможных комбинаций строк базовых таблиц.
Такая полная выборка редко бывает необходимой, поэтому ее ограничивают наложением дополнительных условий (отношений, связей, объединения) на пары базовых таблиц. Ясно, что на практике чаще всего используются равенства первичного и внешнего ключей. В стандартном SQL связи реализуются с помощью опций WHERE.
Так, выборка Select * from T1,T2 where B(r1,r2) выбирает связанные отношением (заданным предикатом B(r1,r2)) записи r1, r2. Расширенный синтаксис предлагает более непосредственное указание (и, по всей видимости, более оптимальную реализацию) такого произведения по условию – или, в терминах СУБД, соединения (JOIN) таблиц. Различают несколько вариантов такого соединения.
Внутреннее соединение (INNER JOIN) предполагает отбор из обеих таблиц только записей, удовлетворяющих соответствующему условию связи; кроме того, в левое внешнее соединение (LEFT [OUTER] JOIN) отбираются дополнительно все те строки из таблицы, стоящей слева от слова JOIN, в правое внешнее соединение (RIGHT [OUTER] JOIN) - все те строки из таблицы, стоящей справа от слова JOIN, и в полное внешнее соединение (FULL [OUTER] JOIN) - все те строки обеих таблиц, для которых соответствия в другой таблице не существует.
Более формально, Т1 INNER JOIN T2 ON B(r1,r2) » {r1+r2 : r2Î T1 & r2Î T2 & B(r1,r2)} Т1 LEFT JOIN T2 ON B(r1,r2) » Т1 INNER JOIN T2 ON B(r1,r2) È {r1+NULL(T2) : not $ r2Î T2 B(r1,r2)} здесь NULL(T2) – “пустая” или “фиктивная” запись таблицы Т2, т.е. функция, принимающая значение NULL на всех именах полей из T2. Т1 RIGHT JOIN T2 ON B(r1,r2) » Т1 INNER JOIN T2 ON B(r1,r2) È {NULL(T1)+r2 : not $ r1Î T1 B(r1,r2)} Т1 FULL JOIN T2 ON B(r1,r2) » Т1 INNER JOIN T2 ON B(r1,r2) È {NULL(T1)+r2 : not $ r1Î T1 B(r1,r2)} È {r1+NULL(T2) : not $ r2Î T2 B(r1,r2)}
|