Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1к 1семестр / INFORMATIKA / Создание БД

.pdf
Скачиваний:
121
Добавлен:
02.04.2015
Размер:
2.76 Mб
Скачать

71

7.Выполните запрос, щелкнув на кнопке Выполнить (Run) или Режим (View) на ленте конструктора запросов в группе Результаты (Results). Число записей в таблице запроса будет равно числу записей в подчиненной таблице ПОСТАВКА_ПЛАН.

8.Если для связи таблиц не было задано параметра обеспечения целостности данных, в таблицу ПОСТАВКА_ПЛАН можно было бы включить записи с кодами товара, не содержащимися в таблице ТОВАР. Такие записи не были бы включены в таблицу запроса, так как первый способ объединения требует наличия связанных записей в таблице ТОВАР. Таким образом, по ряду товаров необходимые сведения были бы потеряны.

9.Снова откройте для связи таблиц окно Параметры объединения (Join Properties) (рис. 55) и выберите второй способ объединения записей. Обратите внимание: на линии связи появилась стрелка, направленная от таблицы ТОВАР к таблице ПОСТАВКА_ПЛАН (рис. 56). Она указывает на необходимость включения в таблицу запроса и тех записей из таблицы ТОВАР, для которых нет связанных в ПОСТАВКА_ПЛАН.

Рис. 56. Схема данных запроса при объединении таблиц вторым способом

10.Выполните запрос. При объединении таблиц вторым способом к записям, полученным первым способом, добавились записи из таблицы ТОВАР, не имеющие связанных записей в таблице ПОСТАВКА_ПЛАН. Каждая такая запись дополнена полями Количество и Код товара из таблицы ПОСТАВКА_ПЛАН, которые содержат значения Null. Такая ситуация возникла вследствие того, что в плане отсутствуют заказы на ряд товаров. На рис. 57 таких записей две, для них поля с количеством и кодом товара, остались пустыми.

72

Рис. 57. Результат объединения таблиц ТОВАР и ПОСТАВКА_ПЛАН вторым способом

Обратите внимание

Null ― это константа, которая означает, что поле не содержит данных. Поле получает значение Null, когда неизвестно его содержимое. Такое поле не следует путать с полем, содержащим пустую строку, хотя выглядят они одинаково. Значение Null можно ввести в поле или использовать в выражениях и запросах для указания отсутствующих или неизвестных данных. Пустая строка служит для указания того, что строковое значение для этого поля отсутствует. Для ввода пустой строки с клавиатуры следует ввести два символа прямых кавычек без пробела ("").

11.При выборе третьего способа объединения записей в таблице запроса к записям, полученным первым способом, добавились бы записи из таблицы ПОСТАВКА_ПЛАН, не имеющие связанных записей в таблице ТОВАР. Каждая такая запись дополнена полем НАИМ_ТОВ, которые содержат значения Null. Такая ситуация возникает, если в таблицу ТОВАР не внесены сведения о новых товарах или договор заключен на несуществующий товар. В рассматриваемом примере в таблице ПОСТАВКА_ПЛАН не может существовать записей с указанием товаров, отсутствующих в таблице ТОВАР, так как для связи этих таблиц установлен параметр обеспечения целостности.

12.Рассмотрев, как формируются записи запроса, перейдите к выполнению их группировки. Это позволит решить поставленную задачу. Выполните команду Итоги (Totals) из группы Показать или скрыть (Show/Hide). В бланке запроса в строке Групповая операция (Total) в столбце КОЛ_ПОСТ замените слово

Группировка (Group By) на функцию Sum.

73

13.Выполните запрос. На рис. 58 приведена таблица запроса, полученная путем объединения записей таблиц ПОСТАВКА_ПЛАН и ТОВАР вторым способом и последующей их группировки. Таблица содержит не только суммарное количество каждого из заказанных товаров. При выбранном способе объединения записей в результат попали и те товары, по которым не было сделано заказов.

Рис 58. Результат группировки при объединении записей таблиц вторым способом

14.Чтобы отобрать только те товары, по которым не сделано заказов, введите в

столбец, где подсчитывается суммарное количество, в строку условие отбора значение Null. Выполните запрос, чтобы проверить результат.

Упражнение 2. Параметры объединения в инструкциях

SQL

1.Откройте в режиме конструктора созданный в предыдущем упражнении запрос, где для исходных таблиц установлен второй способ объединения и для поля КОЛ_ПОСТ задано условие отбора Is Null.

