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

20111026_МУ по информатике редактированная_удк

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

После выполнения запроса получим тот же результат. Такой же оператор мы увидим, если из режима конструктора перейдем в режим SQL, но он будет более громоздким, так как сама система создает сложные имена с указанием его источника (<имя таблицы/запроса>.<имя поля>). Можно решить противоположную задачу: вывести сведения о изделиях, не содержащих буквы “в” в своем названии, изменив, оператор Like "*в*" на Not Like "*в*" в том же запросе в инструкции WHERE.

Оператор SQL легко копировать с помощью команд меню Файл – Сохранить как и затем в открывшееся окно ввести новое имя, например Z2. Текст этой копии будет выводиться в окне SQL запроса, где и произведем изменение условного выражения в инструкции WHERE.

SELECT * FROM Firm WHERE izd Not Llke “*в*”;

После выполнения этого запроса получим следующий результат, представленный на рисунке 1.4.3.1.4.

Рис. 1.4.3.1.4 Результат запроса Z2.

Логическая операция Between позволяет задавать условия для числовых полей. Например, вывести данные по тем изделиям, годовой выпуск которых находится в диапазоне от 300 до 1000, можно запросом Z3, содержащим следующий SQL оператор:

SELECT * FROM Firm WHERE god Between 300 And 1000);

После выполнения запроса получим следующую таблицу (рисунок 1.4.3.1.5):

Рис. 1.4.3.1.5 Результат запроса Z3.

Из запроса Z3 можно создать копию с именем Z4( SQL копировать с помощью команд меню Файл – Сохранить как и затем ввести имя Z4), который будет выбирать все записи, кроме тех, в которых годовой выпуск не входит в диапазон то 300 до 1000, записав частицу Not, в логическое выражение инструкции WHERE.

SELECT * FROM Firm WHERE god Not Between 300 And 1000);

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

71

Рис. 1.4.3.1.6 Результат запроса Z4.

Логическая операция In позволяет вывести все данные о предприятиях "Меридиан", "Агат" и "Топаз". Для реализации этой задачи используется следующий SQL оператор запроса Z5.

SELECT * FROM Firm WHERE Nazf In(“Агат”,”Топаз”,”Мир”);

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

Рис. 1.4.3.1.7 Результат запроса Z5.

Чтобы вывести данные о всех предприятиях, кроме "Мир", "Топаз" и "Агат", используем предыдущий запрос, создадим копию Z6, но условие вывода IN заменим на Not In.

SELECT * FROM Firm WHERE Nazf Not In ("Агат"," Топаз","Мир");

Результат запроса Z6 на рисунке 1.4.3.1.8.

Рис. 1.4.3.1.8 Результат запроса Z6.

1.4.3.2 Запросы с параметром

Параметры могут использоваться в логических операциях, позволяя решать более гибкие задачи. Например, вывести информацию по двум произвольно задаваемым изделиям. Для этого создадим копию запроса Z5 с именем Z8 и вместо констант запишем параметры. Решение можно представить следующим оператором SQL.

SELECT * FROM Fifm WHERE izd Iп([введите изделие1],[введите изделие2]);

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

72

Рис. 1.4.3.2.1 Результат запроса Z8.

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

SELECT * FROM Firm WHERE god Between [ вв нижнюю границу] And

[вв верхнюю границу];При выполнении запроса дважды появятся окна параметров, в которые мы вводим числа, сначала меньшее, а затем большее, например первое -300, а второе -1000. Результат будет такой же, как и при выполнении запроса Z3 (рисунок 3.5).

1.4.3.3Создание вычисляемых полей.

Взапросах можно создавать вычисляемые поля. Вычисляемые поля создаются в инструкции SELECT в виде: < выражение> As <имя поля>. Выражение может быть текстовым или арифметическим. В арифметических выражениях можно использовать все арифметические операции, математические функции, арифметические поля таблиц/запросов и арифметические константы. В выражениях можно использовать любое количество круглых скобок. Например, для нашей таблицы можно вычислить среднегодовую цену. Для этого запишем выражение ((z1+z2+z3+z4)/4) as Stm. При делении часто получаются вещественные результаты, которые при желании можно преобразовать в целые, используя функцию преобразования Cint ((z1+z2+z3+z4)/4) as Stm. Запрос вычисляет выражение и создает поле Stm. Это поле запроса и может использоваться только при использовании самого запроса.

