Создание запросов SQL


Все запросы, которые мы рассматривали до сих пор, создавались либо с помощью мастера, либо с помощью Конструктора запросов. Конструктор запросов представляет собой графический инструмент для создания запросов по образцу (QBE — Query By Example). Однако на самом деле любой запрос хранится в базе данных в формате SQL (Structured Query Language — язык структурированных запросов). Основное достоинство этого языка состоит в том, что он является стандартом для большинства реляционных СУБД. SQL имеет унифицированный набор инструкций, которые можно использовать во всех СУБД, поддерживающих этот язык. Действующим на данный момент стандартом языка SQL является принятая Американским национальным институтом стандартов (American National Standards Institute — ANSI) версия SQL-92. Фирмы — разработчики СУБД при реализации языка SQL могут вносить в него расширения, но обязаны реализовать базовый набор команд ASNSI SQL.
Процессор обработки данных Jet является составной частью Access и выполняет инструкции Access SQL (Jet SQL), который отличается от ANSI SQL существенно (как правило, настольные СУБД, совместимые со стандартом SQL, реализуют не все инструкции ANSI SQL).
Замечание
В дальнейшем для обозначения используемого в Access диалекта языка SQL мы будем применять термин Jet SQL. Это будет правильнее, т. к. процессор обработки данных используется не только в приложениях, созданных в среде Access, но и в приложениях, разработанных с помощью Microsoft Visual Basic.
В данном разделе мы собираемся дать обзор используемого в Access языка SQL и показать, как можно создать запросы, которые невозможно создать с помощью Конструктора запросов.
Сравнение ANSI и Jet SQL
Язык Jet SQL почти соответствует стандарту ANSI SQL-89. В реализацию языка SQL для Microsoft Jet 4.x (используемого, начиная с версии Microsoft Access 2000) внесены несколько расширений, которые приближают его к стандарту ANSI SQL-92 и
Transact-SQL — диалекту языка SQL для Microsoft SQL Server. Для тою чтобы обеспечить совместимость с предыдущими версиями Microsoft Jet, эти расширения можно использовать только в специальном режиме — ANSI SQL-92.
Замечание
Режим ANSI SQL-92 доступен только при использования программы Microsoft OLE DB Provider для Jet.
Все запросы, которые создаются в режиме ANSI SQL-92, помечаются специальным флажком, причем в одной базе данных могут храниться как обычные SQL-запросы, так и запросы, созданные в расширенном синтаксисе.
Основные различия языков Jet SQL и ANSI SQL состоят в следующем:

  • они имеют разные наборы зарезервированных слов и типов данных;
  • разные правила применимы к оператору Between. . .And, используемому для определения условий выборки записей;
  • подстановочные знаки ANSI и Microsoft Jet, которые используются в операторе Like, взаимно исключают друг друга;
  • язык Jet SQL обычно предоставляет пользователю большую свободу, например разрешается группировка и сортировка по выражениям;
  • язык Jet SQL позволяет использовать более-сложные выражения.

 

 

Зарезервированные слова Jet SQL
Приведенные здесь таблицы предназначены для сравнения зарезервированных слов ANSI SQL и Jet SQL.
Ниже перечисляются зарезервированные слова Jet SQL, которые идентичны зарезервированным словам ANSI SQL (знаком звездочки помечены слова, которые доступны только в режиме ANSI SQL-92):

ADD

COMMIT*

FETCH*

MAX

ROLLBACK*

ALL

CONSTRAINT

FROM

MIN

SELECT

ALTER

COUNT

FOREIGN

NOT

SET

ANY

CREATE

GRANT*

NULL

SOME

ALIAS

CREATE VIEW*

HAVING

ON

TRANSACTION*

AS

CURRENT*

IN

OR

UNION

ASC

CURSOR*

INDEX

ORDER

UNIQUE

AUTHORAZATI ON*

DECLARE*

INNER

OUTER

UPDATE

AVG

DELETE

INSERT

PARAMETERS

VALUE

 

BEGIN*

DESC

INTO

PRIMARY

VALUES

BETWEEN

DISALLOW

IS

PRIVILEGES*

WHERE

BY

DISTINCT

JOIN

PROCEDURE

WORK*

CHECK*

DROP

KEY

REFERENCES

CLOSE*

DROP VIEW*

LEFT

REVOKE*

COLUMN

EXISTS

LIKE

RIGHT

Зарезервированные слова, обозначающие типы данных, не включены в этот список, т. к. соответствие типов данных ANSI SQL и Jet SQL приводится ниже, в. Большинство операторов сравнения в ANSI SQL и Jet SQL совпадают: =, <, <=, > и =>. Исключение составляет оператор неравенства. Оператору неравенства ! = в ANSI SQL соответствует оператор <> в Jet SQL.
Как и в ANSI SQL, зарезервированное слово Jet SQL IN может быть использовано для задания списка значений в предложении WHERE или списка, созданного подчиненным запросом. Оператор IN также может использоваться для идентификации таблицы в другой базе данных.
Хотя в последней версии Jet SQL появились новые инструкции, связанные с обработкой транзакций (раньше они реализовывались с помощью процедур VBA), тем не менее существует отличие в механизме выполнения транзакции от рекомендуемого ANSI SQL:

  • автоматический запуск транзакции невозможен. Чтобы начать транзакцию, ее необходимо явно запустить с помощью инструкции BEGIN TRANSACTION;
  • допускается пять уровней вложения транзакций. Чтобы запустить вложенную транзакцию, воспользуйтесь инструкцией BEGIN TRANSACTION в контексте существующей транзакции;
  • для присоединенных (связанных) таблиц транзакции не поддерживаются.

В обычном режиме ряд инструкций ANSI SQL не поддерживается, однако их можно реализовать другими средствами Access: меню, кнопками, диалоговыми окнами. В приведен список инструкций ANSI SQL и эквивалентные им средства Access.
Таблица 8.3. Зарезервированные слова ANSI SQL, не поддерживаемые Access SQL

Зарезервированное слово

Эквивалент в Access

AUTHORIZATION

Диалоговое окно прав доступа

BEGIN

Метод Access VBA BeginTrans

CHECK

Свойство Условие на значение поля таблицы

CLOSE

Кнопка системного меню Закрыть

COMMIT

Метод Access VBA CommitTrans

CREATE VIEW

Режим конструктора запросов и фильтры

CURRENT

Запрос в режиме таблицы, области выделения записи

CURSOR

Запрос в режиме таблицы

DECLARE

Запрос в режиме таблицы (курсор поддерживается автоматически)

DROP VIEW

Режим конструктора запросов

FETCH

Поля в форме или отчете

GRANT, PRIVILEGES, REVOKE

Диалоговое окно прав доступа

ROLLBACK

Метод Access VBA RollbackTrans

TRANSACTION

Методы транзакций в Access VBA

VALUES

Значения, введенные в таблицы или формы

WORK

Метод Access VBA BeginTrans