- •Оглавление
- •Введение
- •1. Типы данных в sql
- •2. Данные, используемые в примерах
- •3. Создание новых таблиц и модификация данных в таблицах
- •4. Формирование запросов
- •4.1. Выборка данных из единственной таблицы
- •4.2. Выборка данных из нескольких таблиц
- •4.3. Вложенные запросы (подзапросы)
- •4.4. Специальные операторы для обработки подзапросов
- •4.5. Объединение результатов нескольких запросов
- •4.6. Вставка результатов запроса в другую таблицу
- •Приложение 1
- •Текстовый тип
- •Числовые типы
- •Приложение 2
- •Приложение 3
- •Числовые функции
- •Символьные функции
- •Агрегатные функции(применяются к полям таблиц)
4.5. Объединение результатов нескольких запросов
Иногда результаты выполнения нескольких самостоятельных запросов требуется объединить в одну таблицу, не сцепляя строки таблиц различных запросов, а рассматривая каждую из них как отдельную строку обобщенного результата. Такое объединение выполняется с помощью предложения UNION, включаемого между запросами.
Результаты объединяемых запросов обязательно должны быть совместимы по следующим признакам:
1) количество полей в результатах каждого запроса должно быть одинаковым;
2) поля с одинаковыми порядковыми номерами в каждом из запросов должны иметь полностью идентичные тип данных и длину их представления.
Выполним простое объединение двух таблиц, содержащих сведения о должностях и о факультетах. Количество полей в каждой из них равно двум, типы полей совпадают. Для того, чтобы было ясно, где в результирующей таблице находятся строки каждого запроса, включим в запросы комментарии - тексты равной длины (данная возможность не поддерживается стандартом ANSI SQL, но допускается во многих реализациях SQL).
SELECT Npost, 'Должность', Cname FROM Post
UNION
SELECT Ndep, 'Факультет', Cname FROM Depart
Результат выполнения объединенного запроса:
-
Npost Exp_2 Cname
10 Должность Преподаватель
20 Должность Ст. преподаватель
30 Должность Доцент
40 Должность Профессор
50 Должность Зав. кафедрой
100 Факультет Математический
200 Факультет Физический
300 Факультет Экономический
Особенностью выполнения объединия запросов является исключение из результата идентичных строк, подобно тому, как это обеспечивает ключевое слово DISTINCT в отдельном запросе. Поэтому объединение нескольких запросов к одной таблице не вызовет дублирования ее строк - каждая строка появится в результате в единственном экземпляре.
SELECT * FROM Post
UNION
SELECT * FROM Post
-
Npost Cname
10 Преподаватель
20 Ст. преподаватель
30 Доцент
40 Профессор
50 Зав. кафедрой
Однако если все же необходимо оставить в объединенном запросе все идентичные строки, используйте вместо UNION предложение UNION ALL:
SELECT * FROM Post
UNION ALL
SELECT * FROM Post
-
Npost Cname
10 Преподаватель
20 Ст. преподаватель
30 Доцент
40 Профессор
50 Зав. кафедрой
10 Преподаватель
20 Ст. преподаватель
30 Доцент
40 Профессор
50 Зав. кафедрой
Далее следует еще один пример объединения двух запросов. Этот запрос позволяет выявить дисциплины с минимальным и максимальным объемом занятий по ним, а также преподавателей, ведущих занятия. Результаты запроса упорядочены в первую очередь по объему занятий, во вторую - по фамилиям преподавателей. Предложение ORDER BY в примере определяет порядок строк в таблице, полученной объединением двух запросов, а не в последнем из объединяемых запросов.
SELECT ‘Минимум ’,A.Cname,Nhour,B.Cname
FROM Subject A,Teacher B
WHERE A.Nteach=B.Nteach AND
Nhour=( SELECT MIN(Nhour) FROM Subject )
UNION
SELECT ‘Максимум’,A.Cname,Nhour,B.Cname
FROM Subject A,Teacher B
WHERE A.Nteach=B.Nteach AND
Nhour=( SELECT MAX(Nhour) FROM Subject )
ORDER BY 3 ASC, 4 ASC
-
Exp_1 Cname_A Nhour Cname_B
Минимум Практикум на ЭВМ 30 Бердино Н.Ю.
Минимум Физика 30 Стефанович Г.Б.
Максимум Экономическая география 90 Литвинас А.П.
Максимум Информационные системы 90 Поляков В.В.
Обратите внимание, что в последнем приведенном примере в каждом из объединяемых запросов ряд столбцов результирующей таблицы указывается с использованием алиасов (временных имен таблиц), а часть без них. Вспомните, почему это возможно.
Предложения UNION позволяют объединять результаты более, чем двух запросов. В этом случае строгий порядок выполнения запросов в объединении можно задать с помощью круглых скобок. Например, объединение результатов трех запросов можно выполнить следующими способами:
Запрос-1 UNION Запрос-2 UNION Запрос-3
( Запрос-1 UNION Запрос-2 ) UNION Запрос-3
Запрос-1 UNION ( Запрос-2 UNION Запрос-3 )
При выполнении любого из приведенных трех запросов мы получим идентичный результат, потому что в них используются только предложения UNION. Упорядочение операций объединения обязательно, как правило, если в одном запросе используются предложения и UNION и UNION ALL, что позволяет оставить в результирующей таблице дубликаты строк в одном случае и исключить их наличие в другом.
Упражнения к разделу 4.5
1. Сформулируйте запрос, который позволит получить в виде одной таблицы список преподавателей и студентов математического факультета (с пояснениями “Студент” возле фамилий студентов и наименований занимаемых должностей возле фамилий преподавателей). В результирующей таблице первыми в списке должны идти все студенты, а за ними все преподаватели. Фамилии студентов должны быть упорядочены по алфавиту. Фамилии преподавателей должны располагаться в порядке убывания кода должности, а при наличии нескольких преподавателей с одной должностью они должны быть также упорядочены по алфавиту.
2. Сформулируйте запрос, который позволит получить в виде одной таблицы список студентов, у которых руководителями являются преподаватели факультета, в названии которого есть фрагмент ‘матема’, и список предметов, занятия по которым ведут преподаватели того же факультета. Используйте подзапросы.
При выполнении этого задания у Вас должны возникнуть проблемы совместимости данных, получаемых в каждом из объединяемых запросов. В СУБД FoxPro разрешить их можно с помощью функции PADC( ) или LEFT( ).