Запросы с сортировкой. В запросах можно управлять порядком вывода: по возрастанию или по убыванию значения одного или нескольких полей. В конструкторе запроса выбор сортировки осуществляется в специальной строке при описании полей. В SQL запросах для сортировки используется инструкция Order By. Эта инструкция может идти последней из всех перечисленных ранее, после условия оборота в инструкции Where. В инструкции Order By можно указывать одно или несколько полей источника или выражения, которые вычисляются самой инструкцией. После каждого поля или выражения Необходимо указать порядок сортировки: Desc- по убыванию или Asc- по возрастанию. Asc-принимается по умолчанию (не указывается). Например, для задачи: вычислить среднюю цену и вывести информацию о предприятиях, изделиях, годовом выпуске и среднегодовой цене, и вывести информацию по убыванию средней цены, запрос с именем Z9 будет следующим:

73

Select kdf, Nazf, Izd, Kdi, God, Cint((z1+z2+z3+z4)/4) as Stm From Firm Order By ((z1+z2+z3+z4)/4 Desc;

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

Рис. 1.4.3.3.1 Результат запроса Z9.

1.4.3.4 Предикаты запросов All, Distinct, Top.

Эти предикаты являются свойствами запроса, они могут быть установлены в окне свойств конструктора запроса или записаны в SQL запросе. Предикаты записываются в инструкции Select перед списком полей. Предикаты указывают, как должны обрабатываться повторяющиеся записи. Синтаксис предикатов в инструкции Select имеет следующий вид: Select | All | Distinct | < список полей>. Предикаты взаимоисключающие.

Предикат All устанавливается по умолчанию и означает включение в результат запроса всех записей, удовлетворяющих условиям отбора. Уникальность записей не проверяется. Этот предикат соответствует значению Нет свойства запроса Уникальные значения в конструкторе запроса.

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

значению Да свойства запроса Уникальные значения в конструкторе запроса. Предикат Distinct позволяет получать из таблиц списки различных. Например, вывести список различных предприятий можно запросом Z10:

Select Distinct Kdf, Nazf From Firm;

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

Если в запрос ( Z10) вставить предикат ALL ( вместо Distinct или ничего не ставить), то получим другой результат( запрос Z12 выводит все записи).

Select All Kdf, Nazf From Firm;

Результат этого запроса так же представлен на рисунке 1.4.3.4.1.

74

Рис. 1.4.3.4.1. Результаты запросов Z10(различные фирмы) и Z12(все фирмы).

Предикат Top в запросах. Предикат используется только в SQL запросах. В конструкторе запросов этому предикату соответствует свойство набор значений. Предикат записывается в инструкции Select перед списком полей. Он может использоваться вместе с предикатами и без них. Синтаксис написания предиката следующий:

Select [ | All |Distinct | ] [ Top n [ Percent ]] < список полей >

Предикат Top имеет две формы: Top n, которая позволяет вывести в динамический набор записей , получаемых при выполнении запроса, первые n записей; и Top n Percent, который включает в формируемый набор записей первые n процентов от всего количества записей. Предикат Top имеет смысл применять вместе с инструкцией Order By, иначе будет получен случайный набор записей.

Например, чтобы вывести информацию о пяти фирмах и изделиях с наибольшими годовыми выпусками можно написать следующий SQL оператор ( запрос Z11).

Select Top 5 Kdf, Nazf, Izd, Kdiz, God From Firm Order by God Desc;

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

Рис. 1.4.3.4.2. Результат запроса Z11.

С предикатом Top n можно решать такие задачи, как вывести информацию о фирмах и изделиях с максимальным годовым выпуском и с минимальным. Для решения первой задачи скопируем запрос Z11 в запрос Z14

75

и изменим предикат Top 5 на Top 1. Добавим в нашу таблицу две записи с максимальным годовым выпуском (2000) и одну запись с минимальным выпуском (150). Выполнив запрос Z14, получим три записи с одинаковыми максимальными выпусками (Рисунок 1.4.3.4.3). Скопируем запрос Z14 в запрос Z13 и уберем из инструкции Order by God Desc порядок сортировки Desc. По умолчанию берется Asc, т.е. по возрастанию, значит первыми будут записи с минимальными годовыми выпусками. Результат запроса Z13 ( две записи) так же на рисунке 1.4.3.4.3.

Рис. 1.4.3.4.3. Результаты запросов Z14 и Z13.

Следует обратить внимание, что запрос выводит не одну запись, как указывалось в предикате Top 1, а все, имеющие одинаковые значения в поле сортировки. Тексты запросов написаны ниже.

Запрос Z14:

Select Top 1 Kdf, Nazf, Izd, Kdiz, God From Firm Order by God Desc;

Запрос Z13:

Select Top 1 Kdf, Nazf, Izd, Kdiz, God From Firm Order by God;

1.4.3.5 Запросы с вычислениями итоговых функций

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

SUM ( поле)-вычисляет суммы всех значений заданного поля или выражения в таблице или в каждой группе записей.

АVG(поле)-вычисляет среднее арифметическое заданного поля или выражения для всей таблице или для каждой группы.

МIN(поле), МАХ(поле) - находят наименьшее и наибольшее значения заданного поля или выражения в таблице или в каждой группе.

СОUNТ(поле) или СОUNТ(*)-находит число записей в таблице или в каждой группе.

FIRSТ(поле), LASТ(поле)- находят первое и последнее значения заданного поля или выражения в таблице или в каждой группе.

SQL Access позволяет формировать итоговые запросы трех типов:

76

-простой запрос без группировки, подводящий итоги по всему источнику;

-запросы, вычисляющие итоги по группе записей (с группировкой); -перекрестные запросы.

1.4.3.5.1.Итоговые запросы по всей таблице

Запросы, которые используют итоговые функции в инструкции Select и не используют группировки, позволяют производить вычисления по всей таблице. В таких запросах в инструкции Select можно использовать только итоговые функции и выражения с ними. Например, чтобы вычислить общее число выпусков, а так же определить наибольший и наименьший выпуски и абсолютный разброс средних цен в первом и последнем кварталах, следует составить следующий запрос ( Z21):

Select Count(*) As Kolvo, Max(God) As MaxGod, Min(God) As Mingod, Abs(Avg(Z1)-Avg(Z4))As Rcen From Firm;

Для получения абсолютного значения разницы можно использовать встроенную функцию Abs.

Вычисляемые функцией Avg средние значения могут выдать результат с восьмью знаками в дробной части (запрос Z21, рисунок 1.4.3.5.1.1). Результат можно отредактировать функцией округления Round.

Round(<выражение>, <количество знаков после точки>)

Рис. 1.4.3.5.1.1 Результаты запросов Z21 и Z20.

Скопируем запрос Z21 в запрос Z20 и внесем в него изменения, записав функцию Round.

Select Count(*) As Kolvo, Max(God) As MaxGod, Min(God) As Mingod, Round(Abs(Avg(Z1)-Avg(Z4)),2)As Rcen From Firm;

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

записей, т.е. инструкцию Where.

Например, чтобы вычислить общее число выпусков, а так же определить наибольший и наименьший выпуски и абсолютный разброс

77

средних цен в первом и последнем кварталах только для произвольно вводимой продукции, следует составить следующий запрос ( Z22):

Select Count(*) As Kolvo, Max(God) As MaxGod, Min(God) As Mingod, Round(Abs(Avg(Z1)-Avg(Z4)), 2) As Rcen From Firm

Where Izd = [введите название изделия];

Запрос можно получить из предыдущего добавлением инструкции Where. Результат для изделия Телевизор представлен на рисунке 1.4.3.5.1.2.

Рис. 1.4.3.5.1.2 Результат запроса Z22.

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

Например, для изделия Телевизор подсчитать количество фирм, их выпускающих, а так же вывести название первой в таблице фирмы и последннй. Запрос (Z23) будет следующим:

Select Count(*) As Kolvo, First( Nazf) As FNaz, Last(Nazf) As LNaz From Firm

Where Izd=”Телевизор”;

Результат этого запроса на рисунке 1.4.3.5.1.3.

Рис. 1.4.3.5.1.3 Результат запроса Z23.

1.4.3.5.2 Итоговые запросы по группе записей

Группа записей характеризуется принадлежностью к одному и тому же объекту таблицы. Например, может быть группа записей, объединенных одинаковым значением названия фирмы (по каждой фирме), или одинаковым значением названия изделия (по каждому изделию). Группировка определяется инструкцией Group By <поле или список полей>. Поля группировки должны иметь неслучайные одинаковые значения.

Синтаксис SQL оператора с группировкой: Select <поля группировки и итоговые функции> From <таблица/запрос>

78

Group By <поля группировки>;

Например, по каждому виду изделия вычислим среднее значение цены в первом квартале, максимальный годовой выпуск и выведем в группе каждого изделия название первой фирмы, ее выпускающей. Запрос Z15 на SQL будет следующим:

Select kdiz, izd, First(Nazf) As Nazfirst, Max(God) as Maxgod, Round(Avg(Z1)),2) As Avgz1 From Firm Group By Kdiz, Izd;

В инструкции Group By могут использоваться имена полей таблицы или уже существующего запроса, вычисляемые выражения или константы, но, в любом случае, они должны определять группы. В нашем примере группировка идет по коду изделия и названию изделия. В инструкции Select запроса с группировкой можно использовать только поля группировки и вычисляемые итоговые функции. Если бы мы группировали только по коду изделия, то название изделия нельзя было бы включить в список выводимых полей (в инструкцию Select), или включать его с помощью какой-либо итоговой функции, например First(Izd) As NazIzd, и создать новое вычисляемое поле(NazIzd). Инструкция Group By автоматически устанавливает сортировку по возрастанию поля группировки без инструкции Order By. В инструкции Group By можно одновременно указать несколько несвязанных полей. Группы при этом определяются слева направо, как и при сортировке. В нашем случае оба поля группировки создают одни и те же группы, так как поля связаны друг с другом( одно однозначно определяет другое). Результат запроса представлен на рисунке 1.4.3.5.2.1.

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

Из кода изделия и названия изделия можно создать одно выражение, объединяющее их. Например, с помощью операции сцепления, выполняемой символом “&”, можно создать выражение:

Kdiz & “—“ & Izd и использовать его как столбец для группировки. В этом случае и в инструкции Select можно будет использовать именно это выражение для идентификации групп и дать этому выражению новое имя( имя столбца запроса Gruppa); Запрос Z16 создадим из копии SQL запроса Z15. Текст SQL запроса Z16 будет следующий:

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;

