МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ INTERNATIONAL BANKING INSTITUTE Цель: ТЕМА 3

advertisement
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
ТЕМА 3
ПРАКТИЧЕСКОЕ ЗАНЯТИЕ 2.
СТРУКТУРИРОВАННЫЙ ЯЗЫК ЗАПРОСОВ SQL К РЕЛЯЦИОННОЙ
БАЗЕ ДАННЫХ.
Цель: изучить методы написания сложных SQL-запросов и
методы их реализации на сервере MS SQL Server 2000.
Для достижения поставленной цели необходимо решить
следующие задачи:
 Изучить принципы работы агрегатных функций.
 Изучить принципы составления подчиненных запросов
 Выполнить все требуемые запросы к учебной БД.
 Выполнить тест по языку SQL в системе ВУОКСа.
Оглавление.
Задание 1.....................................................................................................................................1
Задание 2. Изучение принципов составления подчиненных или составных запросов. ....6
Задание 3. Выполнить зачетный SQL –тест в системе ВУОКСа. .........................................8
Задание 1.
Сложными назовем запросы на языке SQL, которые требуют
использования агрегатных функций или подзапросов для своей
реализации. Агрегатные функции используются при дополнительной
обработке информации, когда применяется группировка строк запроса
по ряду специальных параметров.
При выполнении операций
группировки строки с одинаковыми значениями столбцов группировки
объединяются в одну группу. После этого к созданным группам можно
применить стандартные агрегатные функции обработки. Стандарт
языка
SQL
предлагает
5
базовых
агрегатных
функций,
представленных в табл. 1:
Таблица 1.
Агрегатные функции в языке SQL
Функция
Результат
COUNT
Количество строк или непустых значений полей, которые
выбрал запрос в каждой группе
SUM
Сумма всех выбранных значений данного поля в группе
AVG
Среднеарифметическое значение всех выбранных
значений данного поля в группе
MIN
Наименьшее из всех выбранных значений данного поля
в группе
MAX
Наибольшее из всех выбранных значений данного поля в
группе
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Запросы с группировкой имеют следующий синтаксис:
Select < список столбцов результата >
FROM <список исходных таблиц>
Where <условия соединения-фильтрации>
GROUP BY <список столбцов группировки>
Having <условия отбора групп>
При выполнении запросов с группировкой в результирующий набор
данных могут быть включен список столбцов группировки и набор
агрегатных функций. Именование новых столбцов при этом
формируется из имени агрегатных функций и имен столбцов и мало
информативно, поэтому желательно заменить их семантически
значимыми наименованиями. Например,
Сосчитать для каждого студента количество сданных экзаменов.
Сданным считаем экзамен, за который получена оценка больше 2-х.
Обратите внимание, в список вывода можно включать либо полный
список столбцов группировки и набор агрегатных функций, либо часть
списка столбцов группировки и несколько агрегатных функций. Мы
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
фактически при вычислении значений могли бы группировать по
номеру зачетки, но так нам необходимо выводить фамилию студента
и мы должны включить именно этот столбец в список вывода, то и в
список столбцов группировки мы включаем именно его.
Функция count(distinct имя столбца) – считает количество различных
значений столбца в группе. Если всего у данного студента 4 оценки,
среди которых 2 четверки и 2 пятерки, то при выполнении группировки
по номеру зачетной книжки значение функции count(distinct mark) для
данного студента будет равно 2, а значение функции count( mark)
будет равно 4.
Функция Avg() считает среднее арифметическое, но так как при
вычислении среднего значения тип результата совпадает с типом
столбца, для которого это вычисляется, то мы получим
целочисленный результат, который округлен в меньшую сторону.
Например, при вычислении среднего балла за сессию, мы получим
следующий результат:
Рис. 11. Вычисление среднего балла.
Если же мы выведем сумму баллов, полученных каждым студентом
на экзамене и количество полученных им оценок, то можно увидеть
следующий результат (см. рис.12)
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Рис. 12. Расчет суммарного значения экзаменационных оценок и их количества.
Агрегатные функции могут быть использованы не только при
использовании опции Group by в запросе SELECT. Если мы не
используем группировку, то агрегатные функции вычисляются для
всей таблицы. В этом случае для того, чтобы сосчитать количество
строк в таблице необходимо выполнить следующий запрос:
Select count(*) from groops
Мы получили результат – всего 5 групп.
Рис. 13. Вычисление количества строк в таблице.
Функция count(distinct) действует здесь аналогично.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
В части HAVING мы можем задать условия отбора групп, т.е. там
может корректное логическое выражение, которое позволяет отобрать
из всех сформированных групп те, которые удовлетворяют заданным
условиям отбора.
Например, отобрать тех студентов, у которых при сдаче экзаменов
было получено несколько (более одной) пятерок.
Данный запрос может быть сформулирован следующим образом
(см. рис. 13):
Рис.13 Выполнение запроса условиями отбора групп.
Выполнить следующие запросы к учебной БД sessia:
1. Вывести количество специальностей, по которым ведется
подготовка в нашем учебном ВУЗе
2. Вывести для каждой группы количество студентов, которые в
ней учатся.
3. Для каждой специальности вывести количество групп, которые
учатся по данной специальности.
4. Для каждой группы и каждой дисциплины, которую сдавали
студенты этой группы вычислить количество попыток сдачи
экзаменов, максимальную и минимальную оценки, полученные на
экзаменах.
5. Вывести студентов, которые имеют несколько двоек за сессию.
6. Вывести список дисциплин, по которые есть задолжники, т.е.
студенты, которые получили двойку по данной дисциплине и не
пересдали ее на положительную оценку.
7. Вывести список студентов, которые исправили двойки
полученные в первый раз при сдаче экзамена, т.е. эти студенты по той
же самой дисциплине получили положительную оценку после двойки.
8. Вывести список групп, в которых есть двоечники по сессии, т.е.
те кто не пересдал полученную двойку.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
9. Вывести список студентов с указанием количества троек,
полученных каждым студентом в сессию.
10. Вывести список групп, у которых на сессию вынесено более 2-х
экзаменов
Задание 2. Изучение принципов составления подчиненных или
составных запросов.
До сих пор мы не сталкивались с понятием составных запросов.
Составным назовем любой запрос, в котором используются
результаты другого запроса.
Основной и подчиненный запросы могут соединяться операциями
сравнения или предикатами IN, NOT IN, Exist,Not Exist. В таблице 2.
приведена интерпретация предикатов.
Таблица 2.
Допустимы предикаты сравнения
Обозначение
предиката
IN
Смысл
Интерпретация
Входит в
множество
NOT IN
Не входит в
множество
Exist
Существует
Not Exisit
Не существует
Истинен
тогда,
когда
стоящее слева в основном
запросе значение входит
в множество значений,
выводимое подчиненным
запросом.
Истинен
тогда,
когда
стоящее слева в основном
запросе
значение не
входит
в
множество
значений,
выводимое
подчиненным запросом.
Истинен
тогда,
когда
подчиненный
запрос
содержит хотя бы одну
строку.
Истинен
тогда,
когда
подчиненный запрос не
содержит ни одной строки
Синтаксически основной и подчиненный запрос подчиняются
общим правилам языка SQL, однако подчиненный запрос всегда
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
заключается в круглые скобки.
Пример простого подчиненного
запроса: вывести список студентов, которые не получили ни одной
двойки на сессии. Этот запрос нельзя решить просто условием
сравнения полученной оценки с двойкой. При подобном сравнении
происходит построчное сравнение и если хотя бы одна строка
таблицы содержит оценку отличную от двойки, студент уже попадает в
результирующий список, хотя следующая строка с данным студентом
уже может содержать оценку 2. Поэтому этот запрос возможно решить
только перефразируя условия следующим образом найти студентов,
номера зачетных книжек которых не входят в множество номеров
зачетных книжек имеющих хотя бы одну двойку при сдаче экзаменов в
сессию. И в этом случае мы должны применить вложенный запрос.
select Last_Name
from students
where N_zach not in (select N_zach
from sessia
Where mark=2)
Встроенные запросы могут быть зависимыми и независимыми.
Зависимыми мы назовем такой подчиненный запрос, который имеет
различное значение для каждого сравниваемого значения.
Приведенный ранее запрос является независимым, потому что
подчиненный запрос вычисляется один раз для всех сравниваемых
строк. Пример подчиненного зависимого запроса следующий: вывести
список студентов, которые сдали все требуемые экзамены в сессию.
При построении данного запроса для каждого студента необходимо
сравнивать количество экзаменов, которое должно быть сдано и
количество сданных уже экзаменов данным студентом. Для
построения запросов подобного типа необходимо задать условия
взаимосвязи основного и подчиненного запроса. В основном запросе
мы сосчитаем для каждого студента сколько различных дисциплин у
него вынесено на экзамен, а в подчиненном запросе мы сосчитаем
сколько же этот студент уже сдал экзаменов на положительные
оценки. Условием отбора в результирующий список будет равенство
двух полученных чисел. Но для того, чтобы в подчиненном запросе
нам считали количество сданных экзаменов именно для нашего
текущего студента, мы должны в условие фильтрации подчиненного
запроса добавить условие равенства номеров зачетных книжек этих
студентов, а именно выражение:
sessia.N_zach =students.N_zach.
В этом случае общий текс запроса выглядит следующим образом.
select Last_Name
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
from students,Groops,uch_plan
where students.N_groop=Groops.N_groop
and groops.kod_spec=uch_plan.kod_spec
group by Last_Name,N_zach
Having count(distinct Discipline) = (select count(distinct Discipline)
from sessia
where mark >2
and sessia.N_zach =students.N_zach)
Обратите внимание, что в нижнем запросе в части FROM нет
таблицы Students, но транслятор правильно выполнит данный запрос,
потому что он поймет, что мы ссылается на внешний основной запрос.
Выполните следующие запросы:
1. Выведите список студентов, у которых количество полученных
на сессии пятерок равно количеству полученных на сессии троек.
2. Выведите список групп с указанием количества студентов, не
сдавших все экзамены в сессию.
3. Вывести список
дисциплин, которые читаются всем
специальностям (они есть во всех учебных планах).
4. Вывести список групп, в которых нет двоечников, т.е. студентов,
получивших на сессии двойки и не пересдавших этот экзамен.
5. Вывести список студентов, у которых на сессии были только
тройки.
6. Вывести список студентов, которые все, что сдавали сдали на
5, не обязательно они сдали все требуемые экзамены, но те, которые
сдали – сдали на 5.
7. Вывести списки групп, все студенты которых сдали экзамены не
ниже чем на оценку 4.
8. Вывести список дисциплин, по которым не было получено ни
одной двойки на экзаменах
9. Вывести список групп, в которых есть студенты-отличники, т.е.
те, кто сдал все требуемые экзамены на отлично, причем с первого
раза
Задание 3. Выполнить зачетный SQL –тест в системе ВУОКСа.
Последовательность действий:
1. .Поключитесь к системе ВУОСа.
2. Выберите требуемый тест из списка назначенных Вам. (см.
рис. 16)
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Список тестов
Рис. 16 Список назначенных тестов в системе ВУОКСа.
3. Ознакомьтесь с описанием учебной базы данных, которое
приведено в верхней части экрана (см. рис. 17). Имеено описание
базы данных позволит Вам правильно понимать смысл задаваемых
вопросов. Познакомьтесь со структурой таблиц учебной базы данных,
с названиями полей. Имена таблиц приведены слева от каждой
таблицы. Для облегчения таблицы названы латинскими буквами со
знаком подчеркивания и номером. Будьте внимательны при наборе
текстов запросов. Регистры при написании запросов не имеют
значения. Обратите внимание на условие теста, они приведены в
левой нижней части экрана.
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Имена таблиц
Описание БД
Структура таблиц.
Условия теста
Рис. 17 Структура описательной части экрана тестирования.
Если потяните полосу прокрутки в левом нижнем фрейме вниз,
то появятся окошки, в которые надо писать запросы. Тексты вопросов
находятся непосредственно над ними.(см. рис.18).
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
Текст вопроса
Область написания
соответствующего
SQL-запроса,
Рис. 18 Структура фрейма запроса.
После написния любого запроса его можно проверить, для этого
надо нажать кнопку проверить в правом нижнем окне фреймовой
структуры. После выполнения проверки Вам может быть выдан один
из следующих вариантов: «ОК», что означает, что все правильно,
описание синтаксической ошибки, как изображено на рис.19, или
описание семантической ошибки в виде сообщения «Неверный набор
данных» (см. рис. 19.)
Рис. 19. Пример сообщения об ошибочном синтаксисе.
В разделе статистики теста постоянно ведется учет набранных
амии баллов. Следите за этим показателем.
В правом нижнем фрейме работает счетчик оставшегося времени.
Учет времени ведется на сервере, на Вашем экране отображается
МЕЖДУНАРОДНЫЙ БАНКОВСКИЙ ИНСТИТУТ
INTERNATIONAL BANKING INSTITUTE
состояние счетчика, не забывайте отправить последние Ваши ответы
не позднее минуты до окончания теста, иначе ваши результаты могут
быть не засчитаны.
Выполните все задания, предъявите выполненные запросы
преподавателю и получите зачет по данной практической работе.
Download