Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие ТБД.doc
Скачиваний:
25
Добавлен:
04.09.2019
Размер:
1.92 Mб
Скачать

Предложение exists.

Требуется отобрать только те данные, для которых подзапрос возвращает одно или более значений.

EXISTS (<подзапрос>)

Пример.

Составить список покупателей, которые хотя бы один раз получали товар со склада:

SELECT P.POKUP

FROM POKUPATELI P

WHERE EXISTS (SELECT R.POKUP

FROM RASHOD R

WHERE R.POKUP = P.POKUP )

Предложение singular.

Требуется выбрать лишь те записи, для которых подзапрос возвращает только одно значение.

SINGULAR (<подзапрос>)

Пример.

Составить список покупателей, купивших только один товар:

SELECT P.*

FROM POKUPATELI P

WHERE SINGULAR (SELECT *

FROM RASHOD R

WHERE R.POKUP = P.POKUP )

Использование all, some (any).

Если в условиях поиска необходимо указать , что сравниваемое значение должно находиться в определенных отношениях со всеми или некоторыми значениями из множества значений, возвращаемых подзапросом, применяют выражение:

<сравниваемое_значение> [NOT] <оператор> {ALL | SOME | ANY } (<подзапрос>)

ALL указывает, что условие поиска будет истинно только тогда, когда сравниваемое значение находится в нужном отношении со ВСЕМИ значениями, возвращаемыми подзапросом.

WHERE STOLBEZ > ALL (SELECT POLE FROM TABLIZA)

SOME (или ANY) условие истинно, когда сравниваемое значение находится в нужном отношении ХОТЯ БЫ С ОДНИМ значением, возвращаемым подхвпросом.

WHERE STOLBEZ > SOME (SELECT POLE FROM TABLIZA)

Пример.

Определим все факты отгрузки товара со склада, в которых количество единиц отгружаемого товара превышает среднее значение.

SELECT * FROM RASHOD R1

WHERE R1.KOLVO > ALL

(SELECT AVG(R2.KOLVO) FROM RASHOD R2

GROUP BY POKUP)

Определим все факты отгрузки товара со склада, в которых количество единиц отгружаемого товара превышает среднее значение отгрузки хотя бы одного товара.

SELECT * FROM RASHOD R1

WHERE R1.KOLVO > SOME

(SELECT AVG(R2.KOLVO) FROM RASHOD R2

GROUP BY POKUP)

Использование having и агрегатных функций для вложенных подзапросов

Если в условиях поиска для вложенного запроса нужно указать агрегатную функцию, используется предложение HAVING.

Пример.

Определим покупателя, у которого средняя покупка больше средней покупки других покупателей.

SELECT R1.POKUP, AVG(R1.KOLVO) FROM RASHOD R1

GROUP BY R1.POKUP

HAVING AVG(R1.KOLVO) >= ALL

(SELECT AVG(R2.KOLVO) FROM RASHOD R2

GROUP BY POKUP)

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

Внешнее соединение таблиц определяется в предложении FROM согласно следующей спецификации:

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

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

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

LEFT – (левое внешнее соединение), когда ведущей являются таблица1 (расположена СЛЕВА от вида соединения).

RIGHT – (правое внешнее соединение), когда ведущей являются таблица2 (расположена СПРАВА от вида соединения).

FULL – (полное внешнее соединение), когда ведущими являются и таблица1, и таблица2.

Таблица A

Ст. P1

Ст.P2

Ст.P3

a

X

400

b

X

200

c

Y

500

d

Таблица B

Ст. P1

Ст.P2

x

1

y

2

z

3

SELECT A.P1, A.P2, B.P2

FROM A

LEFT JOIN B ON A.P2 = B.P1

Результирующий НД

Ст. A. P1

Ст. A.P2

Ст. B.P2

A

x

1

B

x

1

C

y

2

D

SELECT A.P1, A.P2, B.P2

FROM A

RIGHT JOIN B ON A.P2 = B.P1

Результирующий НД

Ст. A. P1

Ст. A.P2

Ст. B.P2

a

x

1

b

x

1

c

y

2

3

SELECT A.P1, A.P2, B.P2

FROM A

FULL JOIN B ON A.P2 = B.P1

Результирующий НД

Ст. A. P1

Ст. A.P2

Ст. B.P2

Ст. B.P2

A

x

x

1

B

x

x

1

C

y

y

2

D

z

3

Пример 1. Несколько последовательных внешних соединений

SELECT R.DAT_RASH, R.TOVAR, T.ED_IZM, R.KOLVO, P.ADRES

FROM RASHOD R

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

LEFT JOIN TOVARY T ON R.TOVAR = T.TOVAR

Пример 2. Комбинирование внешних и внутренних соединений

SELECT P.POKUP, R.DAT_RASH, R.TOVAR, T.ED_IZM, R.KOLVO

FROM POKUPATELI P

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

INNER JOIN TOVARY T ON R.TOVAR = T.TOVAR