Л. Партыка, И. И. Попов системы управления базами данных



бет134/215
Дата29.01.2022
өлшемі4,64 Mb.
#115817
1   ...   130   131   132   133   134   135   136   137   ...   215
Байланысты:
Голицына О Л Партыка Т Л Попов И И Системы

а — группировка без использования 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 Студенты




Достарыңызбен бөлісу:
1   ...   130   131   132   133   134   135   136   137   ...   215




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет