Тема. Запросы
Характерной особенностью компонента 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 будет их использовать.
