История развития баз данных. Основные понятия и определения. Архитектура базы данных. Физическая и логическая независимость, страница 14

2. Соединение таблиц

До сих пор мы рассматривали запросы, которые базировались на одной таблице. Теперь перейдём к запросам, которые будут базироваться на множестве таблиц. При использовании в запросе множества таблиц, их имена перечисляются в предложении FROM через запятую. В общем случае, запрос

SELECT список_полей

FROM список_таблиц

строит декартово произведение таблиц.

Установление связей со строками таблиц может быть выполнено с помощью предложения WHERE.

Пример 2:

Построить список дипломников с указанием руководителей работы:

SELECT sname, pname

FROM Преподаватель, студент

WHERE pnum = spdp;

Результат:

sname

pname

C-1

П-1

C-2

П-1

C-3

П-2

Т.о. представленный пример реализует операцию «слияние» в реляционной алгебре средствами SQL. В предложении WHERE могут быть одновременно заданы и другие операции отбора записей из исходных таблиц. Например, дополнительное условие для кафедры K-1 – упорядоченные по убыванию фамилии студентов:

SELECT sname, pname

FROM Преподаватель, студент

WHERE pnum = spdp AND

pcaf = «К-1»

Результат:

sname

pname

C-2

П-1

C-1

П-1

В соединении может участвовать несколько таблиц. Например, пусть требуется отобразить результаты экзамена в форме «Преподаватель-студент-дата-оценка»:

SELECT pname, sname, odate, ocen

FROM Преподаватель, студент, оценка

WHERE pnum = opnum AND

sname = osname;

Результат:

pname

sname

odate

ocen

П-1

C-1

10/01/01

5

П-1

C-2

11/01/01

4

П-1

C-3

11/01/01

3

П-3

C-1

15/01/01

5

П-3

C-3

16/01/01

2

П-3

C-3

17/01/01

4

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

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

В предложении FROM могут быть определены алиасы (дополнительные имена) в форме:

FROM имя_таблицы AS [алиас], …

Для предыдущего примера, использование алиасов будет выглядеть следующим образом:

SELECT С. sname, П.pname

FROM Преподаватель П, студент С

WHEREpnum = spdp

Алиасы могут применяться для сокращения записи сложного запроса.

Другим примером неоднозначности в опознании полей является соединение таблицы со своей копией (самообъединение). Это может понадобиться для получения всевозможных пар значений одного атрибута. Это требует обязательного объединения алиасов.

Пример:

Построить множество пар фамилий студентов, имеющих одного руководителя дипломной работы.

SELECT С1. sname, С2. sname,

FROM студент С1, студент С2

WHERE С1. spdp = С2.spdp

Результат:

sname

sname

C-1

C-1

C-1

C-2

C-2

C-2

C-2

C-1

C-4

C-4

Соединение таблиц может быть определено без использования предложения WHERE, путём указания операции JOIN в предложении FROM. Формат этой команды имеет следующий вид:

FROM таблица1 (INNER/ LEFT/ RIGHT) JOIN таблица2 ON условие_объединения,

где таблица1 и таблица2 – имена объединяемых таблиц, условие объединения обычно имеет вид: