(SELECT Оклад FROM Зарплата WHERE Оклад < Зп1.Оклад)
ORDER BY ФИО;
Для таблицы «Зарплата» из внешнего запроса определяется псевдоним
«Зп1», поскольку имя ее поля используется во вложенном запросе, в котором
фигурирует таблица с таким же именем и полями.
Для вложенных запросов, взаимодействующих с оператором EXISTS, нет
ограничений по количеству полей, поскольку сами извлекаемые данные опера-
тором никак не обрабатываются, его интересует лишь их принципиальное на-
личие или отсутствие.
Предложение UNION … SELECT. Иногда может возникнуть необходи-
мость объединить данные из нескольких источников, как показано на рис. 1.2.

Рис. 1.2. Объединение данных из двух источников
Для этой цели используется предложение UNION оператора SELECT (см.
выше общую форму оператора SELECT). В основном операторе SELECT вы-
полняется выборка, формирующая первый результирующий набор, затем, после
ключевого слова UNION помещается еще один оператор SELECT, форми-
рующий второй набор. При выполнении такого запроса оба набора объединя-
ются. Объединяться могут данные более чем двух источников. При этом пред-
ложение UNION … SELECT будет использовано несколько раз.
Количество и типы данных полей, формируемых каждым из запросов
SELECT, должны быть одинаковыми. Имена (псевдонимы) столбцов можно
задавать только в основном операторе SELECT. Если их задать в дополнитель-
ных операторах, Access их проигнорирует.
Пример 1.19. Есть две таблицы. Одна содержит данные о книгах, вторая – о
журналах:
Построим запрос, объединяющий данные из этих двух таблиц в результи-
рующий набор, содержащий поля «Заголовок», «Год» и «Тип».
SELECT НазваниеЖурнала + " / № " + STR(НомерЖурнала) AS Заголовок,
ГодЖурнала AS Год,
"Журнал" AS Тип
FROM Журнал
UNION SELECT НазваниеКниги + " / " + АвторКниги,
ГодИзданияКниги,
"Книга"
FROM Книга
ORDER BY Заголовок;

Результат работы запроса:
Предложение ORDER BY применяется не ко второму запросу, а к резуль-
тату объединения.
По умолчанию при слиянии двух наборов, Access объединяет строки, кото-
рые полностью совпадают. Если этого делать не нужно, следует использовать
ключевое слово ALL (… UNION ALL SELECT …).
Предложение INTO … Использование в операторе SELECT конструкции
вида
SELECT <поля> INTO <новая таблица>
…
позволяет поместить результат запроса в таблицу, которая будет для этого соз-
дана.
Пример 1.20.
SELECT ИДЖурнала, НазваниеЖурнала INTO ЖурналНовая
FROM Журнал;
Создается таблица с названием «ЖурналНовая» и в нее помещаются сле-
дующие данные:
Конструкция TRANSFORM … PIVOT. Данная конструкция предназначе-
на для создания перекрестных запросов (см. [1]). Общая форма:
TRANSFORM <выражение>
SELECT <предложение>
FROM <предложение>
…
GROUP BY <предложение>
PIVOT <имя поля>;
Конструкция TRANSFORM … PIVOT отсутствует в стандарте языка SQL.
Значения полей, перечисленных в предложении SELECT, образуют заго-
ловки строк таблицы. Эти же поля должны быть указаны в предложении
GROUP BY. Значения поля, указанного в предложении PIVOT, образуют заго-
ловки столбцов таблицы. Значения выражения, записанного в предложении
TRANSFORM, размещаются в ячейках таблицы. Данное выражение должно
содержать групповую операцию.

Пример 1.21.
TRANSFORM Count(Подписка.Журнал) AS Количество
SELECT Список.Фамилия
FROM
(SELECT Клиент.КодКлиента, Клиент.Фамилия,
Журнал.КодЖурнала, Журнал.Название
FROM Журнал, Клиент
AS) Список
LEFT JOIN Подписка
ON (Список.КодЖурнала=Подписка.Журнал) AND
(Список.КодКлиента=Подписка.Клиент)
GROUP BY Список.Фамилия
PIVOT Список.Название;
Результат работы запроса:
Заголовки строк – фамилии клиентов, заголовки столбцов – названия жур-
налов, а содержимое таблицы – количество подписок данного клиента на дан-
ный журнал.
Этот запрос отличается от представленного в [1] при описании конструкто-
ра запросов тем, что в нем отображены все клиенты, независимо от того, под-
писаны ли они на какой-то журнал, и все журналы, независимо от того, подпи-
сан ли на них кто-то из клиентов.
Для получения такого результата был использован вложенный запрос, фор-
мирующий декартово произведение таблиц «Клиент» и «Журнал» (т.е. все воз-
можные их пары):
Результат вложенного запроса с помощью LEFT JOIN объединяется с дан-
ными из таблицы «Подписка», после чего выполняется группировка строк (по
фамилии и названию) и групповая операция Count().
Поскольку этот перекрестный запрос содержит вложенный запрос, его не-
возможно адекватно представить в режиме конструктора (вернее, конструктор
способен отобразить такой запрос, но не дает возможности его создать или от-
редактировать). Изменять его можно только в режиме SQL.
Для того чтобы все-таки реализовать то же самое, не прибегая к SQL, нуж-
но создать отдельный объект-запрос, выполняющий то же, что и вложенный за-
прос здесь, затем использовать его в качестве источника при построении нового
запроса.
Оператор INSERT INTO. Оператор добавляет новые записи в таблицу.
INSERT INTO имя_таблицы
[(имя_столбца[,имя_столбца …])]
VALUES (значение[, значение …])
Добавляет в таблицу строку, присваивая указанным полям перечисленные
значения.
INSERT INTO имя_таблицы
[(имя_столбца[,имя_столбца …])]
SELECT …
Добавляет в таблицу строки, сформированные оператором SELECT.
Пример 1.22.