2.Перейдите в режим SQL, выбрав его из списка кнопки Режим (View). Инструкция SQL для этого запроса будет иметь вид:

SELECT ПОСТАВКА_ПЛАН.КОД_ТОВ, ТОВАР.НАИМ_ТОВ, Sum(ПОСТАВКА_ПЛАН.КОЛ_ПОСТ) AS [Sum-КОЛ_ПОСТ]

FROM ТОВАР LEFT JOIN ПОСТАВКА_ПЛАН

ON ТОВАР.КОД_ТОВ = ПОСТАВКА_ПЛАН.КОД_ТОВ GROUP BY ПОСТАВКА_ПЛАН.КОД_ТОВ, ТОВАР.НАИМ_ТОВ

HAVING (((Sum(ПОСТАВКА_ПЛАН.КОЛ_ПОСТ)) Is Null));

Данная инструкция SELECT использует для формирования структуры таблицы запроса помимо двух полей из таблиц базы данных, статистическую функцию Sum. С помощью предложения AS, полю, формируемому этой функцией, присваивается альтернативное имя.

Замечание

Имя поля, введенное в его свойство Подпись, автоматически не переносится в инструкцию SQL. Чтобы в инструкции SELECT в предложении AS полю присваивалось

74

альтернативное имя, оно должно быть в бланке запроса введено перед именем поля в следующем виде Заказано товаров:КОЛ_ПОСТ.

Предложение FROM данной инструкции SELECT определяет таблицы, которые служат источником данных для данного запроса, и способ их объединения LEFT JOIN. При этом указывается по какому полю связываются таблицы — КОД_ТОВ:

ON ТОВАР.КОД_ТОВ = ПОСТАВКА_ПЛАН.КОД_ТОВ

Операция LEFT JOIN используется для создания левого внешнего объединения. Левое внешнее объединение включает помимо связанных записей все записи из первой (левой) таблицы, даже если для них нет связанных записей во второй (правой) таблице.

3.Вернитесь в режим конструктора и измените способ объединения таблиц запроса, выбрав вместо второго параметра объединения третий. Предложение FROM для такого запроса будет иметь вид:

FROM ТОВАР RIGHT JOIN ПОСТАВКА_ПЛАН

ON ТОВАР.КОД_ТОВ = ПОСТАВКА_ПЛАН.КОД_ТОВ

Операция RIGHT JOIN используется для создания правого внешнего объединения. Правое внешнее объединение включает помимо связанных записей все записи из второй (правой) таблицы, даже если для них нет связанных записей в первой (левой) таблице.

Если просмотреть запрос, в котором выбран первый способ объединения таблиц, то в предложении FROM будет указана соответствующая операция INNER JOIN.

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

4.В режиме конструктора дополните запрос полем ЦЕНА, в строке Групповая операция замените слово Группировка (Group By) словом Условие (Where) и

введите для него условие отбора >1000. В поле с суммарным количеством товара удалите в условии отбора значение Is Null. Инструкция SELECT будет дополнена предложением WHERE.

5.В условие отбора поля с суммарным количеством товара введите >40, будет выполнен отбор соответствующих сгруппированных записей. Инструкция SELECT будет дополнена предложением HAVING и примет вид:

SELECT ПОСТАВКА_ПЛАН.КОД_ТОВ, ТОВАР.НАИМ_ТОВ, Sum(ПОСТАВКА_ПЛАН.КОЛ_ПОСТ) AS [Sum-КОЛ_ПОСТ]

FROM ТОВАР RIGHT JOIN ПОСТАВКА_ПЛАН

ON ТОВАР.КОД_ТОВ = ПОСТАВКА_ПЛАН.КОД_ТОВ

WHERE (((ТОВАР.ЦЕНА)>1000))

GROUP BY ПОСТАВКА_ПЛАН.КОД_ТОВ, ТОВАР.НАИМ_ТОВ

HAVING (((Sum(ПОСТАВКА_ПЛАН.КОЛ_ПОСТ))>40));

При выполнении такого запроса сначала в соответствии с предложением WHERE отбираются формируемые записи, затем они группируются с помощью предложения

75

GROUP BY, и после этого в соответствии с предложением HAVING производится отбор сгруппированных записей.

Упражнение 3. Ссылки на имена полей различных таблиц в условии отбора

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

