Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках

ЛАБОРАТОРНАЯ РАБОТА №3

СОЗДАНИЕ ЗАПРОСОВ

Цель работы: научиться создавать различные типы запросов СУБД ACCESS и ANSI SQL.

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

В ACCESS запросы можно создавать двумя способами: QBE-запросы (Query By Example -запрос по образцу) и SQL-запросы (Structured Query Language-структурированный язык запросов), при создании которых применяются операторы и функции языка SQL.

Ход выполнения работы

1. Скопировать файл primer_lab3_sp.mdb в свой каталог и выполнить все задания по методическим указаниям.

2.Затем выполнить индивидуальное задание (№2 и №3 в файле Variants.doc)

Для защиты работы должны:

1. Уметь создавать 6 типов запросов в Access.

2. Объяснить назначение основных операторов SQL (Select, From, Where, Group By, Having, Order By, Into, As). Файл sql.rtf.

ЗАПРОСЫ НА ВЫБОРКУ

Запрос 1. Выбрать сведения о клиентахпоставщиках из Москвы, , проживающих в Бресте и заказавших автомобиль марки Citroenкоторые привозили мониторы в октябре 2004после 01.05.98. В результат запроса вывести поля: ФИОИмяП, Телефон, Город, Модель, Адрес, Дата, Товар заказа. Использовать таблицы Клиенты Товар, Поставка, Поставщики Модели.

Сначала построим QBE-запрос.

Для этого в окнеБазы Данных активизируйте вкладку ЗАПРОСЫ и выполните щелчок на кнопке СОЗДАТЬ. На экране появится диалоговое окно НОВЫЙ ЗАПРОС, в котором необходимо выбрать способ создания запроса (см. рис.1).

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

Выберите способКонструктор и нажмите кнопку ОК. В результате появится пустое окноКонструктора запросов и диалоговое окно Добавление таблицы. Маркируйте таблицуТовар Клиенты и выполните щелчок на кнопке ДОБАВИТЬ. Затем маркируйте таблицуПоставкаиПоставщик Модели и снова выполните щелчок на кнопке ДОБАВИТЬ. Закроите окно, щелкнув на кнопку ЗАКРЫТЬ. Имена таблиц появятся в окне проектирования запроса.

Окно конструктора запроса разделено на две части. В верхней части окна находятся таблицы со списками полей. Между полямиКодТд модели обеих таблицТовариПоставкаи полями КодП таблиц ПоставщикиПоставкапроведеныа линия, определяющая связиь между таблицами (см рис.2). Нижняя часть – бланк запроса

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

Разработка запроса выполняется в несколько этапов;

• Добавление полей в запрос.

• Установка критериев отбора записей.

• Сортировка записей.

Добавить нужные поля в бланк запроса можно или путем перетаскивания их имен из списка, находящегося в верхней части окна конструктора, в строку Поле,.Еще один способ -или двойнымой щелчок на имени поля. Из таблицыПоставщик Клиенты выберите одним из предложенных способов поля ФИОИмяП, АдресГород, Дата заказаТелефон, из таблицыПоставка Модели - поле МодельДата, из таблицы. Товар –поле НaзваниеТ. Теперь необходимо ввести критерии отбора. Формируемый в данном примере запрос должен отбирать данные о клиентах поставщиках из Москвы которые привозили мониторы в октябре 2004из Бреста, заказавших после 01.05.98 г. автомобиль марки Citroen. Поэтому для перечисленных ниже полей установим в строкеУсловие отбора такие критерии:

Адрес Город МоскваБрест

Модель НазваниеТ мониторCitroen

Дата заказа >=#01.10.04# And <#01.11.04#>01.05.98

После ввода каждого из критериев следует нажимать клавишу <ENTER>, вследствие чего ACCESS проверит его синтаксис и нормализует запись в соответствии с правилами записи критериев. Записи в генерируемом при выполнении запроса динамическом наборе данных могут быть отсортированы по алфавиту, по возрастанию или по убыванию. Отсортируем фамилии клиентовпоставщиков в алфавитном порядке. Для этого в строкеСортировкаполя ФИО ИмяП выполните щелчок и в появившемся списке выберите способ сортировки по возрастанию. Окно конструктора запроса представлено на рис.39.

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

Готовый запрос выполняется после щелчка по кнопке c изображением восклицательного знака на панели инструменте Конструктора запросов или командой ЗАПУСК Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru меню ЗАПРОС. Access отобразит на экране результирующий набор записей, которые отобраны из таблицы Клиенты Поставщик в соответствии с заданными критериями (см. рис10рис 4).

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

Запросы, созданные в окне Конструктора запроса, ACCESS автоматически преобразует в SQL-запросы. Чтобы просмотреть инструкцию запроса на SQL в меню ВИД выберите команду РЕЖИМ SQL. На экране появится окно SQL.(рис.115)

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

SQL-запрос можно отредактировать в окне SQL. После закрытия окна изменения автоматически отображаются и в QBE-запросе.

В SQL-окно можно непосредственно вводить команды, составляющие SQL-запрос. Запрос можно выполнить, вызвав из меню ЗАПРОС команду ЗАПУСК или активизировав кнопку с восклицательным знаком на панели инструментов.

Запрос1, написанный на ANSI SQL, выглядит следующим образом:

SELECT ФИО, Модель, Адрес, [Дата заказа]

FROMКлиенты INNERJOINМодели

ONКлиенты.Код_модели= Модели.Код_модели

WHERE ((Модель="Citroen")AND (Адрес=-"Брест")AND ([Дата заказа]>5/01/98)

AND Клиенты.[Код модели]=Модели.[Код модели])

ORDER BY ФИОSELECTИмяП, Город, Телефон, Дата, НазваниеТ

FROM Товар INNER JOIN (Поставщик INNER JOIN Поставка ON Поставщик.КодП = Поставка.КодП) ON Товар.КодТ = Поставка.КодТ