79

Результат запроса Z16 на рисунке 1.4.3.5.2.2

Рис. 1.4.3.5.2.2 Результат запроса Z16

Группировать можно и по другим полям, имеющим для нескольких записей таблицы одинаковые значения. Например, в нашей таблице можно группировать по кодам и названиям фирм, если необходимо произвести вычисления « для каждой фирмы». В запросах с группировкой можно использовать инструкцию Order By для сортировки по одному из вычисленных итогов. В инструкцию Order By в качестве параметров для сортировки можно использовать только поля группировки или вычисляемые функции. Например, требуется для каждой фирмы подсчитать количество видов выпускаемых изделий, максимальный годовой выпуск и минимальный, а так же абсолютный разброс средних цен в первом и последнем кварталах. Результат вывести в порядке убывания абсолютного значения разброса цен. Для идентификации фирм можно использовать только коды(Kdf), только названия(Nazf), или и то и другое одновременно или создать вычисляемое поле из кода фирмы и ее названия, как в запросе Z16 вычислено поле Gruppa. Для решения этой задачи запрос может быть получен копированием SQL запроса Z22 и добавлением в него полей группировки, инструкции Group By с полями группировки, и инструкции Order By. В этой инструкции мы используем то же вычисляемое выражение, что и в инструкции Select, так как поле Rсen еще не сформировано. SQL запрос Z17, решающий поставленную задачу, будет следующим:

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

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

From Firm Group By Kdf, Nazf

Order By Abs(Avg(Z1)-Avg(Z4));

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

80