Удивительно, но "отношение" в "реляционных" базах данных не ссылается на отношение внешнего ключа одной таблицы к другой. «Отношение - это структура данных, которая состоит из заголовка и неупорядоченного набора кортежей, имеющих один и тот же тип», согласно Википедии о «Отношение (база данных)» .
В СУБД SQL (таких как MS SQL Server и Oracle) таблицы представляют собой хранимые отношения, где имена столбцов, определенные в словаре данных, образуют «заголовок», а строки - «кортежи» отношения.
Тогда из таблицы запрос может вернуть другое отношение:
create table t (x number primary key, y number not null);
Table created.
SQL> insert into t values (1, 10);
1 row created.
SQL> insert into t values (2, 20);
1 row created.
SQL> select x from t;
X
----------
1
2
select x from t
вернул отношение с меньшим количеством столбцов, кортежей с меньшим количеством элементов, чем у базовой таблицы. И select x, y from t where x = 1
вернет отношение с меньшим количеством кортежей, чем базовая таблица:
SQL> select x, y from t where x = 1;
X Y
---------- ----------
1 10
Пример использования внутреннего соединения:
SQL> create table s (x number primary key, words varchar2(100) not null);
Table created.
SQL> insert into s values (1, 'Hello World!');
1 row created.
SQL> insert into s values (3, 'Will not show');
1 row created.
SQL> select t.x, t.y, s.words
2 from t
3 inner join s
4 on t.x = s.x;
X Y WORDS
---------- ---------- ---------------
1 10 Hello World!
Концептуально, t inner join s on t.x = s.x
проходит следующие шаги:
Возьмите декартово произведение s
и t
, то есть каждый ряд s
и объедините его с каждым рядом t
, в результате чего получится кортеж с размером s * размер t кортежей или строк, каждый со всеми столбцами из s
и t
очень похож на результаты:
SQL> select * from s, t;
X WORDS X Y
3 Will not show 1 10
3 Will not show 2 20
1 Hello World! 1 10
1 Hello World! 2 20
(или select * from s cross join t
в синтаксисе SQL-92) Из декартового произведения, содержащего четыре кортежа / строки с четырьмя столбцами on s.x = t.x
обрезает кортежи до одного, все еще с четырьмя столбцами:
SQL> select *
2 from t
3 inner join s
4 on t.x = s.x;
X Y X WORDS
---------- ---------- ---------- ---------------
1 10 1 Hello World!
И select t.x, t.y, s.words
сбрасывает один столбец отношения.
Обратите внимание , что вышеизложенное описывает концептуальную или логическую модель происходящего. Базы данных поставляются с оптимизаторами запросов, которые предназначены для выдачи результатов, как если бы были выполнены все логические шаги, но позволяют пропустить шаги при физической реализации работы и использовать поддерживающие физические структуры, такие как индексы, которые не являются частью реляционной модели.
Представления - это определения отношений, которые не хранят отношения, но определяют отношения, основанные на других отношениях, в конечном итоге с таблицами внизу. (За исключением материализованных представлений, которые предварительно вычисляют и сохраняют отношения, основанные на других отношениях.)