WHERE ((Город="Москва") AND (Дата>=#10/1/2004# ANDДата<#11/1/2004#) AND (НазваниеТ="монитор"))

ORDER BY ИмяП

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках.

Запрос можно использовать для выполнения расчетов и подведения итогов, обобщив данные из исходных таблиц. Для этих целей в ACCESS предусмотрены статистические функции SQL:Sum, Avg,Min, Max, Count и некоторые другие.

Запрос 2. Определить , сколько было поставок каждого товара, максимальную, минимальную и среднюю цену поставки каждого товарасумму заказа, выполненную каждым продавцом. В результат запроса вывести поля: № продавцаНазваниеТ, и 43 вычисляемыхм полям, которым присвоить собственныесоответствующие имена: Число поставок, Макс цена сумма заказа, Мин цена, Средняя цена сумма заказа. Использовать таблицы Товар Клиенты и ПоставкаПродавцы.

Это так называемый запрос с группировкой. После вызова окна конструктора запросов и выполнения всех описанных выше действий необходимо в соответствующих полях задать статистические функцииSum Count, Max, Min и Avg. Статистические функции задают в строкеГрупповая операция окна Конструктора запросов, которая появляется после нажатия кнопки с греческой литерой сигма, расположенной на панели инструментов, или после вызова команды ГРУППОВЫЕ ОПЕРАЦИИ меню ВИД., НовыеСобственные имена полей { Число поставок, Макс цена, Мин цена, Средняя цена Макс сумма заказа и Средняя _сумма заказа} нужно ввести в строкуПоле: конструктора запросов (см. рис.126).

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

Результат запроса представляет собой следующую таблицу:

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

Этот же запрос на ANSI SQL:

SELECT Мах([Сумма заказа]) AS Макс_сумма_заказа,

Аvg([Сумма заказа]) AS Средняя_сумма_заказа,

[N продавца]

FROM Продавцы INNER JOIN Клиенты ON Продавцы.[N продавца] = Клиенты.[N продавца]

SELECT Товар.НазваниеТ, Count(Поставка.[№ Записи]) AS [Число поставок],

Max(Поставка.Цена) AS [Макс цена],

Min(Поставка.Цена) AS [Мин цена],

Avg(Поставка.Цена) AS [Средняя цена]

FROM Товар INNER JOIN Поставка ON Товар.КодТ = Поставка.КодТ

GROUP BY Товар.НазваниеТ;

GROUP BY Продавцы.[N продавца];

Запрос 3:Определить количество поставок из Санкт-Петербурга. В результат запроса вывести поля: Город, Число поставок. Использовать таблицы Поставка и Поставщик.

Определить максимальную и минимальную сумму заказа, выполненную продавцом Козловым. В результат запроса вывести поля: №_продавца, ФИО, Макс_зак, Мин_зак. Вычисляемым полям присвоить собственные имена: Макс зак-. Мин зак. Использовать таблицыКлиенты и Продавцы.

Действия по конструированию запроса аналогичны описанным выше, только в строкуУсловие отбора Конструктора запросов необходимо ввести критерий отбора по полю Город ФИО-КозловСПБ (рис 8).

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

Результат выполнения запроса представлен в таблице на рис. 15.9.

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

Этот же запрос на ANSI SQL:

SELECTПоставщик.Город, Count(Поставка.[№ Записи]) AS [Число поставок]

FROMПоставщикINNER JOINПоставкаONПоставщик.КодП=Поставка.КодП

GROUP BYПоставщик.Город

HAVINGПоставщик.Город="Спб";

ЗАПРОСЫ НА ОБНОВЛЕНИЕ

Часто возникает необходимость изменить значения какого-либо поля в группе записей таблицы, отобранных на основании определенного критерия или во всех записях таблицы (например, в связи с инфляцией повысить заводскую цену каждой модели автомобиля на определенный процент или рассчитать значение какого-либо поля по уже внесенным в таблицу данным). Для того, чтобы не вводить заново новые значения во все записи, используется так называемый ЗАПРОС НА ОБНОВЛЕНИЕ. Команда ОБНОВЛЕНИЕ вызывается из меню ЗАПРОС во время проектирования QBE-запроса. В этом случае в проект запроса добавляется строка ОБНОВИТЬ, которая предназначается для указания новых значений полей таблицы. В качестве таковых могут выступать и вычисляемые выражения. После нажатия кнопки ЗАПУСК (восклицательный знак) ACCESS укажет в специальном диалоговом окне, сколько записей изменится в таблице, и потребует подтвердить изменения. Рассмотрим на примере.

Запрос 4: Заполнить поле Стоимость таблицыПоставка, рассчитав его значения по следующей формуле:

Стоимость = Цена*Количество

Для реализации этого запроса загружаемКонструктор запросов, затем в меню ЗАПРОС вызываем команду ОБНОВЛЕНИЕ, добавляем таблицу Поставка, выбираем поле Стоимость и в появившуюся строку ОБНОВИТЬ Конструктора запросов вводим выражение:

[Цена]*[Количество]

Чтобы расчет выполнялся только для тех записей, для которых стоимость ещё не вычислена, в строке Условие отбора пишем выражение Is Null(рис. 10).Иначе пересчет выполнялся бы для всех записей в таблице и при большом их количестве это занимало бы лишнее время.

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

После запуска запроса на выполнение появится диалоговое окно (рис 11), в котором нужно нажать кнопку «Да».

Примечание: если имя поля содержит знак пробела, то его следует писать в [] квадратных скобках - student2.ru

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

Текст этого запроса на ANSI SQL выглядит следующим образом:

UPDATE ПоставкаSET Поставка.Стоимость = [Цена]*[Количество]

WHERE (((Поставка.Стоимость) Is Null));

Наши рекомендации