Рефераты. SELECT

будет воспринят MS Access вполне нормально.

Возможна и другая ситуация.

Допустим, у нас есть таблица «Сотрудники_офиса» следующей структуры:

Таб_номер

ФИО

Телефон

Также есть таблица «Сотрудники_филиала» с точно такой же структурой. Необходимо в каком-нибудь итоговом отчете представить эти таблицы вместе. Для этого используется конструкция UNION. При ее использовании можно склеить сколько угодно таблиц. Точнее, таблицы необязательно должны иметь одинаковую структуру. Необходимо лишь, чтобы из всех таблиц выбиралось одинаковое количество полей, и чтобы эти поля были полностью эквивалентны.

Общая структура такого запроса такова:

SELECT Таблица1.Поле1, Таблица1.ПолеN FROM Таблица1

UNION SELECT Таблица2.Поле1, Таблица2.ПолеN FROM Таблица2

UNION SELECT ТаблицаK.Поле1,ТаблицаK.ПолеN FROM ТаблицаK;

В нашем случае это будет выглядеть так:

SELECT Сотрудники_офиса.* FROM Сотрудники_офиса

UNION SELECT Сотрудники_филиала.* FROM Сотрудники_филиала

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

Иногда бывает необходимо объединить несколько таблиц (более 2) с помощью операции JOIN. Сделать это в рамках одного запроса весьма проблематично, однако не следует забывать, что MS Access в состоянии использовать запросы как источник записей. Т.е. объедините две таблицы в одном запросе, а затем обхедините третью таблицу и запрос во втором.

2.4. Групповые операции и вычисляемые поля

Допустим, есть у нас таблица «Постоянные_клиенты». И нам, в зависимости от количества покупок надо дать им скидки - например, те, кто сделал более 5 покупок, получает скидку 6%. Исходная таблица имеет такой вид:

Номер

ФИО

Покупки

Чтобы выполнять подобные операции, не прибегая к искусству программирования, в запросах Microsoft Jet (именно так называется ядро баз данных Access) реализована возможность реализации вычисляемых полей.

Объявляются эти поля точно так же, как и обычные, в конструкции SELECT:

SELECT(список_обычных_полей), (операция_с_полями_или_ числа-ми) AS вычисляемое_поле FROM (список_таблиц);

Применительно к нашей ситуации имеет смысл использовать операцию IIf - Если. Ее формат таков: IIf(условие;действие_если_истина; действие_ если_ложь). Можно также использовать вложенные условия - их нужно вставлять вместо действий - IIf(условие; IIf(вложенное_условие; действие_если_истина;действие_если_ложь); действие_если_ложь)

Наш запрос будет выглядеть так:

SELECT *, (IIf(Покупки > 5; 0.06; 0)) AS Скидка From Постоянные_клиенты;

Он даст нам источник записей, который содержит все поля и записи таблицы «Постоянные_клиенты», а в придачу к ним - уже рассчитанные скидки в соответствующем поле.

Более подробно о поддерживаемых вычислительных операциях можно прочитать в соответствующем разделе справки Microsoft Access.

Access поддерживает также групповые (итоговые) операции. Это значит, что можно рассчитать, исходя из набора данных, некоторые статистические и другие характеристики, такие как сумма, дисперсия, математическое ожидание и другие. В запросах этим пользуются не очень часто, но пользуются. Поля с групповыми вычислениями объявляются так же, как и обычные вычисляемые поля. Например, запрос

SELECT Sum(Покупки) AS Количество FROM Постоянные_клиенты;

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

Иногда для удобства анализа данных их необходимо группировать. Т.е. если в источнике записей есть записи, повторяющиеся по каким-либо критериям, подчас лучше привести их к одной и вывести их количество.

Итак, есть две таблицы: «Ассортимент», содержащая список товаров, которыми торгует гипотетическая фирма «Рога_и_копыта», и безграмотно составленная таблица «Склад», в которую при нахождении каждого экземпляра товара добавляли запись. Надо сделать так, чтобы данные из этих таблиц отобразались наглядно.

Таблица «Ассортимент» содержит поля «ID_товара» и «Наименование», а связанная с ней таблица «Склад» - только «ID_товара».

Вначале создадим запрос «Склад_гр», который сгруппирует повторяющиеся записи в таблице «Склад» и выведет количество повторений для каждой записи. Для этого применим групповую операцию Count и конструкцию GROUP BY.

В общем виде группировка выглядит так:

SELECT (список_полей) FROM (список_таблиц) GROUP BY (список_полей);

В нашем случае мы получим такой запрос:

SELECT ID_товара, Count(ID_товара) AS Количество FROM Склад

GROUP BY ID_товара;

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

SELECT Количество FROM Склад_гр INNER JOIN Ассортимент ON (Склад_гр.ID_товара = Ассортимент.ID_товара);

Возвращенный таким запросом источник записей будет иметь следующую структуру:

Количество

ID_товара

Наименование

Как раз то, что нужно.

2.5. Сортировка полученных результатов

Для того, чтобы сделать вывод упорядоченным, язык SQL предлагает использование конструкции ORDER [ASCEND|DESCEND] BY (поле). ASCEND/DESCEND - это направление сортировки - по возрастанию или убыванию, соответственно. Модернизируем наш предыдущий запрос таким образом, чтобы он при выводе сортировал данные по полю «Наименование»:

SELECT Количество FROM Склад_гр INNER JOIN Ассортимент ON (Склад_гр.ID_товара = Ассортимент.ID_товара)

ORDER ASCEND BY Наименование;

На этом закончим рассмотрение (несколько поверхностное) предложений SELECT.

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

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

Иногда, зачастую в серверных базах данных или при использовании элементов программирования в Microsoft Access требуется динамически добавить запись в таблицу. Язык SQL предлагает использовать для этих целей предложение INSERT INTO.

Общая структура этого типа запросов такова:

INSERT INTO ИМЯ_ТАБЛИЦЫ VALUES (список значений);

Список значений всегда должен быть равен по количеству элементов количеству полей в изменяемой таблице. Если же надо ввести только некоторые поля, для остальных 0 или NULL для строковых полей. Также можно использовать выражения.

Например, есть таблица «товары»

ID_товара

Наименование

Количество

Допустим, нам надо добавить запись в эту таблицу, но беда в том, что поле ID_товара - ключевое и иммет тип «Счетчик». Нарушать его нельзя, поэтому воспользуемся групповой операцией Max().

INSERT INTO Товары VALUES

(MAX(ID_Товара)+1, `Какой-то товар', 10);

Таким образом, мы сохранили порядок счета.

Следует заметить, что предложение INSERT является одним из самых простых в SQL. Никаких дополнительных конструкций в нем не используется.

4. Запросы на обновление

Иногда, опять-таки, зачастую при использовании элементов программирования, может потребоваться динамическое изменение всех или части записей в таблице. Для этого применяется предложение UPDATE.

Допустим, со склада раз в месяц осуществляется отгрузка. Отгружают по одному артикулу каждого товара. Если какой-то товар на складе отсутствует, его, соответственно, не отгружают.

Общая структура запросов на обновление:

UPDATE Имя_таблицы SET

(список значений или список выражений «Поле=значение»);

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

Наш запрос на отгрузку будет выглядеть так:

UPDATE Товары SET (Количество=Количество - 1)

WHERE (Количество > 0);

Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.