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

Информатика_Семестр1_Методпособие

.pdf
Скачиваний:
67
Добавлен:
05.06.2015
Размер:
2.81 Mб
Скачать

Рис. 1.4.3.5.2.3 Результат запроса Z17.

Ввычисляемом выражении в инструкцию Select мы использовали стандартные математические функции Abs() и Cint() для вычисления абсолютного значения разности средних цен и для получения только целой части этих значений, так как функции вычисления среднего арифметического Avg() чаще всего возвращают величину с дробной частью. Функция Cint() использовалась только для получения результата, выравненного по разрядам.

Всортировке этого можно не делать.

Винструкции Group By может быть определено до десяти полей. Но в него не следует включать столбцы, которые не определяют групп, но при этом их желательно вывести. Такие столбцы можно включать в инструкцию Select только с итоговыми функциями (например, Last() или First()).

1.4.3.5.3 Условия вычисления в итоговых запросах с группировкой

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

Например, требуется для каждой фирмы подсчитать количество видов выпускаемых изделий, максимальный годовой выпуск и минимальный, а так же абсолютный разброс средних цен в первом и последнем кварталах. Вычисления производить только для изделий, содержащих в своем названии букву «л». Результат вывести в порядке убывания абсолютного значения разброса цен. Задача повторяет предыдущую, но добавляется условие вычисления. Для решения этой задачи воспользуемся предыдущим запросом (Z17) и добавим в него условия вычисления. Инструкция Where записывается перед группировкой. Запрос для решения поставленной задачи (Z18) будет следующим:

Select Kdf, Nazf,Count(*) As Kolvo, Max(God) As MaxGod,

Min(God) As Mingod, Cint (Abs(Avg(Z1)-Avg(Z4)))As Rcen

From Firm Where Izd Like “*л*”

81

Group By Kdf, Nazf Order By Abs(Avg(Z1)-Avg(Z4));

Результат запроса представлен на рисунке 1.4.3.5.3.1.

Рис. 1.4.3.5.3.1 Результат запроса Z18.

Мы видим, что изменились показатели в результирующем наборе записей, но количество выводимых записей не изменилось. Возьмем другую задачу: по каждому виду изделия вычислим среднее значение цены в первом квартале, максимальный годовой выпуск, и выведем в группе каждого изделия название первой фирмы, ее выпускающей. Вычисления произведем только среди фирм с кодами 10,40 и 50. Для решения этой задачи за основу возьмем запрос Z15. Из режима SQL получим его копию и сохраним с именем Z19. Внесем в этот запрос условие вычисления:

Where Kdf In(10,40,50)

Запрос Z19 будет следующим:

Select kdiz, izd, First(Nazf) As Nazfirst, Max(God) as Maxgod, Round(Avg(Z1)),2) As Avgz1

From Firm Where Kdf In(10,40,50) Group By Kdiz, Izd;

Результат запроса представлен на рисунке 1.4.3.5.3.2.

Рис. 1.4.3.5.3.2 Результат запроса Z19.

1.4.3.5.4 Условия вывода в итоговых запросах с группировкой

Условия вывода относятся к уже сгруппированным записям и определяются инструкцией Having. В этой инструкции определяются условия вывода. Инструкция Having записывается после инструкции Group By и критерии отбора записей строятся на основе полей группировки и итоговых функций, которые вычисляются для каждой группы записей. Синтаксис инструкции Having следующий:

Having < логическое выражение>.

82

Например, в запросе Z15 мы по каждому виду изделия вычисляли среднее значение цены в первом квартале, максимальный годовой выпуск, а так же в группе каждого изделия выводили название первой фирмы, ее выпускающей. Глядя на результат этого запроса(Z15, Рисунок 3.18.) мы можем определить условия вывода записей. Так, например, можно выводить не всю информацию, а только ту, для которой максимальный годовой выпуск больше

1000.

Select kdiz, izd, First(Nazf) As Nazfirst, Max(God) as Maxgod, Round(Avg(Z1)),2) As Avgz1

From Firm Group By Kdiz, Izd Having Max(God)>1000;

Результат запроса представлен на рисунке 1.4.3.5.4.1.

Рис. 1.4.3.5.4.1 Результат запроса Z15.

В инструкции Having можно использовать и те функции, которые не вычисляются запросом. Например, в том же запросе Z15 (Рис. 1.4.3.5.4.1) можно выводить информацию только о тех изделиях, которые выпускаются более чем двумя предприятиями.

