Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Запросы.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
96.26 Кб
Скачать

5

Тема. Запросы

Характерной особенностью компонента TQuery (запрос) является использование в нем специального языка для работы с реляционными БД – SQL (Structured Query Language – язык структурированных запросов). С помощью этого языка программист составляет SQL-запрос, который помещается в специально для этого предназначенное свойство SQL компонента TQuery. После вызова метода Open или ExecSQL компонента TQuery этот запрос передается машине баз данных BDE. Она имеет встроенный интерпретатор SQL, позволяющий ей выполнять описанные в запросе действия.

Если запрос требует получения из БД нужных сведений (запрос SELECT), сформи­рованные с помощью BDE данные помещаются в локальную таблицу в виде временного файла, и TQuery становится владельцем этой таблицы. Данные из временной таблицы через компонент-посредник TDataSource передаются визуальным компонентам и отобра­жаются в них. Пользователь не может изменять данные, так как они представляют собой лишь копию реальных данных. Для изменения хранящейся в БД информации формиру­ются специальные запросы (INSERT, UPDATE, DELETE).

При некоторых ограничениях на SQL-запрос компонент TQuery может создать «живой» НД, и вносимые в него изменения BDE будет немедленно переносить в таблицу БД.

Широкие возможности SQL позволяют с помощью компонентов TQuery получать НД, которые невозможно получить с помощью ТТаblе (например, объединение в одном НД данных из нескольких таблиц БД). При работе с серверными БД компонент ТТаblе теряет всякие преимущества, так как в этом случае он также создает временную таблицу, являющуюся локальной копией серверной таблицы БД, а уже затем формирует из нее нуж­ный НД. Затраты времени на создание больших локальных таблиц и значительно более скромные возможности компонента ТТаblе в отношении получения сложных НД практически исключают его использование в клиент-серверных приложениях.

Простая выборка данных

Для выборки данных служит оператор SELECT. В простейшем виде этот оператор имеет такой формат:

SELECT Список_полей FROM Список_таблиц

Здесь SELECT (выбор) и FROM (из) – зарезервированные слова. Подобно зарезер­вированным словам Delphi они не могут использоваться в качестве имен полей, таблиц или иных сущностей БД. Если из таблиц в списке таблиц выбираются все поля, вместо списка полей можно указать символ звездочки (*). Например,

SELECT * FROM Books

Запрос означает выбор всех полей из таблицы Books.

SQL-интерпретатор BDE игнорирует регистр букв в зарезервированных словах или названиях полей, таблиц и других сущностей БД (индексы, ограничения и т. п.).

Этот простейший формат выборки позволяет формировать НД из нужных полей нужных таблиц. Например, следующий оператор выберет только три поля из таблицы Books:

SELECT BName, BAuthor, BPublish FROM Books

Здесь BName – название книги, BAuthor – автор(ы), BPublish – издательство.

Выборка из связанных таблиц

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

Чтобы учесть реляционную связь по полям NFirm и FirmID, нужно установить кри­терий отбора:

SELECT * FROM Nakls, Firms

WHERE FirmID=NFirm

Здесь Nakls (Накладные), Firms (Партнеры) – таблицы; FirmID (уникальный иден­тификатор партнера) – поле таблицы Firms, NFirm (уникальный идентификатор партнера) – поле таблицы Nakls.

Критерий отбора формулируется в секции, которая начинается зарезервированным словом WHERE (где). Чтобы связать две таблицы, следует указать, что для каждой записи таблицы Nakls (она открывает перечень таблиц) в поле NFirm содержится шифр связанной с ней записи из таблицы Firms. В результирующем НД будет столько записей, сколько их имеется в таблице Nakls, причем к каждой записи Nakls будут справа добавлены все поля записи таблицы Firms с информацией об указанном в накладной партнере.

Связывание таблиц в запросе не требует обязательного наличия индексов по под­становочным полям, но если такие индексы есть, BDE будет их использовать.