Лабораторная работа №20

«SQL-запросы. Запросы с вычислениями.»

 

Цель работы: получить навыки создания и редактирования запросов по заданным параметрам с вычислениями из таблиц базы данных, используя команды SQL.

 

Порядок выполнения работы:

Справочная информация

Групповые функции SQL

Очень часто в таблицах содержатся записи с повторяющимися по какому-то полю значениями. Например, в таблице Выполненные работы могут для одного и того же кода эксперта выполняться различные темы с разным числом часов. Бывает нужным, например, определить для одного кода эксперта суммарные выполненные им число часов. В этом случае используются групповые функции SQL.

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

· Avg – вычисление среднего арифметического;

· Sum – вычисление суммы;

· Min, Max – вычисление минимума или максимума;

· Count – вычисление количества записей;

· First – выводит первое встретившееся значение поля

Например, по команде:

SELECT First([фамилия]), Avg([оценка]) FROM Результаты

GROUP BY [№ зачетной книжки]

группировка осуществляется по номеру зачетной книжки; при этом в запрос выводятся фамилии и средний балл для каждой фамилии.

Более правильно для полей, над которыми выполнена групповая функция, указывать еще и новое имя поля, т.к. группировка функции – это арифметическая операция над полем:

SELECT First ([фамилия]) AS фамилия,Avg ([оценка]) AS [средний балл],

FROM Результаты GROUP BY [№ зачетной книжки]

Предварительно перед группировкой можно осуществлять отбор записей по условию WHERE:

SELECT Avg ([оценка]) AS [средний балл], FROM Результаты

WHERE [оценка] >2 GROUP BY [фамилия]

В этом запросе средняя оценка по заданной фамилии будет вычисляться без учета оценки 2.

С использованием ключевого слова HAVING осуществляется отбор сгруппированных записей, т.е. отбор после группировки. Например, по команде:

SELECT Avg ([оценка]) AS [средний балл],FROM Результаты

GROUP BY [Код дисциплины] HAVING Avg ([оценка]) < 4

в запросе помещаются только записи со средней оценкой меньше 4.

В условии HAVING можно использовать все операции доступные в условии WHERE.

Выбор из нескольких таблиц

Командой SELECT можно выполнять выборку записей из двух таблиц. Для этого используется ключевое слово INNER JOIN. По этому ключевому слову в запрос помещаются записи, одновременно именующиеся в обеих таблицах. Например, по команде:

SELECT студенты.фамилия, оценки.оценка

FROM студенты INNER JOIN оценки

ON студенты.[код студента]=оценки.[код студента]

Из таблицы Студенты извлекается поле Фамилия, а из таблицы Оценки — поле Оценка. Какую из связанных двух таблиц указывать перед INNER JOIN, а какую – после, в данном случае безразлично. В команде, как видно из примера, необходимо после ключевого слова ON указать поля, по которым таблицы связаны между собой. Заметим, что при выборе записей из двух таблиц извлекаемое поле обязательно необходимо указывать вместе с указанием через точку и самой таблицы.

Вместо ключевого слова INNER JOIN можно использовать LEFT JOIN или RIGHT JOIN. В частности, при использовании LEFT JOIN будут извлекаться все записи таблицы, указанной слева от LEFT JOIN, и соответствующие записи, имеющиеся в правой таблице. Если для записи левой таблицы нет соответствующей записи правой таблицы, то на этом месте выводятся пробелы. Например, по команде:

SELECT студенты.фамилия, оценки.оценка FROM студенты LEFT JOIN оценки

ON студенты.[код студента]=оценки.[код студента]

Запрос будет выглядеть следующим образом:

 

Фамилия Оценка
Иванов  
Петров
Сидоров
Коробов  

 

Как видим, в поле Оценка для Иванова и Коробова оценка не проставлена (стоит пробел). Это значит, что в таблице Оценки для этих фамилий не существовало соответствующих записей.

При выборке из трех таблиц также используются ключевые слова INNER JOIN, LEFT JOIN и RIGHT JOIN. Для формирования связи для третьей таблицы необходимо взять в круглые скобки всю инструкцию JOIN для первых двух таблиц. При этом открывающая скобка ставится сразу за ключевым словом FROM, а закрывающая скобка – в конце инструкции:

SELECT студенты.*, оценки.*, организации.* FROM (студенты LEFT JOIN оценки

ON студенты.[код студента]=оценки.[код студента]) INNER JOIN организации

ON студенты.[код организации]=организации.[код организации]

При выборе записей из нескольких таблиц можно использовать условие отбора WHERE или группировку GROUP BY, которые должны располагаться за инструкциями JOIN:

SELECT студенты.*, оценки.*

FROM студенты LEFT JOIN оценки

ON студенты.[код студента]=оценки.[код студента]

WHERE студенты.фамилия < ”K”

 

Удаление записей в таблице выполняется командой DELETE. Например, по команде DELETE * FROM Cтудент удалятся все записи из таблицы студент.

По команде

DELETE * FROM Cтудент

WHERE [дата рождения] > #01/01/81#

удаляются записи с датой рождения > 01.01.81 г.

Отметим, что даты набираются по стандарту США, т.е. месяц/число/год.

По команде

DELETE *FROM Cтудент INNER JOIN [Cтудент-заочник]

ON Cтудент.группа=[Cтудент заочник].группа

удаляются записи в таблице Cтудент, для которых имеются связанные записи в таблице Cтудент заочник.

Удаление поля выполняется командой:

ALTER TABLE Cтудент DROP COLUMN [дата]

по которой, в данном случае, из таблицы Студент удаляется поле Дата.

