Глава 8. КОМБИНИРОВАНИЕ РЕЗУЛЬТАТОВ SELECT-ЗАПРОСОВ
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Оператор UNION

Оператор UNION позволяет объединить результирующие наборы, сформированные двумя SELECT-запросами в общий результирующий набор. Единственным требованием, предъявляемым к SELECT-запросам, является совместимость типов соответствующих столбцов сформированных результирующих наборов.

На рис. 8.1 приведен простейший пример использования оператора UNION для объединения результирующих наборов двух SELECT-запросов.

 

Рис. 8.1. Пример простейшего использования оператора UNION

 

Каждый оператор SELECT (рис. 8.1) формирует результирующий набор, состоящий из одной строки. Заметим следующее.

1. Результирующий набор оператора UNIONсодержит объединение строк результирующих наборов первого и второго SELECT-запроса.

2. Имена столбцов результирующего набора оператора UNION совпадают с именами столбцов результирующего набора, сформированного первым SELECT-запросом.

3. Количество столбцов результирующих наборов первого и второго SELECT-запросов должно быть одинаковое.

4. Типы соответствующих столбцов должны быть совместимы.

5. Оператор UNION является коммутативным: результат не зависит от порядка объединяемых наборов.

Пример на рис. 8.2 демонстрирует случай, когда типы столбцов двух результирующих наборов разные, но могут быть автоматически преобразованы друг к другу.

Пример на рис. 8.3 демонстрирует, что автоматическое преобразование типов не всегда возможно. Второй результирующий набор содержит строку, значения в которой не могут быть преобразованы к типу INT. Попытка выполнения этого оператора приводит к ошибке.

На рис. 8.4 приведен еще один пример ошибочного применения оператора UNION. Ошибка произошла из-за того, что объединяемые оператором UNION результирующие наборы строк имеют разное количество столбцов.

 

Рис. 8.2. Автоматическое преобразование типов в операторе UNION

 

Рис. 8.3. Сообщение об ошибке при попытке объединения результирующих

наборов, содержащих разнотипные соответствующие столбцы,

значения которых не могут быть приведены к общему типу

 

Рис. 8.4. Сообщение об ошибке при попытке объединения результирующих

наборов с разным количеством столбцов

 

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

Рис. 8.5. Теоретико-множественное объединение одинаковых строк

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

Рис. 8.6. Механическое объединение одинаковых строк

Заметим, что оператор UNION может быть выражен через оператор UNION ALL (рис. 8.7) с помощью опции DISTINCT, примененной к результату объединения результирующих наборов с помощью UNION ALL.

Рис. 8.7. SELECT-запрос, выражающий оператор UNION через UNION ALL

Чаще всего операторы UNION и UNION ALL используются для объединения SELECT-запросов, которые выполняются к разным таблицам. Например, пусть существует таблица TEACHER_ ARC, имеющая структуру аналогичную таблице TEACHER (рис. 8.8).

 

Рис. 8.8. Содержимое таблицы TEACHER_ARC

Тогда запрос, осуществляющий поиск строк с первой буквой A в столбце TEACHER_ NAME в таблицах TEACHER и TEACHER_ ARC, может быть записан двумя способами (рис. 8.9 и 8.10).

 

Рис. 8.9. Фильтрация строк в двух таблицах (первый способ)

Рис. 8.10. Фильтрация строк в двух таблицах (второй способ)

 

С точки зрения производительности, оба запроса (рис. 8.9, 8.10) являются равносильными. Вторая (рис. 8.10) форма записи, с точки зрения автора, является предпочтительней.

Операторы UNION и UNION ALL допускают применение секции ORDER BY. Секция ORDER BY в сценарии на рис. 8.11 сортирует результат объединения двух запросов в порядке убывания значений в столбце PULPIT.

 

Рис. 8.11. Сортировка результата выполнения оператора UNION ALL

Отметим, что после ключевого слова BY в секции ORDER можно указывать псевдонимы, назначенные в первом SELECT-списке, или просто номер элемента списка (рис. 8.12).

 

Рис. 8.12. Сортировка результата выполнения оператора

UNION ALL по номеру элемента SELECT-списка

 

Оператор INTERSECT

Результатом оператора INTERSECT является набор строк, представляющий собой пересечение (в теоретико-множественном смысле) двух исходных наборов строк. Как и для оператора UNION, к SELECT-запросам предъявляется требование совместимости типов соответствующих столбцов.

На рис. 8.13 представлен простейший пример использования оператора INTERSECT.

 

Рис. 8.13. Простейший пример использования оператора INTERSECT

 

