Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба 1-13 3ий сем (Задания) / КИТ_лр6_access_запросы.doc
Скачиваний:
40
Добавлен:
15.06.2014
Размер:
967.17 Кб
Скачать
    1. Sql-запросы для выборки данных из нескольких таблиц

Для выборки данных из нескольких таблиц используется команда объединения таблиц, включаемая в команду SELECT:

Таблица1 INNERJOINТаблица2ONТаблица1.Поле1=Таблица2.Поле2

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

Пример 9.5.Создать запрос для получения списка штукатуров и каменщиков, имеющих разряд не ниже пятого. В запросе должны указываться следующие данные: табельный номер, фамилия, имя и отчество, разряд, допуск к работам на высоте, а также шифр объекта и название заказчика, у которого работает данный рабочий. Запрос должен быть упорядочен по фамилиям рабочих.

SELECT Рабочие.[Табельный номер], Рабочие.Фамилия, Рабочие.[Имя и отчество],

Рабочие.Профессия, Рабочие.Разряд, Рабочие.[Допуск на высоту],

Рабочие.[Шифр объекта], Объекты.Заказчик

FROM Объекты INNER JOIN Рабочие ON Объекты.[Шифр объекта] =

Рабочие.[Шифр объекта]

WHERE ((Рабочие.Профессия="штукатур") OR (Рабочие.Профессия="каменщик"))

AND (Рабочие.Разряд>=5)

ORDER BY Рабочие.Фамилия;

Здесь часть команды

FROM Объекты INNER JOIN Рабочие ON Объекты.[Шифр объекта] = Рабочие.[Шифр объекта]

означает, что данные должны выбираться из таблиц ОбъектыиРабочие, между которыми имеется связь 1:М (причем таблицаОбъектынаходится со стороны 1, аРабочие– со стороны М, т.е. одному объекту может соответствовать несколько рабочих). Таблицы связаны по полюШифр объекта, которое имеется в обеих таблицах.

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

    1. Sql-запросы с вычисляемыми полями

Пример 9.6.Создать запрос для получения списка объектов. Для каждого объекта должно указываться все данные об объекте, имеющиеся в таблицеОбъекты, а также величина налога, составляющая 10% от стоимости контракта. Список объектов должен быть упорядочен по названию заказчика, а для каждого заказчика – по дате окончания строительства. Аналогичная задача решалась в примере 3.2.

SELECT [Шифр объекта], Заказчик, [Вид объекта], [Стоимость контракта],

[Дата заключения], [Дата окончания], [Стоимость контракта]*0.1 AS [Налог]

FROM Объекты

ORDER BY Заказчик, [Дата окончания];

Как видно из примера, вычисляемое поле описывается следующим образом: формула для вычисления (в данном случае [Стоимость контракта]*0.1), затем слово AS, затем – имя вычисляемого поля (в данном случае –Налог).

Так как в этом примере все данные берутся из одной таблицы (Объекты), указывать имя таблицы перед именами полей необязательно.

    1. Sql-запросыcгрупповыми операциями

Общий вид команды SELECT, применяемой для таких запросов, следующий:

SELECT поля и статистические функции

FROM таблицы или запросы

GROUP BY поля для группировки

HAVINGусловия

ORDERBYусловия сортировки;

Здесь поля и статистические функции– данные, которые должны быть получены в результате выполнения запроса;поля для группировки– поля, используемые для групповых операций (например, если требуется вычислить сумму стоимостей или количество контрактов для каждого заказчика, то в разделеGROUPBYбудет указано поле Заказчик);условия– условия выборки данных. РазделHAVINGв запросах с групповыми операциями аналогичен разделуWHEREв обычных запросах. Он всегда указывается после разделаGROUPBY.

Пример 9.7.Создать запрос для подсчета суммарной стоимости контрактов и количества контрактов каждого заказчика (эта же задача решалась в примере 5.1).

SELECT Заказчик, Sum([Стоимость контракта]) AS [Стоимость контрактов],

Count([Шифр объекта]) AS [Количество]

FROM Объекты

GROUP BY Заказчик;

Здесь выражение GROUPBYЗаказчикозначает, что записи в таблицеОбъекты(указанной в разделеFROM) будут сгруппированы по значению поляЗаказчик. Для записей с одинаковым значением этого поля будет подсчитана сумма значений поляСтоимость контракта; для этого указано выражение Sum([Стоимость контракта]). Результат будет выводиться на экран под именемСтоимость контрактов(указывается после словаAS). Будет также подсчитано количество значений шифра объекта (т.е. количество записей) с одинаковым значением поляЗаказчик; для этого используется функцияCount.

Примечание. Вместо выражения Count([Шифр объекта]) можно указать Count(*). Такая операция представляет собой подсчет количества записей.

Пример 9.8.Создать запрос для получения тех же данных, что и в примере 9.7, но требуется только информация о заказчиках, для которых стоимость контрактов составляет не менее 100 млн ден.ед.

SELECT Заказчик, Sum([Стоимость контракта]) AS [Стоимость контрактов],

Count([Шифр объекта]) AS [Количество]

FROM Объекты

GROUPBYЗаказчик

HAVING Sum([Стоимость контракта])>=100000000;

Пример 9.9.Создать запрос для подсчета количества рабочих каждой профессии. Запрос должен быть упорядочен по количеству рабочих (первыми должны выводиться профессии с максимальным количеством рабочих), а при одинаковом количестве рабочих – по профессии (в алфавитном порядке). Аналогичная задача решалась в примере 5.3.

SELECT Профессия, Count([Табельный номер]) AS [Количество]

FROM Рабочие

GROUP BY Профессия

ORDER BY Count([Табельный номер]) DESC, Профессия;

Пример 9.10.Создать запрос для подсчета суммы налогов (аналогичная задача решалась в примере 5.4).

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

SELECT Sum([Налог]) AS [Сумма налогов]

FROM [Список объектов];

Здесь Налог– имя вычисляемого поля, имеющегося в запросеСписок объектов.