Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая по базам данных.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
278.53 Кб
Скачать
  1. Алгоритм построения запроса

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

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

Однако этому предшествует несколько проверок.

Программа построена таким образом, что если выбраны отношения, атрибуты на вывод, но не задано ни одного условия, это воспринимается как попытка построить внешнее полное соединение (outter full join). Внешнее соединение строится на основе заданных внешних ключей только в том случае, когда задано 2 разные таблицы и ни задано условий. Но если заданы 2 одинаковые таблицы с разными псевдонимами, то строится обычный запрос с разделом where.

Необходимо заметить, что если не будет задано ни одного условия и в таблицах не будет определено внешних ключей, то будет построено декартово произведение двух отношений.

Если все-таки строится обычный запрос, то в цикле, параллельно строятся все разделы запроса.

Итерация цикла происходит следующим образом:

Если в текущем просматриваемом столбце поставлена галка, то этот атрибут добавляется в переменную select : string в формате имя/псевдоним_таблицы . имя_атрибута.

Если третья строка не пуста, то если в зависимости от её значения в переменную orderby : string добавляется имя/псевдоним_таблицы. имя_атрибута и если выбрано упорядочивание по убыанию добавляется служебное слово desc.

Формирование раздела where зависит от типа строящегося запроса, и если строится внешнее соединение, этот раздел начинается с “on”, иначе с “where”. Далее просматривается соответствующий итерации элемент массива frm, в котором содержатся условия, и последовательно добавляются в переменную where , разделенные скобками и словом “and” (в случае с внешним соединением эти элементы просто будут пустыми).

После окончания цикла в раздел where необходимо добавить связи по внешним ключам (процедура AddForCom). Для этого просматривается весь список используемых отношений UseTables, и для каждого её атрибута вызывается функция getforeignkey из модуля SysCat. Но Эта функция вернет имя таблицы и имя атрибута, а если была задействована не одна подобная таблица, то необходим псевдоним, поэтому приходится еще раз просматривать UseTAbles и добавлять в where связи со всеми таблицами с заданным именем, то есть каждый внешний ключ связывается со всеми таблицами, с этим именем.

Формирование раздела from идет отдельно и зависит от того, как прошли проверки на внешнее соединение. В from добавляются все таблицы и псевдонимы UseTAbles. Если строится внешнее соединение, то ожидается, что в этом разделе будет всего два имени (имя_таблицы as псевдоним) разделенных фразой “outer full join”.

Если стоит галка на CheckBox “Исключая дубли”, то к разделу select добавится слово distinct.

После этого все переменные проверяются на пустоту и собираются в одну, в которой и содержится корректно составленный SQL запрос.

  1. Тестирование и пример работы программы

Допустим имеется 2 отношения: Сотрудник (Номер_Удостоверения, ФИО, Адрес), и Должности (Номер_сорудника, Должность, зарплата), причем Должности.Номер_сотрудника является внешним ключом для Сотрудник.Номер_удостоверения.

Пусть нам необходимо найти сотрудника, который получает больше остальных среди всех, чье ФИО начинается на “Ъ”.

Для решения нам будет необходимо добавить одну таблицу Сотрудник и 2 таблицы Должности (с разными псевдонимами). Отношению сотрудник псевдоним можно не задавать.

Рисунок 4 - Добавление таблиц для построения запроса

Зададим условие на атрибут Сотрудник.ФИО.

Рисунок 5 - Условие на атрибут Сотрудник.ФИО

Зададим Условие на t1.зарплата.

Рисунок 6 - Условие на t1.зарплата

Поставим галку исключая дубли.

Рисунок 7. Ограничение на исключение дублей.

В результате, получился следующий запрос:

select distinct Сотрудник.ФИО from Сотрудник, Должности as t1, Должности as t2 where (Сотрудник.ФИО like 'Ъ%') and (t1.Зарплата>=t2.Зарплата) and (Сотрудник.Номер_удовстоврения=t1.Номер_сотрудника)and (Сотрудник.Номер_удовстоврения=t2.Номер_сотрудника).

Заключение

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