Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка SQL(14) (оптимизация).docx
Скачиваний:
65
Добавлен:
17.03.2015
Размер:
452.16 Кб
Скачать

4.6.2. Использование строк и выражений с union.

Иногда, можно вставлять константы и выражения в предложении SELECT используемые с UNION. Константы и выражения, которые будут использоваться, должны быть совместимы по типу. Эта свойство полезно, например, чтобы устанавливать комментарии, указывающие на то, какой запрос вывел данную строку.

Пример 40.

Необходимо сделать отчет о том, какие блюда наиболее и наименее популярны у клиентов (из тех блюд, которые заказывались). Мы можем объединить два запроса, вставив туда текст, чтобы различать вывод для каждого из них.

SELECT 'Наиболее популярное блюдо' , b.Блюдо, SUM(z.Количество_порций)

FROM Блюда b JOIN Заказы z ON b.ID_ Блюдо = z. Блюдо

GROUP BY b. Блюдо

HAVING SUM(z.Количество_порций) = (SELECT MAX (кол)

FROM (SELECT SUM(Количество_порций) as кол

FROM Заказы

GROUP BY Блюдо) m)

UNION ALL

SELECT 'Наименее популярное блюдо', b.Блюдо, SUM(z.Количество_порций)

FROM Блюда b JOIN Заказы z ON b.ID_ Блюдо = z. Блюдо

GROUP BY b. Блюдо

HAVING SUM(z.Количество_порций) = (SELECT MIN (кол)

FROM ( SELECT SUM(Количество_порций) as кол

FROM Заказы

GROUP BY Блюдо) m);

Результат

Блюдо

Наиболее популярное блюдо

Салат летний

10

Наименее популярное блюдо

Драчена

1

Наименее популярное блюдо

Рулет с яблоками

1

4.6.3. Использование union с order by.

При построении запроса с UNION, часто необходимо чтобы данные выводились в каком- то особом порядке. Для этого необходимо использовать ORDER BY(один раз и в конце последнего предложения SELECT), чтобы упорядочить вывод из объединения, точно так же как это делается в индивидуальных запросах. Давайте пересмотрим наш последний пример, чтобы упорядочить строки по названиям блюд.

Пример 41.

SELECT 'Наиболее популярное блюдо' , b.Блюдо, SUM(z.Количество_порций)

FROM Блюда b JOIN Заказы z ON b.ID_ Блюдо = z. Блюдо

GROUP BY b. Блюдо

HAVING SUM(z.Количество_порций) = (SELECT MAX (кол)

FROM (SELECT SUM(Количество_порций) as кол

FROM Заказы

GROUP BY Блюдо) m)

UNION ALL

SELECT 'Наименее популярное блюдо', b.Блюдо, SUM(z.Количество_порций)

FROM Блюда b JOIN Заказы z ON b.ID_ Блюдо = z. Блюдо

GROUP BY b. Блюдо

HAVING SUM(z.Количество_порций) = (SELECT MIN (кол)

FROM ( SELECT SUM(Количество_порций) as кол

FROM Заказы

GROUP BY Блюдо) m)

ORDER BY b.Блюдо;

4.6.4. Реализация внешнего полного соединения через запросы с union.

Если ваша система баз данных не поддерживает синтаксис FULL OUTER JOIN, те же результаты можно получить с помощью более сложного запроса, используя UNION.

Схема такого запроса имеет вид:

SELECT <поля для вывода>

FROM таблица_А LEFT OUTER JOIN таблица_В ON <условие связи>

UNION

SELECT <поля для вывода>

FROM таблица_А RIGHT OUTER JOIN таблица_В ON <условие связи>;

Как вы можете видеть, левое и правое внешние соединения, просто объединяются друг с другом с помощью оператора UNION.

Следует отметить, что предложение GROUP BY с оператором GROUPING SETS может дать такой же результирующий набор, как и несколько простых предложений GROUP BY, объединенных с помощью UNION ALL.

Синтаксис:

GROUP BY GROUPING SETS (<набор группирования> [, ... n ])

Следующие инструкции эквивалентны.

SELECT Блюдо, ID_Заказ, SUM(Количество_порций)

FROM Заказы

GROUP BY GROUPING SETS (Блюдо,ID_Заказ);

SELECT Блюдо, NULL as ID_Заказ, SUM(Количество_порций)

FROM Заказы

GROUP BY Блюдо

UNION ALL

SELECT NULL as Блюдо, ID_Заказ, SUM(Количество_порций)

FROM Заказы

GROUP BY ID_Заказ;

И дают одинаковый результат:

Результат

Блюдо

ID_Заказа

1

NULL

10

2

NULL

3

4

NULL

3

14

NULL

4

15

NULL

8

16

NULL

1

25

NULL

1

27

NULL

2

33

NULL

2

NULL

1

20

NULL

2

4

NULL

3

6

NULL

4

1

NULL

5

3