Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы и банки данных.doc
Скачиваний:
10
Добавлен:
12.11.2019
Размер:
745.98 Кб
Скачать

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

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

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

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

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

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

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

snmae

Pname

С-1

П-1

С-2

П-1

С-3

П-2

SELECT Sname, pname

FROM ПРЕПОДАВАТЕЛЬ, СТУДЕНТ

WHERE pnum=spdp;

Таким образом, представленный пример реализует операцию слияния реляционной алгебры средствами SQL.

В предложении WHERE могут быть одновременно заданы и другие операции отбора записи из исходных таблиц.

Например, дополнительное условие для кафедры К-1 упорядочены по убыванию фамилии студентов.

Sname

pname

С-2

П-1

С-2

П-1

SELECT sname, pname

FROM ПРЕПОДАВАТЕЛЬ, СТУДЕНТ

WHERE pnum=spdp AND

Pcaf =”K-1”

GROUP BY sname DESC;

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

pname

sname

odate

Ocen

П-1

С-1

10/01/01

5

П-1

С-2

11/01/01

4

П-1

С-3

11/01/01

3

П-3

С-1

15/01/01

5

П-3

С-3

16/01/01

2

П-3

С-3

17/01/01

4

SELECT pname, sname, odate, ocen

FROM ПРЕПОДАВАТЕЛЬ, СТУДЕНТ, ОЦЕНКА

WHERE pnum = opnum AND

Snum = osnum;

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

Использованные в примерах имена полей были различны.

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

Например, для списка дипломников:

SELECT СТУДЕНТ, sname, ПРЕПОДАВАТЕЛЬ, pname

FROM СТУДЕНТ, ПРЕПОДАВАТЕЛЬ,

WHERE pnum=spdp;

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

FROM имя_таблицы AS[АЛИАС],…

Для предыдущего примера:

SELECT C.sname, П.pname

FROM ПРЕПОДАВАТЕЛЬ П, СТУДЕНТ С

WHERE pnum = spdp;

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

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

sname

Sname

C-1

C-1

C-1

C-2

C-2

C-2

C-2

C-1

C-4

C-4

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

SELECT C1.sname, C2.sname

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

WHERE C1.spdp=C2.spdp

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

FROM табл1(irrer/left/right) JOIN табл2 OR условие_объединения;

Где табл1 и табл2 – имена объединяемых таблиц.

Условие объединения обычно имеет вид:

Табл1.поле1=табл2.поле2

  • INNER JOIN – объединяет записи двух таблиц

  • LEFT JOINсоздаёт левое внешнее объединение, при котором все записи из первой (левой) таблицы включаются в результат, даже если во второй правой таблице нет соответствующих записей по условию;

  • RIGHT JOINсоздаёт правое внешнее объединение, при котором все записи из второй правой таблицы включаются в результат;

Пример 1:

Получить список дипломников с указанием руководителя.

sname

pname

C-1

П-1

C-2

П-1

C-3

П-2

SELECT sname, pname,

FROM студент INNER JOIN

Преподаватель ON pnum = spdp;

Пример 2: получить список студентов и руководителей при его наличии.

sname

pname

C-1

П-1

C-2

П-1

C-3

П-2

C-4

SELECT sname, pname,

FROM студент LEFT JOIN

Преподаватель ON pnum = spdp;

Если соединяется более 2 таблиц, то используются вложенные операции JOIN.

FROM таблица1 INNER JOIN (таблица2 INNER JOIN (таблица3 ON условие_объединения 2_3) ON условие_объединения 1_2);