Два исходных набора строк оператора INSTERSECT на рис. 8.13 представлены в виде объединения строк (с помощью операторов UNION), формируемых операторами SELECT.Результатом выполнения оператора INTERSECT является набор, состоящий из одной строки.

Заметим следующее.

1. В исходных наборах строк должно быть одинаковое количество столбцов и совместимый тип соответствующих столбцов.

2. Результирующий набор оператора INTERSECT содержит множество строк, являющееся пересечением двух исходных множеств строк. Другими словами, результирующий набор оператора INTERSECT содержит строки входящие одновременно и в первый во второй исходные наборы данных.

3. Результатом оператораINTERSECTявляется множество неповторяющихся строк. В этом смысле, оператором выполняется теоретико-множественная операция пересечения множеств.

4. Имена и типы столбцов результирующего набора оператора INTERSECTсовпадают с именами и типами столбцов первого результирующего набора.

5. Оператор INTERSECT является коммутативным: результат не зависит от порядка исходных наборов.

Рассмотрим сценарий на рис. 8.14.Его отличие от сценария на рис. 8.13 в отсутствии скобок, регламентирующих порядок выполнения операторов. Заметим: полученный результат отличается от результата на рис. 8.13.

 

Рис. 8.14. Пример запроса с операторами INTERSECT и UNION

 

Оператор INTERSECT имеет более высокий приоритет, чем оператор UNION. Поэтому на рис. 8.14 пересечение выполняется для двух наборов строк, каждая из которых состоит только из одной строки.

На рис. 8.15 представлен пример использования оператора INTERSECT, формирующего результирующий набор, являющейся пересечением двух наборов строк, полученных в результате выполнения двух SELECT-запросов. Каждый SELECT-запрос формирует по одному столбцу (строки, состоящие из одного элемента) значений.

Рис. 8.15. Оператор INTERSECT, формирующий набор строк,

являющийся пересечением результатов двух SELECT-запросов

 

Результатом пересечения является столбец, имя которого заимствовано из первого результирующего набора, для которого в SELECT-запросе указан псевдоним дисциплина.

 

Оператор EXCEPT

Результатом оператора EXCEPT является набор строк, представляющий собой разность (в теоретико-множественном смысле) двух исходных наборов строк. Как и для операторов UNION и INTERSECT к SELECT-запросам предъявляется требование совместимости типов соответствующих столбцов.

На рис. 8.16 представлен простейший пример использования оператора EXCEPT.

 

Рис. 8.16. Оператор EXCEPT, формирующий набор строк,

являющийся разностью результатов двух SELECT-запросов

 

Два исходных набора строк оператора EXCEPT на рис. 8.16 представлены в виде объединения строк (с помощью операторов UNION), формируемых операторами SELECT. Результатом выполнения оператора EXCEPT является набор, состоящий из двух строк.

Заметим следующее.

1. В исходных наборах строк должно быть одинаковое количество столбцов и совместимый тип соответствующих столбцов.

2. Результирующий набор оператора EXCEPT содержит множество строк, являющееся разностью двух исходных множеств строк. Другими словами, результирующий набор оператора EXCEPT содержит строки, которые входят в первый набор строк, но не входят во второй.

3. Результатом оператора EXCEPT является множество неповторяющихся строк. В этом смысле оператором выполняется теоретико-множественная операция вычитания множеств.

4. Имена и типы столбцов результирующего набора оператора EXCEPT совпадают с именами и типами столбцов первого результирующего набора.

5. Оператор EXCEPT не является коммутативным: результат зависит от порядка исходных наборов (рис. 8.17).

Рис. 8.17. Пример, показывающий не коммутативность оператора EXCEPT

 

Изменение порядка исходных наборов строк приводит к другому результату оператора EXCEPT (рис.8.17).

Рис. 8.18 представляет пример, демонстрирующий приоритетность операторов UNION, INTERSECT и EXCEPT. В комментариях указывается порядок выполнения операторов. Не сложный анализ результата выполнения сценария позволяет выявить, что наивысшим приоритетом обладает оператор INTERSECT, а операторы UNION и EXCEPT имеют одинаковый приоритет.

 

Рис. 8.18. Приоритетность операторов UNION, INTERSECT и EXCEPT

 

 

Рис. 8.19. Оператор EXCEPT, формирующий набор строк,
являющийся разностью результатов двух SELECT-запросов

 

На рис. 8.19 представлен пример использования оператора EXCEPT, формирующего результирующий набор, являющийся разностью двух наборов строк, полученных в результате выполнения двух SELECT-запросов. Каждый SELECT-запрос формирует по одному столбцу значений. Результатом пересечения является столбец, имя которого заимствовано из первого результирующего набора.

 


Дата: 2019-02-25, просмотров: 277.