Выбрать главу

ORDER BY maker, PC.model;

Обратите внимание на то, что по сравнению с предыдущим примером, пришлось использовать предложение WHERE для отбора только производителей ПК. В противном случае в результирующий набор попали бы также и модели ПК-блокнотов и принтеров. В рассмотренном ранее примере это условие было бы излишним, т.к. соединялись только те строки, у которых совпадали номера моделей, и одной из таблиц была таблица PC, содержащая только ПК. В результате выполнения запроса получим:

maker

model_1

model_2

price

A

1232

1232

600.0

A

1232

1232

400.0

A

1232

1232

350.0

A

1232

1232

350.0

A

1233

1233

600.0

A

1233

1233

950.0

A

1233

1233

980.0

B

1121

1121

850.0

B

1121

1121

850.0

B

1121

1121

850.0

E

2111

NULL

NULL

E

2112

NULL

NULL

E

1260

1260

350.0

Поскольку моделей 2111 и 2112 из таблицы Product нет в таблице PC, в полях из таблицы PC содержится NULL.

Соединение RIGHT JOIN обратно соединению LEFT JOIN, т.е. в результирующий набор попадут все строки из второй таблицы, которые будут соединяться только с теми строками из первой таблицы, для которых выполняется условие соединения. В нашем случае левое соединение

Product LEFT JOIN PC ON PC.model = Product.model

будет эквивалентно правому соединению

PC RIGHT JOIN Product ON PC.model = Product.model

Запрос же

SELECT maker, Product.model AS model_1, PC.model AS model_2, price

FROM Product RIGHT JOIN PC ON PC.model = Product.model

ORDER BY maker, PC.model;

даст те же результаты, что и внутреннее соединение, поскольку в правой таблице (PC) нет таких моделей, которые отсутствовали бы в левой таблице (Product), что вполне естественно для типа связи "один-ко-многим", которая имеется между таблицами PC и Product. Наконец, при полном соединении (FULL JOIN) в результирующую таблицу попадут не только те строки, которые имеют одинаковые значения в сопоставляемых столбцах, но и все остальные строки исходных таблиц, не имеющие соответствующих значений в другой таблице. В этих строках все столбцы той таблицы, в которой не было найдено соответствия, заполняются NULL-значениями. Полное соединение представляет собой комбинацию левого и правого внешних соединений.

Так запрос для таблиц A и B, приведенных в начале главы,

SELECT A.*, B.*

FROM A FULL JOIN B

ON A.a = B.c;

даст следующий результат:

a

b

c

d

1

2

NULL

NULL

2

1

2

4

NULL

NULL

3

3

Заметим, что это соединение симметрично, т.е. "A FULL JOIN B" эквивалентно "B FULL JOIN A". Обратите также внимание на обозначение A.*, что означает "все поля таблицы А".

Традиционные операции над множествами и оператор SELECT

Традиционные операции над множествами - это объединение, пересечение, разность и декартово произведение.

Декартово произведение

Ранее мы уже рассмотрели реализацию декартова произведения, перечисляя через запятую табличные выражения в предложении FROM (таблицы, представления, подзапросы). Кроме того, можно использовать еще одну явную операцию соединения:

SELECT Laptop.model, Product.model

FROM Laptop CROSS JOIN Product;

Напомним, что при декартовом произведении каждая строка из одной таблицы соединяется с каждой строкой второй таблицы. В результате количество строк результирующего набора равно произведению количества строк операндов декартова произведения. В нашем примере таблица Laptop содержит 5 строк, а таблица Product - 16. В результате получается 5*16 = 80 строк. Поэтому мы не приводим здесь результат выполнения этого запроса. Вы можете сами проверить это утверждение, выполнив приведенный выше запрос на учебной базе данных.

В чистом виде декартово произведение практически не используется. Оно, как правило, является промежуточным результатом выполнения операции горизонтальной проекции (выборки) при наличии в операторе SELECT предложения WHERE.

Объединение

Для объединения запросов используется служебное слово UNION:

UNION [ALL]

Оператор UNION объединяет выходные строки каждого из запросов в один результирующий набор. Если определен параметр ALL, то сохраняются все дубликаты выходных строк, в противном случае в результирующем наборе остаются только уникальные строки. Заметим, что можно связывать вместе любое число запросов. Кроме того, с помощью скобок можно менять порядок объединения.

При этом должны выполняться следующие условия:

* Количество выходных столбцов каждого из запросов должно быть одинаковым.

* Выходные столбцы каждого из запросов должны быть сравнимыми между собой (в порядке их следования) по типам данных.

* В результирующем наборе используются имена столбцов, заданные в первом запросе.

* Предложение ORDER BY применяется к результату соединения, поэтому оно может быть указано только в конце составного запроса.

Пример. Найти номера моделей и цены ПК и ПК-блокнотов:

SELECT model, price

FROM PC

UNION

SELECT model, price

FROM Laptop

ORDER BY price DESC;

model

price

1750

1200.0

1752

1150.0

1298

1050.0

1233

980.0

1321

970.0

1233