Пусть необходимо выбрать записи из таблицы ОТГРУЗКА, в которых указанная стоимость товара не соответствует произведению количества отгруженного на цену, указанную для этого товара в таблице ТОВАР, и рассчитать величину отклонения.

1.Для решения этой задачи создайте запрос, представленный на рис. 59.

Рис. 59. Запрос с использованием в условиях отбора имен полей из разных таблиц

2.Для отбора записей с неверно указанной суммой отгрузки в строке Условие отбора (Criteria) для поля СУММА_ОТГР запишите выражение:

<>[КОЛ_ОТГР]*[ЦЕНА]

Указание имен таблиц в ссылках на поля является не обязательным, потому что поля имеют уникальные имена. В противном случае при ссылке на поле перед его именем необходимо указывать имя таблицы, например, [ТОВАР]![ЦЕНА].

3.Для расчета величины, на которую отличается значение суммы в таблице от правильного, создайте вычисляемое поле, записав выражение:

[СУММА_ОТГР]-[КОЛ_ОТГР]*[ЦЕНА]

4.Замените сформированное по умолчанию имя вычисляемого поля Выраже-

ние1 на Отклонение.

76

Результаты выполнения запроса, в который добавлены еще поля с номером накладной НОМ_НАКЛ и кодом склада КОД_СК приведены на рис. 60.

Рис. 60. Записи об отгрузке товаров с неверно указанной суммой

Замечание

Если результат выполнения запроса не содержит записей, то это означает, что все суммы подсчитаны правильно, т.е. равны произведению количества на цену товара.

Просмотрите запрос в режиме SQL. Инструкция SELECT для этого запроса имеет вид:

SELECT ОТГРУЗКА.НОМ_НАКЛ, ОТГРУЗКА.КОД_СК, ТОВАР.НАИМ_ТОВ, ОТГРУЗКА.СУММА_ОТГР, [СУММА_ОТГР]-[КОЛ_ОТГР]*[ЦЕНА] AS Отклонение

FROM ТОВАР INNER JOIN ОТГРУЗКА ON ТОВАР.КОД_ТОВ = ОТГРУЗКА.КОД_ТОВ WHERE (((ОТГРУЗКА.СУММА_ОТГР)<>[КОЛ_ОТГР]*[ЦЕНА]));

В инструкции SELECT наряду с полями таблиц, включаемыми в таблицу запроса, представлено вычисляемое поле, которому присвоено имя Отклонение.

Задание 1. Создание многотабличного запроса

Подсчитайте суммарное количество каждого из товаров, которое должно быть поставлено заданному покупателю в каждом из месяцев. Результат должен содержать наименование покупателя, месяц поставки, наименование заказанного товара и количество. Используйте таблицы ПОСТАВКА_ПЛАН, ТОВАР, ПОКУПАТЕЛЬ, а также таблицу ДОГОВОР, через которую осуществляется связь таблицы ПОСТАВКА_ПЛАН с таблицей ПОКУПАТЕЛЬ.

Задание 2. Создание многотабличного запроса с параметрами

Подсчитайте общее количество каждого из товаров, отгруженных в указанный период. Результат должен содержать наименование товара, количество отгруженного. Используйте таблицы ОТГРУЗКА, ТОВАР и НАКЛАДНАЯ. Основой образования записей этого запроса является таблица ОТГРУЗКА. Код товара в таблице ОТГРУЗКА может быть заменен на наименование, выбранное из связанной записи таблицы ТОВАР. Датой отгрузки товара запись из таблицы ОТГРУЗКА может быть дополнена из связанной записи в таблице НАКЛАДНАЯ.

77

Упражнение 4. Представление данных нарастающим итогом

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

Рис..61. Данные о плане поставок товаров в каждом месяце и нарастающим итогом

Создайте запрос, позволяющий получить план поставок товаров нарастающим итогом (рис.62).

1.Прежде чем конструировать запрос создайте дополнительную таблицу КАЛЕНДАРЬ, которая содержит строки с номерами и наименованиями трех месяцев.

2.Включите эту таблицу в запрос наряду с таблицей ПОСТАВКА_ПЛАН.

3.Между таблицами не устанавливайте никакого способа объединения записей. Это приведет к выполнению операции декартово произведение записей таблиц. При этом каждая строка таблицы ПОСТАВКА_ПЛАН будет дополнена номером месяца из календаря и включена в результат столько раз,

78