Добавление в таблицу нового поля выполняется командой:

ALTER TABLE Cтудент ADD COLUMN [группа] TEXT (5)

по которой, в данном случае, в таблицу Cтудент добавляется новое поле группа, имеющего текстовый тип с 5 знаками.

Для указания числового типа можно использовать SINGLE (число одинарной точности) или DOUBLE (число двойной точности).

Формирование новой записи в таблицу выполняется командой INSERT INTO:

INSERT INTO Cтудент ([фамилия], [имя], [дата рождения])

VALUES («Петров», «Иван», #03/23/80#)

по которой добавляется новая запись со значениями соответственно Петров, Иван, 23.03.80.

По команде:

INSERT INTO Cтудент SELECT [Cтудент-заочник].* FROM [Cтудент-заочник]

все записи таблицы Cтудент-заочник будут добавлены в таблицу Cтудент. Заметим, что в операторе SELECT этой команды можно использовать ключевое слово WHERE.

Замена значения полей выполняется с использованием команды UPDATE. Например, по команде:

UPDATE Cтудент SET [группа]=1212

WHERE [фамилия] LIKE “B*”

студенты, чьи фамилии начинаются на букву «В», переводятся в группу 1212.

По команде:

UPDATE Cтудент INNER JOIN [Cтудент-заочник] ON Cтудент.Группа = [Cтудент-заочник].группа

SET [группа]=[группа]&”З”

в таблице Cтудент изменяется номер группы добавлением буквы З, если эта запись встречается в таблице Cтудент-заочник.

Удаление всей таблицы выполняется по команде:

DROP TABLE Cтудент

по которой будет удалена таблица Cтудент.

Наиболее просто запросы формировать совместно в конструкторе и для нереализованных в конструкторе возможностей в SQL.

Например, в сформированной нами базе данных необходимо выбрать эксперта, который раньше всех провел тему. Для этого в конструкторе сформируем запрос, состоящий из полей Фамилия, Имя таблицы Эксперты и поля Дататаблицы Выполненные работы. Отсортируем записи в порядке возрастания даты. Перейдем в режим SQL и для выбора одного первого эксперта добавим после команды SELECT ключевое слово TOP 1.

 

Задание 1. Создать запрос, содержащий поля Эксперт, Кол-во часов таблицы Выполненные работы и вычисляющий суммарное число часов для каждого Эксперт.

Задание 2. Создать запрос, содержащий поля Эксперт, Тема таблицы Выполненные работы и вычисляющий число тем для каждого кода эксперта.

Задание 3. Создать запрос, содержащий поля Эксперт, Кол-во часов таблицы Выполненные работы и вычисляющий суммарное число часов по каждому коду эксперта с отбором перед группировкой кодов эксперта в пределах от 2 до 5 включительно.

Задание 4. Создать запрос, содержащий поля Эксперт, Кол-во часов таблицы Выполненные работы и вычисляющий суммарное число часов по каждому коду эксперта с отбором суммарного числа часов < 6.

Задание 5. Создать запрос, выбирающий поля Фамилия, Имя таблицы Экспертыи поле Кол-во часов таблицы Выполненные работы.

Задание 6. Создать запрос, выбирающий поля Фамилия, Имя таблицы Эксперты, поле Город таблицы Организации и поле Тема таблицы Выполненные работы.

Задание 7. Создать запрос, выбирающий поля Фамилия, Имя таблицы Эксперты, поле Кол-во часов таблицы Выполненные работы и вычисляющий суммарное число часов по каждому коду эксперта.

Задание 8. Создать запрос, вычисляющий количество сотрудников, работающих в данной организации.

Задание 9. Создать запрос, вычисляющий количество сотрудников, проживающих в данном городе.

Задание 10. Создать запрос, выбирающий поля Фамилия, Имя таблицы Эксперты, поле Организация таблицы Организации и выбирающий организации с номером < 6.

Задание 11. Создать запрос, выбирающий поля Фамилия, Имя, Тарифтаблицы Эксперты, поле Кол-во часов таблицы Выполненные работы, вычисляемое поле Гонорар как произведение тарифа на кол-во часов и вычисляющий посредством группировки по полю Код эксперта суммарный гонорар по каждому эксперту.

Задание 12. Создать запрос, выбирающий поля Фамилия, Имя таблицы Эксперты, поле Организация из таблицы Организациии выбирающий среди сотрудников только канд. наук.

Задание 13.

Удалить из таблицы Эксперты записи с фамилией Котов.

Задание 14

Удалить из таблицы Организации записи с Кодом организации от 4 до 6.

Задание 15

Удалить из таблицы Эксперты записи, для которых имеются связанные записи в таблице Выполненные работы.

Задание 16

Из таблицы Эксперты удалить поле Тариф.

Задание 17

В таблице Эксперты добавить числовое поле Тариф.

Задание 18

В таблицу Эксперты добавить новую запись. Значения полей выбрать по своему усмотрению.

Задание 19

Заменить запись поля Ученая степень на д. ф-м. н. с фамилией Баранов.

Задание 20

Заменить запись поля Тариф на 10000, если существует соответствующая запись в таблице Выполненные работы.

Задание 21

В таблице Организации добавить текстовое поле Страна.

Задание 22

Заменить значение поля Страна на Беларусь для записей, у которых поле Город равно Минск.

Задание 23

Совместным использованием конструктора и SQL выберите трех экспертов, прочитавших наибольшее суммарное число часов.

Задание 24

Совместным использованием конструктора и SQL выберите эксперта, прочитавшего наименьшее число тем.

Задание 25

Совместным использованием конструктора и SQL выберите трех экспертов, прочитавших темы последними.