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