Select kdiz, izd, First(Nazf) As Nazfirst, Max(God) as Maxgod, Round(Avg(Z1)),2) As Avgz1

From Firm Group By Kdiz, Izd Having Count(*)>2;

Это запрос, решающий поставленную задачу Z24, получен из предыдущего запроса, а его результат представлен на рисунке 1.4.3.5.4.2.

Рис. 1.4.3.5.4.2 Результат запроса Z30.

Если в условии вывода используется поле группировки, то такое условие может быть записано как в инструкции Where, так и в инструкции Having. Например, из результата запроса Z16 выводить только те записи, которые содержат информацию об изделиях, имеющих вторым символом в выражении Kdiz & “--“ & Izd единицу(1) или двойку(2). Но по этому

83

выражению осуществляется группировка, и, следовательно два следующих запроса дадут одинаковый результат(рисунок 1.4.3.5.4.3).

Select Kdiz & “-- & Izd As Gruppa, First(Nazf) As Nazfirst, Max(God) As Maxgod, Round(Avg(Z1)),2) As Avgz1 From Firm

Where Kdiz & “--“ & Izd Like “?1*” Or Kdiz & “--“ & Izd Like “?2*”

Group By Kdiz & “--“ & Izd;

Сохраним запрос с именем Z26.

Вэтом запросе выражение «Kdiz & “--“ & Izd Like “?1*” Or Kdiz & “--“

&Izd Like “?2*” » является условием вычисления итоговых функций. Изменим запрос Z26 следующим образом:.

Select Kdiz & “-- & Izd As Gruppa, First(Nazf) As Nazfirst, Max(God) as Maxgod, Round(Avg(Z1)),2) As Avgz1 From Firm Group By Kdiz & “--“ & Izd Having Kdiz & “--“ & Izd Like “?1*” Or Kdiz & “--“ & Izd Like “?2*”;

Вэтом запросе выражение «Kdiz & “--“ & Izd Like “?1*” Or Kdiz & “--“

&Izd Like “?2*” » является условием вывода. Результат запроса представлен на рисунке 1.4.3.5.4.3.

Рис. 1.4.3.5.4.3 Результат запроса 26

1.4.3.5.5 Условия вывода и вычисления в итоговых запросах с группировкой

Итоговые запросы могут содержать сразу обе инструкции: Where и Having. Критерии инструкции Where учитываются перед проведением группировки строк и позволяют исключить некоторые строки из вычисления итоговых функций. Напротив, критерии инструкции Having применяются после группировки и определяют записи, отбираемые в результирующий набор записей. Таким образом, записи фильтруются дважды. Для получения в результате более одной строки, возможно, придется добавлять записи в исходную таблицу.

Возьмем задачу, решаемую запросом Z19( по каждому виду изделия вычислить среднее значение цены в первом квартале, максимальный годовой выпуск, и вывести в группе каждого изделия название первой фирмы, ее выпускающей; вычисления производить только среди фирм с кодами 10,40 и 50). Добавим в задачу вычисление количества фирм, выпускающих каждое изделие(), и условие вывода: выводить только информацию об изделиях, для которых максимальный годовой выпуск больше 1000. Для решения этой задачи за основу возьмем запрос Z19 и добавим в него условие вывода Having

84

Max(God)>1000. Получим запрос Z27. Результат этого запроса на рисунке 1.4.3.5.5.1.

Select kdiz, izd, Count(*)As KolFirm, First(Nazf) As Nazfirst,

Max(God) As Maxgod,Round(Avg(Z1)),2) As Avgz1

From Firm Where Kdf In(10,40,50)

Group By Kdiz, Izd Having Max(God)>1000;

Рис. 1.4.3.5.5.1 Результат запроса Z27.

1.4.3.6. Запросы на модификацию таблиц

SQL позволяет не только создавать динамические наборы записей, но и вносить изменения в табличные данные, создавать новые таблицы на базе существующих. Для этих целей в ACCESS предназначены четыре инструкции:

Select into – создание новой таблицы.

Insert into – добавление.

Update - обновление. Delete - удаление.

1.4.3.6.1 Создание новой таблицы

Новая таблица может быть создана из любого запроса на выборку или итогового запроса. С помощью такого запроса можно объединить в одну таблицу результаты нескольких запросов. Запрос на создание имеет следующий синтаксис:

Select <список столбцов |выражений> Into <имя новой таблицы> From <таблица | запрос>

[Where <логическое выражение>] [Order By <столбец | выражение>];

Создаваемая таблица будет содержать те поля, которые перечислены в инструкции Select. Среди списка могут быть выражения или функции, в результате вычисления которых появятся новые поля, имена которых указываются после ключевого поля As.

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

Select * Into Copfirm From Firm;

85

При выполнении запроса будет выдано сообщение о том, сколько записей будет перенесено в новую таблицу и необходимо будет подтвердить создание новой таблицы. Но никакого результата выполнения запроса не будет выведено. Результатом является новая таблица. Она может быть просмотрена из окна базы данных. На вкладке таблицы появится новое имя Copfirm. Эта таблица, как и все имеет два режима: режим таблицы и режим конструктора. В режиме конструктора мы увидим те же поля и те же свойства, как и поля исходной таблицы. В режиме таблицы мы увидим саму таблицу Copfirm, которая повторяет таблицу Firm. В создаваемую с помощью запроса таблицу можно выбрать не все записи, а только соответствующие определенному условию. Например, создать таблицу, содержащую все записи с изделиями телевизор и телефон и средней ценой, вместо квартальных цен. Запрос Z28 будет следующим:

Select Kdf, Nazf, Izd, Kdizd, God, Round((z1+z2+z3+z4)/4,2) As Sred Into

Nfirm

From Firm

Where Izd In(“телевизор”,”телефон”);

Перейдем в окно базы данных, затем на вкладку Таблицы. Выберем таблицу Nfirm. Результат представлен на рисунке 1.4.3.6.1.1.

Рис. 1.4.3.6.1.1 Вид таблицы Nfirm.

Создадим таблицу из итоговых записей. Например, возьмем запрос Z18, который для каждой фирмы подсчитывает количество видов выпускаемых изделий, максимальный годовой выпуск и минимальный, а так же абсолютный разброс средних цен в первом и последнем кварталах для изделий, содержащих в своем названии букву «л». Изменим этот запрос, и сделаем его запросом на создание новой таблицы с именем Itog1. Для этого в инструкцию Select после перечисления нужных столбцов и вычисления нового поля добавим выражение Into Itog1. Получим запрос Z29. Результат запроса представлен на рисунке 1.4.3.6.1.2.

Select Kdf, Nazf,Count(*) As Kolvo, Max(God) As MaxGod,

Min(God) As Mingod, Cint (Abs(Avg(Z1)-Avg(Z4)))As Rcen

Into Itog1 From Firm Where Izd Like “*л*”

Group By Kdf, Nazf Order By Abs(Avg(Z1)-Avg(Z4));

86

Рис. 1.4.3.6.1.2. Результат запроса Z29 (таблица с именем Itog1).

1.4.3.6.2 Запросы на добавление

Добавить записи можно только в существующую таблицу. Синтаксис SQL оператора на добавление записей следующий:

Insert Into <имя таблицы-назначения> Select <список полей>

From <таблица-источник>

[ далее как и в других запросах, в зависимости от задачи]; Самая простая форма запроса используется для копирования строк

одной таблицы в другую таблицу похожей структуры. Например, мы создали таблицу Nfirm, содержащую информацию только о телефонах и телевизорах. Добавим в эту таблицу Nfirm информацию о пылесосах из таблицы Firm.

Запрос Z30 на добавление записей будет следующим:

Insert Into Nfirm

Select Kdf, Nazf, Izd, Kdizd, God, Round((z1+z2+z3+z4)/4,2) As Sred

From Firm Where Izd=”пылесос”;

Результат представлен на рисунке 1.4.3.6.2.1.

Рис. 1.4.3.6.2.1. Результат запроса Z30. Вид таблицы Nfirm после добавления записей.

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

87

Допускается добавление не всех полей в записях. В этом случае пропущенные поля будут иметь значение NULL, что означает пусто(не ноль и не пробел).

Для добавления одной записи с фиксированными значениями используется другая форма запроса:

Insert Into <таблица-назначение>[(<список имен полей>)] Values(<список значений>);

В этом операторе используется только одна таблица, в которую добавляется одна запись (таблица-назначение). В инструкции Values в скобках перечисляются числовые и текстовые константы, которые и будут значениями полей добавляемой записи. Текстовые константы заключаются в кавычки. Возможны два варианта оператора добавления: со списком имен полей и без этого списка. Если список значений соответствует порядку следования полей в записи таблицы-назначения, то список полей можно не использовать. И, напротив, если список значений произвольный или не полный, то необходимо указать список полей, которому он (список значений) должен соответствовать. Список полей следует после имени таблицы-назначения в инструкции Insert Into и заключается в скобки. Например, добавим в таблицу Nfirm запись о фирме «Пайл» с кодом 60, изделием «DVD», имеющим код 500 и годовым выпуском 1500. В поле «средняя цена» запишем значение 100,5(но через точку). Все значения в инструкции Values ,будут записаны в соответствии со структурой записи. Этот запрос на добавление Z31 будет следующим:

Insert Into Nfirm

Values (60,”Пайл”,”DVD”,500, 1500, 150.5);

Результат запроса - новая запись в таблице – на рисунке 1.4.3.6.2.2.

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

В другом запросе добавим к фирме «Агат» изделие «DVD» с годовым выпуском 1000. «Среднюю цену» определять не будем и список констант будет произвольный. Запрос на добавления этой записи Z32 будет следующим:

Insert Into Nfirm (God, Kdiz, Kdf, Izd, Nazf)

Values (1000, 500, 30, ”DVD”, ”Агат”);

Результат запроса Z32новая запись в таблице Nfirm представлен на рисунке 1.4.3.6.2.3.

88

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

Мы видим, что добавилась новая запись и ее данные соответствуют условию задачи, а поле Sred осталось не заполненным. Надо иметь ввиду, что система не анализирует правильность информации, а только проверяет на совпадение типов полей и констант.

1.4.3.6.3 Обновление таблиц

Запросы позволяют вносить изменения в поля таблиц. Для этого в запросах используется инструкция Update. Синтаксис SQL оператора для изменения следующий:

Update <имя таблицы>

Set <имя столбца> = <выражение>[,<имя столбца> = <выражение>, … ] [ Where <логическое выражение>];

В этом операторе в инструкции Update указывается имя только одной таблицы, в которой производятся изменения. В инструкции Set перечисляются через запятую имена изменяемых столбцов и соответствующие изменениям выражения для каждого из них. В операторе может присутствовать инструкция Where, если поля должны изменяться не во всех записях, а только удовлетворяющих некоторым условиям. Значения полей могут быть обновлены константами или выражениями соответствующего типа. Например, обновим таблицу Nfirm следующим образом: заменим выпуск «пылесосов» на выпуск «мониторов» с кодом 77 и годовым выпуском 1200 и очистим столбец «средняя цена» Sred (запрос Z33). Результат запроса Z33 предстален на рисунке 1.4.3.6.3.1.

Рис. 1.4.3.6.3.1 Результат запроса Z33. Вид таблицы Nfirm после обновления записей.

89

Запрос Z33 выглядит следующим образом:

Update Nfirm Set Izd=”Монитор”,Kiz=77, God=1200,Sred=Null

Where Izd=”Пылесос”;

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

IIf(<логическое выражение>,<выражение1>,<выражение2>)

Функция IIf вычисляет одно значение, которое будет равно значению выражения1, если логическое выражение функции истинно, значению выражения2, если оно ложно. Например, мы можем в нашей таблице Nfirm пустые места в столбце «средняя цена» Sred заполнить каким-либо значением, оставив остальные значения этого столбца без изменения. Например, для вновь добавленных записей, где столбец «средняя цена» Sred имеет значение Null для изделия ”Монитор”, установить среднюю цену равной 555,5. Запрос Z34. решающий эту задачу, выглядит следующим образом:

Update Nfirm Set Sred= IIf ( Sred IsNull, 555.5, Sred)

Where Izd=”Монитор”;

Результат запроса Z34 представлен на рисунке 1.4.3.6.3.2.

Рис. 1.4.3.6.3.2 Результат запроса Z34. Вид таблицы Nfirm после обновления записей.

1.4.3.6.4 Запрос на удаление

Удалить группу записей из базы данных можно с помощью запроса на удаление. Обычно такой запрос используется для удаления устаревших записей. Запрос может содержать параметр, чтобы во время выполнения запроса пользователь мог управлять удалением записей. Сначала создается запрос на выборку и после проверки его работы он изменяется па запрос на удаление с помощью команд Запрос на удаление главного меню или соответствующей кнопки. В SQL запросах для удаления записей используется инструкция Delete, которая имеет следующий синтаксис:

90