Использование 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)

 

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

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

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

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

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

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

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

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

Таблица A

Ст. P1 Ст.P2 Ст.P3
a X
b X
c Y
d    

Таблица B

Ст. P1 Ст.P2
x
y
z

 

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
B x
C y
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
b x
c y
   

 

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
B x x
C y y
D      
    z

 

Пример 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

3.4.1.14. Объединение запросов – UNION

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

SELECT R.*

FROM RASHOD R

WHERE R.TOVAR CONTAINING ‘Сахар’

UNION

SELECT R.*

FROM RASHOD R

WHERE R.KOLVO >= 100

Использование IS NULL

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

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

Пример.

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

SELECT * FROM RASHOD

WHERE POKUP IS NULL