сколько месяцев в календаре, т.е. если в таблице ПОСТАВКА_ПЛАН 5 строк, декартово произведение даст 5*3 строк, так как в календаре содержится три строки.

4.Включите в банк запроса поля, необходимые для выполнения отбора нужных строк, группировки и подсчета суммарных количеств в группах (рис. 62).

5.Введите в поле СРОК_ПОСТ условие отбора <=[номер месяца], чтобы оставить только те строки, в которых срок поставки товара меньше или равен номеру месяца из календаря. Это позволит получить для каждого месяца в календаре группу, включающую строки поставок товара за все предыдущие месяцы.

6.Выполните группировку по коду товара и номеру месяца.

7.Чтобы подсчитать суммарное количество каждого из товаров, которое должно быть выпущено за период до конца каждого месяца, выберите функцию Sum для поля с количеством.

Рис.62. Запрос для представления плана поставок изделий нарастающим итогом в режиме конструктора

Чтобы представить работу алгоритма вычисления нарастающего итога в более наглядном виде, сократите число строк в таблицах ПОСТАВКА_ПЛАН и КАЛЕНДАРЬ. Пусть в таблице ПОСТАВКА_ПЛАН хранится пять строк, представляющих план поставок изделия на три месяца, а в таблице КАЛЕНДАРЬ – три строки, представляющие три месяца (рис.63).

79

Рис.63. Таблицы с данными о плане поставок товаров и календарь

Декартово произведение этих таблиц представлено на рис.64 и объединяет каждую строку плана с каждым месяцем календаря. Там же показан результат выполнения операции отбора записей, содержащий только 11 строк. В соответствии с заданным условием отбора из декартова произведения остаются только те строки, в которых срок поставки меньше или равен номеру месяца из календаря.

Рис.64. Декартово произведение таблиц ПОСТАВКА_ПЛАН и КАЛЕНДАРЬ до и после обора записей в соответствии с условиями

В результате группировки по коду товара и номеру месяца из календаря формируется три группы по числу месяцев в календаре. Таким образом, для товара будет получено столько строк, сколько месяцев включает календарь, а суммарное количество будет равно, запланированному к выпуску на конец каждого месяца (рис.65).

Рис.65. План поставок товара нарастающим итогом

80

Обратите внимание

При выполнении запроса сначала производится объединение записей и их отбор в соответствии с заданными условиями и только затем группировка полученных записей.

Просмотрите запрос в режиме SQL. Инструкция SELECT для этого запроса имеет вид:

SELECT ПОСТАВКА_ПЛАН.КОД_ТОВ, календарь.[номер месяца], Sum(ПОСТАВКА_ПЛАН.КОЛ_ПОСТ) AS [Sum-КОЛ_ПОСТ]

FROM ПОСТАВКА_ПЛАН, календарь

WHERE (((ПОСТАВКА_ПЛАН.СРОК_ПОСТ)<=[номер месяца])) GROUP BY ПОСТАВКА_ПЛАН.КОД_ТОВ, календарь.[номер месяца];

В инструкции SELECT в предложении FROM ПОСТАВКА_ПЛАН, календарь имена таблиц разделены запятой, что и определяет операцию декартово произведение для объединения записей таблиц. Предложение WHERE ПОСТАВКА_ПЛАН.СРОК_ПОСТ<=[номер месяца] определяет отбор нужных записей. И наконец, предложение GROUP BY определяет поля группировки. Суммирование количества для группы выполняется соответствующей функцией, записанной в списке полей инструкции.

Тот же результат может быть получен, если в инструкции SQL заменить приведенные в примере предложения FROM и WHERE одним предложением FROM ПОСТАВ-

КА_ПЛАН INNER JOIN календарь ON ПОСТАВКА_ПЛАН.СРОК_ПОСТ<=календарь.[номер месяца]. Однако такая инструкция не может быть представлена в режиме конструктора Access, так как в этом режиме в выражении объединения JOIN не поддерживается использование знака сравнения отличного от =.

Упражнение 5. Решение задачи, требующей выполнения нескольких запросов

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

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

1.Данные о плановых поставках хранятся в таблице ПОСТАВКА_ПЛАН. На ее основе создайте запрос для подсчета суммарного количества каждого из товаров, запланированных к поставке на конец заданного месяца (рис. 66).

2.Сохраните запрос под именем План.

Соседние файлы в папке INFORMATIKA