LAB19 (988808), страница 3
Текст из файла (страница 3)
Таким образом, в верхней области окна необходимо ввести:
select fio, data_rogden, spec, kat_obuch.kat_obucheniya,
vuz.uch_zavedenie, mo, gok
from poss, kat_obuch, vuz
where vuz_k in (select cod_vuza from vuz_gorod
where cod_goroda='001')
and kat_obuch_k between '03' and '04'
and gp='89'
and kat_obuch_k=kat_obuch.cod
and vuz_k=vuz.cod
order by 5, 3 [Ctrl]+[Enter]
где '001' - код города Москвы.
Отчет будет представлен в нижней области окна:
<окно>
2) Выполнение запроса по пяти таблицам БД с использованием подзапроса со сложным условием выборки данных,
например:
выдать список аспирантов и стажеров, обучаемых в городах Москва, Санкт-Петербург и Воронеж и заканчивающих учебу в 1993 и 1995 г.г.; схема выдачи отчета должна включать поля: ФИО, дата рождения, название учебного заведения, пол, семейное положение, специальность, категория обучения, месяц приема, год приема, месяц окончания, год окончания; данные отсортировать по учебным заведениям и годам окончания.
В этом запросе требуется, во-первых: выдать значения трех полей, не принадлежащих структуре таблицы poss, а именно: названия учебных заведений, названия семейных положений и названия категорий обучения; во-вторых: учебные заведения должны быть московскими, санкт-петербургскими и воронежскими, т.е. необходимо сделать подзапрос по таблице vuz_gorod, указав в списке выборки код учебного заведения, а в условии выборки - три значения городов - Москва, Санкт-Петербург и Воронеж.
Поэтому в списке выборки запроса для полей учебное заведение, семейное положение и категория обучения должны быть указаны составные имена (т.е. с именем таблицы), в предложении from должны быть записаны четыре имени таблиц, а в предложении where для поля код учебного заведения должны быть использованы функция IN и подзапрос, а также должны быть указаны три условия соединения таблиц (таблицы poss с таблицей vuz по полю код учебного заведения; таблицы poss с таблицей family по полю код семейного положения; таблицы poss с таблицей kat_obuch по полю код категории обучения).
Таким образом, в верхней области окна необходимо ввести:
select fio, data_rogden, vuz.uch_zavedenie, pol,
family.family_status, spec, kat_obuch.kat_obucheniya,
mp, gp, mo, gok
from poss, vuz, family, kat_obuch
where vuz_k in (select cod_vuza from vuz_gorod
where cod_goroda='001' or cod_goroda='002' or
cod_goroda='006')
and (kat_obuch_k between '07' and '08' or
kat_obuch_k between '10' and '11')
and gok in ('93', '95')
and vuz_k=vuz.cod
and sem_polog_k=family.cod
and kat_obuch_k=kat_obuch.cod
order by 3, 11 [Ctrl]+[Enter]
где '001' - код города Москвы;
'002' - код города Санкт-Петербург;
'006' - код города Воронеж;
'07' - код, соответствующий категории обучения "аспирант";
'08' - код, соответствующий категории обучения "аспирант-
заочник";
'10' и '11' - коды, соответствующие категориям
обучения "повышение квалификации" и
"стажер".
Отчет будет представлен в нижней области окна:
<окно>
Варианты заданий на выполнение лабораторной работы № 4 приведены в приложении III.
ЛАБОРАТОРНАЯ РАБОТА № 5
Цель:
-
Научиться выполнять одномерные статистические запросы по одной и по нескольким таблицам БД.
-
Практически освоить создание и использование простых хранимых процедур для выполнения запросов.
Справочный материал:
-
Конспект курса.
Используемые технические средства:
1. SQL-сервер, работающий на компьютере Pentium 120/32/2,1 под управлением операционной системы Windows NT.
2. Open-Client, работающий на компьютере PC 486/DX4/100/8/1,08/SVGA1MPCI под управлением операционной системы Windows95.
Упражнения:
Перед выполнением лабораторной работы необходимо войти в сеть, затем в систему SYBASE for WINDOWS95 и диалоговый SQL, а также установить связь пользователя с базой данных (аналогично описанному сценарию в лабораторной работе № 1).
Реляционные СУБД, например: SYBASE SYSTEM 11, специально приспособлены для выполнения списковых и персональных запросов (в результирующей форме отчета содержится совокупность документов (записей) в виде списка значений атрибутов (полей)). Проблемы возникают при выполнении статистических запросов.
Статистическим называется запрос, в результирующей форме отчета которого содержится перечень различных значений одного, двух и более атрибутов с количественными характеристиками этих значений. Количественная характеристика отдельного значения атрибута (поля) означает количество экземпляров этого значения, встретившихся в результате выполнения запроса. Например, количество учащихся по каждому учебному заведению России.
Если количественные характеристики выдаются по одному атрибуту, то такой запрос называется одномерным статистическим запросом. Если количественные характеристики выдаются по двум атрибутам, т.е. выдаются количественные характеристики различных значений по первому атрибуту и, кроме того, для каждого значения первого атрибута выдаются количественные характеристики различных значений по второму атрибуту, то такой запрос называется двумерным статистическим запросом. Например, количество учащихся по каждому учебному заведению России и количество учащихся по каждому шифру специальностей в каждом из этих учебных заведений.
И так далее, если количественные характеристики выдаются по n атрибутам, такой запрос называется n-мерным статистическим запросом. Кроме этого, в статистических запросах может использоваться операция соединения таблиц, поэтому статистические данные могут выдаваться по атрибутам таблиц, связанных с той таблицей, по которой выполняется запрос. Например, количество учащихся по каждому городу России (для этого запроса необходимо соединение таблиц poss и vuz_gorod по полю код учебного заведения).
Первый Вариант запроса к базе данных
Выдать статистику по приему учащихся 1990 и 1991 годов в России по всем специальностям. Отчет должен начинаться с общей цифры - всего по приему 90-91 г.г. Далее - таблица, включающая перечень шифров специальностей с цифрами, не равными нулю (цифра - это количество учащихся по указанной специальности; если количество учащихся по специальности равно нулю, то этот шифр специальности не включается в отчет).
В этом запросе требуется, во-первых: выдать общее количество учащихся, принятых на учебу в 1990-91 г.г; во-вторых: распределить это количество по разным шифрам специальностей, т.е. определить количественные характеристики для каждого шифра (значения) специальностей.
Другими словами, необходимо выполнить два запроса:
1) выполнить запрос с условием выборки по году приема (значения '90' и '91'), используя в списке выборки агрегатную функцию count(*), предназначенную для подсчета общего количества записей по запросу;
2) выполнить запрос с условием выборки по году приема (значения '90' и '91'), используя предложение group by для группирования значений по полю "специальность" и агрегатную функцию count(*) в списке выборки, предназначенную для оценки количества значений специальностей в каждой группе.
Таким образом, в верхней области окна необходимо ввести:
1) select count(*) from poss
where gp='90' or gp='91' [Ctrl]+[Enter]
В нижней области окна будет представлена цифра, равная общему количеству учащихся, принятых на учебу в 1990 и 1991 г.г.:
<окно>
2) select spec, count(*) from poss
where gp='90' or gp='91'
group by spec [Ctrl]+[Enter]
Отчет будет представлен в нижней области окна:
<окно>
Замечание. Имя поля, по которому выдается статистика, задается и в списке выборки, и в структуре group by.
Второй вариант запроса к базе данных
Выдать статистику по выпускникам 1996 года в России по всем учебным заведениям. Отчет должен начинаться с общей цифры - всего по выпуску 1996 года. Далее - таблица, включающая перечень названий учебных заведений с цифрами, не равными нулю (цифра - это количество выпускников 1996 года по указанному учебному заведению; если количество выпускников 1996 года в учебном заведении равно нулю, то это учебное заведение в отчет не включается).
Этот запрос выполняется аналогично запросу первого варианта, за исключением того, что в отчете необходимо выдать значения атрибута (названия учебных заведений), не принадлежащего структуре таблицы poss. Другими словами, в этом запросе необходимо в предложении where (условии выборки) добавить условие соединения двух таблиц (poss и vuz) по полю код учебного заведения, в предложении from имя таблицы vuz, а в списке выборки и в предложении group by указать составное имя для поля название учебного заведения (с именем таблицы).
Поэтому здесь необходимо выполнить два следующих запроса:
1) выполнить запрос с условием выборки по году окончания (значение '96'), используя в списке выборки агрегатную функцию count(*), предназначенную для подсчета общего количества записей по запросу;
2) выполнить запрос с условием выборки по году окончания (значение '96') и с условием соединения таблиц poss и vuz по полю код учебного заведения, используя предложение group by для группирования значений по полю "название учебного заведения" и агрегатную функцию count(*) в списке выборки, предназначенную для оценки количества значений (названий учебных заведений) в каждой группе.
Таким образом, в верхней области окна необходимо ввести:
1) select count(*) from poss
where gok='96' [Ctrl]+[Enter]
В нижней области окна будет представлена цифра, равная общему количеству выпускников 1996 года в России:
<окно>
2) select vuz.uch_zavedenie, count(*)
from poss, vuz
where gok='96'
and vuz_k=vuz.cod
group by vuz.uch_zavedenie [Ctrl]+[Enter]
Отчет будет представлен в нижней области окна:
<окно>
Третий вариант запроса к базе данных
Выдать статистику по учащимся во всех городах России. Отчет должен начинаться с общей цифры - всего учащихся по России. Далее - таблица, включающая перечень названий городов с цифрами, не равными нулю (цифра - это количество учащихся в указанном городе; если количество учащихся в городе равно нулю, то этот город в отчет не включается).
Этот запрос выполняется аналогично запросу второго варианта, за исключением того, что вместо названий учебных заведений необходимо в отчете выдать названия городов. Для этого нужно вместо соединения таблиц poss и vuz по полю код учебного заведения выполнить соединение таблиц poss и vuz_gorod по полю код учебного заведения, так как поле "название города" принадлежит структуре таблицы vuz_gorod.
Поэтому здесь необходимо выполнить два следующих запроса:
1) выполнить запрос без условия выборки, используя в списке выборки агрегатную функцию count(*) для подсчета общего количества учащихся России;
2) выполнить запрос с условием соединения таблиц poss и vuz_gorod по полю код учебного заведения, используя предложение group by для группирования значений по полю "название города" и агрегатную функцию count(*) в списке выборки для оценки количества значений (названий городов) в каждой группе.
Таким образом, в верхней области окна необходимо ввести:
1) select count(*) from poss [Ctrl]+[Enter]
В нижней области окна будет представлена цифра, равная общему количеству учащихся в России:
<окно>
2) select vuz_gorod.nazvanie_goroda, count(*)
from poss, vuz_gorod
where vuz_k=vuz_gorod.cod_vuza
group by vuz_gorod.nazvanie_goroda [Ctrl]+[Enter]
Отчет будет представлен в нижней области окна:
<окно>
Возможности диалогового SQL в плане выполнения сложных запросов к БД весьма ограничены (ограничения связаны с трудоемкостью набора длинных предложений SELECT и с реляционной ограниченностью языка SQL). Одним из способов преодоления ограничений является использование хранимых процедур, описанных в конспекте курса.
Для выполнения сложного запроса требуется, как правило, набирать очень длинное предложение SELECT (несколько предложений SELECT). На это необходимо довольно большой промежуток времени. Если сложный запрос делается очень часто, то его предложение SELECT (предложения SELECT) можно оформить как хранимую процедуру (ввести один раз), а затем для выполнения этого запроса запустить эту процедуру.
Для выполнения одномерных статистических запросов в диалоговом SQL требуется задавать два предложения SELECT и получать два результата. Чтобы объединить оба результата в один отчет, необходимо задать оба предложения SELECT в одной хранимой процедуре.
Пример создания процедуры (смотри первый вариант запроса):
create procedure zapr1 as
select count(*) from poss where gp='90' or gp='91'
select spec, count(*) from poss
where gp='90' or gp='91' group by spec [Ctrl]+[Enter]
Для выполнения этого запроса нужно запустить эту процедуру, т.е. в верхней области окна необходимо ввести:
zapr1 [Ctrl]+[Enter]