Задание 22. Составление простейших однотабличных запросов на выборку данных В ходе выполнения настоящего задания требуется создать запросы на выборку из базы данных «Библиотечка» (задание 21), с помощью которых получить следующую информацию:
Вывести список книг одного автора (Драйзер Т.) и отсортировать результаты по году издания в порядке убывания.
Вывести список книг, включающий книги А.С.Пушкина объемом не более 200 страниц и книги Л.Н.Толстого объемом не менее 400 страниц.
Вывести список книг авторов с фамилией «Толстой», отсортированный по дате поступления, используя проверку на соответствие шаблону.
Вывести список книг изданных с 1975 по 2000 год включительно, с сортировкой по автору и дате поступления.
Вывести список книг изданных в 1975 - 1985 гг.,1987 г.,1991-2000 гг., с сортировкой по автору и дате поступления.
Вывести список, включающий авторов и названия книг, авторы которых входят в заданный список (Драйзер Т., Хейли А., Чейз Д.Х.), с сортировкой результатов по автору, используя оператор IN (проверка на принадлежность к множеству).
Сформулировать эквивалентный запрос, используя логическую операцию OR.
Вывести список, включающий авторов, названия и год издания книг, изданных не раньше 1975 года за исключением книг М.Ю.Лермонтова, А.Н.Толстого, Т. Драйзера.
Показать авторов и названия книг, к которым в базе данных имеется комментарий, используя проверку на значение NULL.
Вывести список, включающий авторов и названия книг, которые относятся к серии PocketBook, а также книг без комментария объемом более 500 страниц.
Показать количество книг каждого автора, которое имеется в библиотеке, используя группировку и статистическую функцию COUNT.
Выполнить тот же запрос, что и в п.11, при дополнительном условии, что для каждого из выбранных авторов имеется не менее 2 книг. При этом использовать условие отбора для групп (предложение HAVING).
Выполнить тот же запрос, что и в п.11, при дополнительном условии, что или для каждого из выбранных авторов имеется не менее 3 книг, или средний объем его книг составляет не менее 300 страниц.
Вывести данные о количестве книг, относящихся к сериям «Серия PocketBook» и «Букинистическое издание». В результаты запроса включить название серии и количество книг.
Отобразить данные о книгах (автор, название, год издания, количество страниц), поступивших в библиотеку в 2001 году, используя функцию EXTRACT.
Вывести данные о том, книги каких годов издания имеются в библиотеке в количестве не менее 2 книг. В результаты запроса включить год издания и количество книг.
Показать данные о книгах библиотеки (автор, название, год издания, количество страниц) и сколько прошло лет между изданием книги и ее поступлением в библиотеку. Для этого включить в запрос вычисляемое поле DELAY (задержка). Отсортировать результаты по этому полю.
Вывести данные о книгах (те же, что и в предыдущей задаче), для которых между изданием книги и ее поступлением в библиотеку прошло не менее 2 лет.
Вывести данные о книге с наиболее поздним годом издания.
Вывести список авторов, у которых в библиотеке нет книг 2001-2003 годов издания.
Вывести список авторов, у которых в библиотеке есть книги разных лет издания. Решить задачу двумя способами: а) с использованием секции HAVING; б) с использованием рекурсивной связи между таблицами.
Вывести список авторов, имеющих книги, у которых интервал между годами издания составляет не менее 10 лет.
Вывести список книг, написанных одним и тем же автором и поступивших в библиотеку в разные годы.
Вывести список книг, написанных одним и тем же автором и поступивших в библиотеку в одном и том же году.
Вывести список книг, написанных одним и тем же автором и отличающихся по объему более чем в 2 раза.
С целью управления выполнением запросов и обеспечения интерфейса для пользователя разработать приложение в среде Delphi, на основе приложения TaskBooks, созданного в задании 21. К этому приложению добавить новую форму для работы с запросами и соответствующий программный модуль. Эта форма должна содержать список имен запросов (имена должны отражать содержание запроса и быть по возможности понятными для пользователя. Они, вообще говоря, могут не совпадать с именами файлов, в которых сохранены запросы в каталоге БД). Кроме того, на форме должны быть компоненты, отображающие текст запроса и результаты его выполнения, и кнопки для запуска и закрытия запроса. Методические указания:
I. Создание и тестирование запросов.
Запустите Database Desktop.
Установите рабочий каталог Books, с которым DBD работает по умолчанию, используя команду меню File / Working Directory в окне DBD. Для создания нового запроса вызовите команду меню File / New / SQL File.
Составьте на языке SQL текст запроса, соответствующего п. 1 задания (см. выше) и введите его в окне для ввода запроса. Запустите запрос на выполнение, используя кнопку «Run SQL» на панели инструментов в окне DBD. Если DBD выдает сообщения о синтаксических ошибках (т.е. о нарушениях правил языка SQL в тексте запроса), то проанализируйте текст запроса и исправьте ошибки. Если запрос успешно выполнен, то закройте результаты и сохраните текст запроса как файл с расширением .sql (например BksDr.sql) в рабочем каталоге.
Повторите указанные действия (начиная с вызова команды меню File / New / SQL File) для каждого из пп. 2-25 задания.
II. Создание формы для работы с запросами.
Запустите Delphi и откройте приложение TaskBooks. Создайте новую форму с помощью команды File/New Form. Сделайте заголовок формы «Запросы» (свойство Caption) и разместите на ней следующие компоненты:
3 стандартных кнопки (Button1, Button2, Button3). Сделайте надписи этих кнопок (свойство Caption) OpenQuery, CloseQuery, Exit.
В верхней части окна формы добавить метку (Label1) и непосредственно под ней комбинированный список (ComboBox1). Сделайте надпись (свойство Caption) на этой метке «Список запросов»
Ниже добавить метку (Label2) и непосредственно под ней многострочный редактор (Memo1). Задайте отображение полос прокрутки у компонента Memo1, установив свойство ScrollBars – ssBoth. Сделайте надпись (свойство Caption) на этой метке «Текст запроса».
Ниже добавить метку (Label3) и непосредственно под ней компонент DBGrid1. Сделайте надпись (свойство Caption) на этой метке «Результаты запроса».
Добавить на форму невизуальные компоненты Query1, DataSource1. Установите свойство компонента DataSource:
DataSet (имя набора данных) – Query1.
Установите свойство компонента DBGrid:
DataSource – DataSource1. Сохраните проект и назовите новый модуль Queries
Перейдите на форму Form1 и добавьте кнопку, установите для нее свойство Caption - Queries
Используя команду File/Use Unit введите в модуль Queries оператор uses ViewTab; а в модуль ViewTab оператор uses Queries;
Кнопка Queries на главной форме (Form1) должна обеспечивать переход на форму «Запросы» (Form2). Поэтому для этой кнопки создайте обработчик события OnClick и включите в него оператор Form2.ShowModal;
Кнопка Exit, созданная в п.1), должна обеспечивать закрытие формы «Запросы» и переход на главную форму. Поэтому создайте для этой кнопки обработчик события OnClick и включите в него оператор Close;
Проверьте переходы между формами. Сохраните проект.
III. Разработка программного кода и организация интерфейса для работы с запросами.
Создайте в модуле ViewTab две глобальные переменные dbn, tn типа string, определяющие путь к каталогу БД и имя файла таблицы; описание этих переменных поместите в разделе interface после оператора var Form1: TForm1; Для присвоения начальных значений этим переменным создайте обработчик события FormCreate для главной формы и включите в него операторы dbn:='I:\...\Books\'; tn:='CatalogBooks.db'; Внесите изменения в обработчик события FormActivate, заменив строковые значения в правых частях на имена соответствующих переменных.
Для заполнения списка запросов при создании соответствующей формы (Form2), создайте обработчик события FormCreate для этой формы и включите в него операторы вида ComboBox1.Items.Add(‘Книги Драйзера’); Количество этих операторов и значения строковых констант в скобках (названия запросов) определяются количеством и содержанием создаваемых запросов (см. пп.1-25 текста задания). Для того, чтобы указать, к какой БД будет обращаться запрос Query1, включите в обработчик события FormCreate оператор Query1.DatabaseName:=dbn;
Создайте обработчик события OnClick для компонента ComboBox1. При выполнении этой процедуры пользователь выбирает из списка имя одного из запросов, в результате чего текст этого запроса должен загрузиться в редактор Memo1. Опишите в этой процедуре переменные n0 типа integer и Fname, Path типа string. Переменные Fname, Path будут определять имя файла с текстом запроса и полный путь к этому файлу соответственно. Переменная n0 будет определять номер выбранного пункта в списке ComboBox1, поэтому в начале выполняемой части процедуры должен быть оператор n0:= ComboBox1.ItemIndex; Далее должны идти условные операторы определяющие выбор одного из файлов с текстами сохраненных вами запросов в зависимости от значения n0; эти операторы имеют вид: if n0=0 then Fname:='BksDr.sql'; Число этих операторов должно соответствовать числу пунктов в списке ComboBox1. Далее, в конце процедуры должны быть следующие операторы Path:=dbn+Fname; Memo1.Lines.Clear; Memo1.Lines.LoadFromFile(Path); Первый из этих операторов определяет полный путь к файлу с текстом запроса, второй очищает поле компонента Memo1, третий загружает в него текст запроса из этого файла.
Создайте обработчики события OnClick для кнопок OpenQuery, CloseQuery и напишите для них программный код. В первом из них должна быть предусмотрена предварительная проверка наличия текста в поле Memo1, а в случае отсутствия текста должно выдаваться сообщение на экран «Текст запроса отсутствует», после чего предусмотреть завершение данной процедуры. Свойству Query1.SQL должно быть присвоено значение, содержащееся в компоненте Memo1 и должен быть выполнен запуск запроса на выполнение с помощью одного из операторов Query1.Open; или Query1.Active:=True; Второй из этих обработчиков должен закрывать запрос с помощью одного из операторов Query1.Close; или Query1.Active:=False;
Сохраните проект. Скомпилируйте проект и исправьте обнаруженные ошибки. После исправления ошибок выполните приложение. Используя разработанный интерфейс, выберите из списка поочередно каждый из запросов, запустите на выполнение и просмотрите результаты.
|