- •Оператор select
- •Простейший вид оператора select
- •Использование предложения where
- •Внутреннее соединение таблиц
- •Использование псевдонимов таблиц
- •Предложение order by - определение сортировки
- •Устранение повторяющихся значений
- •Расчет значений вычисляемых столбцов
- •Агрегатные функции
- •Группировка записей
- •Задание сложных условий поиска
- •Использование подзапросов
- •Дополнительные возможности использования подзапросов, возвращающих единичное значение
- •Использование подзапросов, возвращающих множество значений
- •Внешние соединения
- •Union - объединение результатов выполнения нескольких операторов select
Внешние соединения
Выше были рассмотрены внутренние соединения таблиц базы данных. Напомним, что внутренние соединения имеют место, если в предложении WHERE указано условие
<имя столбца таблицы 1> <оператор> <имя столбца таблицы 2>
Существует также и другой вид соединения таблиц - внешнее соединение. Оно определяется в предложении FROM согласно такой спецификации:
SELECT {*|<значение1>[,<значение2>...]) FROM <таблица1><вид соединения>JOIN<таблица2>ON<условие поиска>
Внешнее соединение отличается от внутреннего тем, что в результирующий НД включаются также записи ведущей таблицы соединения, которые объединяются с. пустым множеством записей другой таблицы. Какая из таблиц будет ведущей, определяет вид соединения:
LEFT - (левое внешнее соединение), когда ведущей является таблица1 (расположена слева от вида соединения);
RIGHT - (правое внешнее соединение), когда ведущей является таблица2 (расположена справа от вида соединения);
FULL - (полное внешнее соединение), когда ведущими таблицами являются и таблица1, и таблица2. В результирующий НД включаются все записи обеих таблиц по следующему алгоритму. Если для записи таблицы1 имеются записи таблицы2, удовлетворяющие условию соединения, в результирующий НД будут включены все комбинации соединения таких записей таблиц 1 и 2; в противном случае в результирующий НД будет включена запись таблицы 1, соединенная с пустой записью. То же относится и к записям таблицы 2: е.сли для записи таблицы 2 имеются записи таблицы 1, удовлетворяющие условию соединения, в результирующий запрос будут включены все комбинации соединения таких записей таблиц 2 и 1; в противном случае в результирующий НД будет включена запись таблицы 2, соединенная с пустой записью.
Пусть имеем такие таблицы:
Таблица А
Столбец Р1 |
Столбец Р2 |
X |
1 |
У |
2 |
Z |
2 |
Таблица В
Столбец Р1 |
Столбец Р2 |
Столбец РЗ |
а |
X |
400 |
b |
X |
200 |
с |
У |
500 |
d |
|
|
Тогда выполнение оператора
SELECT A.PI, A.P2, В.Р2 FROM A LEFT JOIN В ON A.P2 = В.PI
реализующего внешнее левое соединение, приведет к созданию такого результирующего НД:
Столбец A.PI |
Столбец А.Р2 |
Столбец В.Р2 |
а |
X |
1 |
b |
X |
1 |
с |
У |
2 |
d |
|
|
Как видно из результата, для записи таблицы А, где столбец А.Р1 имеет значение «d», нет парных записей в таблице В, для которых удовлетворялось бы условие поиска А. Р2 = в. Р1. Поэтому данная запись таблицы А показана в соединении с пустой записью.
В то же время выполнение оператора
SELECT A.PI, A.P2, В.Р2 FROM A RIGHT JOIN В ON A.P2 = В.PI
реализующего внешнее правое соединение, приведет к выдаче такого результирующего НД:
Столбец А.Р1 |
Столбец А.Р2 |
Столбец В.Р2 |
а |
X |
1 |
b |
X |
1 |
с |
У |
2 |
|
|
2 |
Для записи таблицы В, где столбец В.Р1 имеет значение «z» и столбец В.Р2 имеет значение «2», нет парных записей в таблице А, поэтому данная запись таблицы В показана в соединении с пустой записью.
Выполнение оператора полного внешнего соединения таблиц А и В по условию
А.Р2 = В.Р1
SELECT A.PI, A.P2, В.PI, B.P2 FROM A FULL JOIN В ON A.P2 = В.PI
приведет к выдаче такого результата:
Столбец А.Р1 |
Столбец А.Р2 |
Столбец В.Р1 |
Столбец В.Р2 |
а |
X |
X |
1 |
Ь |
X |
X |
1 |
с |
У |
У |
2 |
d |
|
|
|
|
|
Z |
2 |