Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа_Оператор SELECT_2.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
84.48 Кб
Скачать

Внешние соединения

Выше нами были рассмотрены внутренние соединения таблиц базы данных

Например,

SELECT RASHOD.*, TOVARY.ZENA

FROM RASHOD, TOVARY

WHERE RASHOD.TOVAR = TOVARY.TOVAR

В этом случае в НД отбираются только записи, удовлетворяющие условию поиска.

Существует также и другой вид соединения таблиц, внешнее соединение. Оно определяется в предложении FROM согласно спецификации

SELECT {* | <значение1> [, <значение2> ...]}

FROM <таблица1> <вид соединения> JOIN < таблица2> ON <условие поиска>

Внешнее соединение похоже на внутреннее соединение, но в результирующий НД включаются также записи ведущей таблицы соединения, которые объединяются с пустым множеством записей другой таблицы. Какая из таблиц будет ведущей, определяет вид соединения

• LEFT - (левое внешнее соединение), когда ведущей является таблица1 (расположенная слева от вида соединения);

• RIGHT - (правое внешнее соединение), когда ведущей является таблица1 (расположенная справа от вида соединения);

Например, выполнение оператора SELECT, реализующего внешнее правое соединение,

SELECT A.P1, А.Р2, В.Р2 FROM A RIGHT JOIN B ON А.Р2 = В.Р1

приведет к выдаче результирующего НД, в котором ко все записям из таблицы В будут добавлены либо соответствующие записи из таблицы А, либо пустые записи.

Пример. Построить внешнее соединение по таблице RASHOD с таблицей POKUPATELI, т.е. показать покупателя, соответствующего каждому расходу

SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, P.POKUP, P.GOROD

FROM RASHOD R LEFT JOIN POKUPATELI P ON R.POKUP = P.POKUP

или

SELECT R.DAT_RASH, R.TOVAR, R.KOLVO, P.POKUP, P.GOROD

FROM POKUPATELI P RIGHT JOIN RASHOD R ON R.POKUP = P.POKUP

.

Пример. Построить внешнее соединение по таблице POKUPATELI с таблицей RASHOD, т.е. показать все расходы по каждому покупателю

SELECT P.POKUP, P.GOROD, R.DAT_RASH, R.TOVAR, R.KOLVO

FROM POKUPATELI P LEFT JOIN RASHOD R ON R.POKUP = P.POKUP

или

SELECT P.POKUP, P.GOROD, R.DAT_RASH, R.TOVAR, R.KOLVO

FROM RASHOD R RIGHT JOIN POKUPATELI P ON R.POKUP = P.POKUP

Union - объединение результатов выполнения нескольких операторов select

Иногда бывает полезным объединять два или более результирующих НД, возвращаемых после выполнения двух или более операторов SELECT. Такое объединение производится при помощи оператора UNION. Результирующие НД должны иметь одинаковую структуру, т.е. одинаковый состав возвращаемых столбцов. Если в результирующих НД имеется одна и та же запись, в сводном НД она не дублируется.

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

Произведем объединение трех результирующих наборов данных .

SELECT R.* FROM RASHOD R WHERE R.TOVAR CONTAINING 'Ставрида'

UNION SELECT R.* FROM RASHOD R WHERE R.KOLVO >= 3000

UNION SELECT R.* FROM RASHOD R WHERE R.POKUP = 'Лира, ТОО'

Использование is null

Если требуется выдать все записи, в которых некоторый столбец (или результат вычисления выражения) имеет значение NULL, достаточно в условии поиска указать

<значение> IS [NOT] NULL

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

SELECT * FROM RASHOD WHERE POKUP IS NULL