а — группировка без использования all (не все семестры попали в таблицу); б — группировка с использованием all (в таблице представлены все семестры)
Добавим в раздел group by ключевое слово all:
SELECT Семестр, COUNT(*) AS 'Количество часов > 60'
FROM [Учебный_план]
WHERE Количество_часов > 60
GROUP BY ALL Семестр
Будет получен результат, приводимый на рис. 4.25, б.
Раздел COMPUTE
Этот раздел предназначен для выполнения групповых операций над содержимым столбцов выборки. Групповые операции задаются с помощью функций агрегирования. Результат агрегирования выводится в отдельной строке после всех данных столбца.
Синтаксис раздела compute следующий:
COMPUTE <Функция_агрегирования> (<столбец агрегирования>)} [,..., n] [ BY <столбец группировки> [,...,n ] ]
Аргумент <столбец_агрегирования> должен содержать имя агрегируемого столбца. Этот столбец должен быть включен в результат выборки. Ключевое слово by указывает, что результат вычисления следует сгруппировать. Следуемый за этим ключевым словом аргумент <столбец_группировки> содержит имя столбца, по которому будет производиться группировка. Результат необходимо предварительно отсортировать по этому столбцу, т. е. столбец должен быть указан в разделе order by. Приведем простой пример применения раздела compute для вычисления количества дисциплин, читаемых в семестре, и общей суммы часов:
SELECT Наименование, Семестр, Количество_часов FROM Учебный_план, Дисциплины WHERE (Учебный_план . ID_Дисциплина = Дисциплины.ID_Дисциплина) AND (Семестр = 2) COMPUTE SUМ(Количество_часов), COUNT(Семестр)
Будет получен следующий результат:
Наименование Семестр Количество часов
Английский язык 2 110
Физическая культура 2 130
Философия 2 32
Экономическая теория 2 34
История мировых цивилизаций 2 20
Математический анализ 2 5 6
Основы алгебры и геометрии 2 52
Основы программирования 2 2 6
sum
460 cnt
8 (9 row(s) affected)
Рассмотрим пример группировки при использовании раздела compute (составление списков групп и вычисление количества студентов в группе):
SELECT Фамилия, Имя, Отчество, Номер_Группы
FROM Студенты
ORDER BY Номер_Группы
COMPUTE COUNT(Номер_Группы) BY Номер_Группы.
Будет получен следующий
|
результат:
|
|
Фамилия
|
Имя
|
Отчество
|
Номер Группы
|
Агапов
|
Иван
|
Иванович
|
2002\1
|
Агуреев
|
Дмитрий
|
Александрович
|
2002\1
|
Гогешвили
|
Серго
|
Тамазович
|
2002\1
|
Григорьева
|
Мария
|
Александровна
|
2002\1
|
Желтов
|
Олег
|
Игоревич
|
2002\1
|
Жуков
|
Виктор
|
Владимирович
|
2002\1
|
Жучков
|
Сергей
|
Сергеевич
|
2002\1
|
Захаркин
|
Николай
|
Владимирович
|
2002\1
|
Иванов
|
Олег
|
Геннадьевич
|
2002\1
|
Кадаков
|
Антон
|
Дмитриевич
|
2002\1
|
Леонтьев
|
Богдан
|
Вадимович
|
2002\1
|
Миняйло
|
Евгений
|
Николаевич
|
2002\1
|
Нечаева
|
Ольга
|
Николаевна
|
2002\1
|
Парфенова
|
Светлана
|
Витальевна
|
2002\1
|
Поталкин
|
Александр
|
Александрович
|
2002\1
|
Соловьева
|
Полина
|
Сергеевна
|
2002\1
|
Федянин
|
Александр
|
Алексеевич
|
2002\1
|
|
|
|
cnt
|
|
|
|
17
|
Фамилия
|
Имя
|
Отчество
|
Номер Группы
|
Алексеев
|
Иван
|
Александрович
|
2002\2
|
Белова
|
Ирина
|
Владимировна
|
2002\2
|
Бородкина
|
Анна
|
Михайловна
|
2002\2
|
Братченко
|
Елена
|
Анатольевна
|
2002\2
|
Волков
|
Иван
|
Александрович
|
2002\2
|
Гончаров
|
Иван
|
Андреевич
|
2002\2
|
Калинин
|
Андрей
|
Евгеньевич
|
2002\2
|
Кондрашкина
|
Ольга
|
Игоревна
|
2002\2
|
Ларина
|
Евгения
|
Валерьевна
|
2002\2
|
Малкова
|
Дарья
|
Дмитриевна
|
2002\2
|
Поспелов
|
Игорь
|
Григорьевич
|
2002\2
|
Тюрина
|
Юлия
|
Александровна
|
2002\2
|
Филоненко
|
Петр
|
Алексеевич
|
2002\2
|
Юртанов
|
Сергей
|
Михайлович
|
2002\2
|
|
|
|
cnt
|
(33 row(s) affected)
|
|
14
|
Раздел UNION
Раздел union служит для объединения результатов выборки, возвращаемых двумя и более запросами. Рассмотрим синтаксис раздела union:
<Спецификация_запроса_1> UNION [ALL] <Спецификация_запроса_2>
[UNION [ALL]] <Спецификация запроса_n>
Чтобы к результатам запросов можно было применить операцию объединения, они должны соответствовать следующим требованиям:
запросы должны возвращать одинаковый набор столбцов (причем необходимо гарантировать одинаковый порядок
следования столбцов в каждом из запросов);
типы данных соответствующих столбцов второго и последующих запросов должны поддерживать неявное преобразование или совпадать с типом данных столбцов первого запроса;
ни один из результатов не может быть отсортирован с помощью раздела order by (однако общий результат может
быть отсортирован, как будет показано ниже).
Указание ключевого слова all предписывает включать в результат повторяющиеся строки. По умолчанию повторяющиеся строки в результат не включаются.
Продемонстрируем применение раздела union. Рассмотрим таблицы Кадровый состав И Студенты И попробуем построить, например, общий список и учащихся, и преподавателей, номер телефона которых начинается на 120.
Сначала построим запрос для таблицы Кадровый состав:
SELECT Фамилия, Имя, Отчество, Должность, Телефон FROM Кадровый_состав WHERE Телефон LIKE '120%'
Результат действия запроса представлен на рис. 4.26.
Рис. 4.26. Список преподавателей, номера телефонов которых начинаются с 120
Затем построим запрос для таблицы Студенты:
SELECT Фамилия, Имя, Отчество, Телефон
FROM Студенты
WHERE Телефон LIKE '120%'
В результате выполнения запроса получим следующую выборку, показанную на рис. 4.27.
Рис. 4.27. Список студентов, номера телефонов которых начинаются с 120
Теперь объединим два запроса, чтобы в результате получить единую таблицу. Заметим, что столбец Должность отсутствует в таблице Студенты. Чтобы в общей таблице выделить студентов, введем в запрос для таблицы Студенты столбец, содержащий строкуконстанту Студент для всех записей, и объединим два запроса с помощью раздела union:
SELECT Фамилия, Имя, Отчество, Должность, Телефон
FROM Кадровый состав
WHERE Телефон LIKE '120%'
UNION
SELECT Фамилия, Имя, Отчество, Новый столбец =
'Студент1, Телефон
FROM Студенты
WHERE Телефон LIKE 120%'
После выполнения запроса получим таблицу, представленную на рис. 4.28.
При объединении таблиц столбцам итогового набора данных всегда присваиваются те же имена, что были указаны в первом из объединяемых запросов.
Рис. 4.28. Объединение двух запросов
Упорядочим полученный список по алфавиту, добавив предложение ORDER BY:
SELECT Фамилия, Имя, Отчество, Должность, Телефон
FROM Кадровый_состав
WHERE Телефон LIKE '120%'
UNION
SELECT Фамилия, Имя, Отчество, Новый_столбец =
1 Студент', Телефон
FROM Студенты
WHERE Телефон LIKE 420%'
ORDER BY Фамилия
Получим следующий результат, показанный на рис. 4.29.
Рис. 4.29. Список упорядочен по алфавиту
Раздел INTO
При указании этой конструкции (select . .. into) результат выполнения запроса будет сохранен в новой таблице. Синтаксис раздела into следующий:
INTO <имя_новой_таблицы>
Аргумент <имя_новой_таблицы> определяет имя таблицы, в которую будут вставлены результаты.
При выполнении запроса select. . .into автоматически создается новая таблица с нужной структурой, и в нее заносится полученный набор строк. При этом в базе данных не должно существовать таблицы, имя которой совпадает с именем таблицы, указанной в команде select . . . into. Если необходимо быстро создать таблицу со структурой, позволяющей сохранить результат выполнения запроса, то лучшим выходом будет использование команды Select...Into.
Синтаксис команды select . .. into следующий:
SELECT {<имя_столбца> [[AS] <псевдоним_столбца>] [, ..., n] } INTO <имя_новой_таблицы> FROM {<имя_исходной таблицы> [,..., n]}
Приведенный вариант синтаксиса далеко не исчерпывает все возможности вставки данных с помощью команды select . . . into. Допускаются практически все варианты синтаксиса запроса select, т. е. можно выполнять группировку, сортировку, объединение и т. д.
Рассмотрим назначение аргументов команды:
<имя_столбца> [[AS] <псевдоним_столбца>]. Аргумент <имя_столбца> задает имя столбца таблицы, который будет включен в результат. Указанный столбец должен принадлежать одной из таблиц, перечисленных в списке from
{<имя исходной таблицы> [,..., n]}. Если столбцы, принадлежащие разным таблицам, имеют одинаковые имена, то для столбцов необходимо использовать псевдонимы. В противном случае произойдет попытка создать таблицу
со столбцами, имеющими одинаковые имена, что приведет к ошибке, и выполнение запроса будет прервано. Указание псевдонимов также обязательно для столбцов, значения в которых формируются на основе вычисления выражений (по умолчанию такие столбцы не имеют никакого имени, что недопустимо для таблицы), и когда пользователь хочет задать столбцам в создаваемой таблице новые имена (отличные от исходных). Имя псевдонима задается с помощью параметра <псевдоним_ колонки>;
INTO <имя_новой_таблицы>. Аргумент <имя новой таблицы> содержит имя создаваемой таблицы. Это имя должно быть уникальным в пределах базы данных;
FROM {<имя исходной_таблицы> [,..., n] }. В простейшем случае конструкция from содержит список исходных таблиц. В более сложных запросах с помощью этой конструкции определяются условия связывания двух и более таблиц.
С помощью команды select . . . into, например, можно разделить таблицу Студенты на две, выделив в отдельную таблицу Контакты адреса и телефоны, а затем удалив эти столбцы из таблицы Студенты:
SELECT ID_Студент, Адрес, Телефон INTO Контакты FROM Студенты
Будет создана новая таблица со структурой, приведенной Ш рис. 4.30.
Рис. 4.30. Структура новой таблицы
Запрос для таблицы Контакты
SELECT *
FROM Контакты,
WHERE Телефон LIKE '120%'
выдает результат, приводимый на рис. 4.31.
Рис. 4.31. Результат запроса по номеру телефона
Построим внешний ключ для таблицы контакты, обеспечив связь с таблицей Студенты:
ALTER TABLE Контакта ADD CONSTRAINT FK_Koнтaкт FOREIGN KEY (ID_Студент) REFERENCES Студенты
Достарыңызбен бөлісу: |