
- •Лабораторная работа «Оператор select»
- •Предложение having - наложение ограничений на группировку записей
- •Использование between
- •Использование in (список значений)
- •Использование starting
- •Использование containing
- •Использование функции upper
- •Использование like
- •Использование функции cast
- •Использование подзапросов
- •Дополнительные возможности использования подзапросов, возвращающих единичное значение Использование exists
- •Использование singular
- •Использование подзапросов, возвращающих множество значений Использование all, some
- •Использование having и агрегатных функций для вложенных подзапросов
- •Внешние соединения
- •Union - объединение результатов выполнения нескольких операторов select
- •Использование is null
- •Использование операции сцепления строк
- •Работа с разными бд в одном запросе
Внешние соединения
Выше нами были рассмотрены внутренние соединения таблиц базы данных
Например,
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