Вибір інформації з бази даних

При роботі з базою даних користувача, як правило, цікавить не весь її вміст, а деяка конкретна інформація. Знайти потрібні відомості можна послідовним переглядом записів. Однак такий спосіб пошуку незручний і малоефективний.

Більшість систем управління базами даних дозволяють зробити вибірку потрібної інформації шляхом виконання запитів. Користувач відповідно до певних правил формулює запит, вказуючи, якими критеріями повинна задовольняти його цікавить інформація, а система виводить записи, що задовольняють запиту.

Для вибірки з бази даних записів, що задовольняють деякому критерію, призначений компонент Query (рис. 17.17).

Рис. 17.17. Значок компонента Query

Компонент Query схожий на компонент Table, але, на відміну від останнього, він представляє не всю базу даних (всі записи), а тільки її частину – записи, що задовольняють критерію запиту.

У табл. 17.18 перераховані деякі властивості компонента Query.

Таблиця 17.18. Властивості компонента Query

Властивість

Визначає

Name Ім’я компонента. використовується компонентом Datasource для зв’язку результату виконання запиту (набору записів) з компонентом, що забезпечує перегляд записів, наприклад DBGrid
SQL Записаний на мові SQL запит до бази даних (до таблиці)
Active При присвоєнні властивості значення True активізує виконання запиту

Для того щоб під час розробки програми задати, яка інформація буде виділена з бази даних в результаті виконання запиту, властивість SQL має містити представлений на мові SQL запит на вибірку даних.

У загальному вигляді запит на вибірку з таблиці даних виглядає так:

SELECT Список-Полів FROM Таблиця WHERE (Критерій) ORDER BY СпісокПолей

де:

  • SELECT – команда вибору записів з таблиці і виведення вмісту полів, імена яких вказані в списку;
  • FROM – параметр команди, який визначає ім’я таблиці, з якої потрібно зробити вибірку;
  • WHERE – параметр, який задає критерій вибору. У найпростішому випадку критерій – це інструкція перевірки вмісту поля;
  • ORDER BY – параметр, який задає умову, відповідно до якого будуть впорядковані записи, що задовольняють критерію запиту.

Наприклад, запит

SELECT Fam, Name FROM ': Школа: school.db' WHERE
(Class = '10a') ORDER BY Name, Fam

забезпечує вибірку з бази даних” Школа ” (З таблиці School.db) записів, у яких в поле class знаходиться текст 10а, т. е. формує алфавітний список учнів 10-а класу.
Інший приклад. запит

SELECT Fam, Name FROM ": Школа: school.db " WHERE
(Fam >'K') and (Fam < 'Л') ORDER BY Name, Fam

забезпечує вибір інформації про учнів, прізвища яких починаються на букву К.
Запит може бути сформований і записаний в властивість SQL під час розробки форми або під час роботи програми.
Для запису запиту в властивість SQL під час розробки форми використовується редактор списку рядків (Рис. 17.18), вікно якого відкривається в результаті клацання на кнопці з трьома точками в рядку властивості SQL вікна Object Inspector


Рис. 17.18. Приклад запиту до бази даних ” Школа “

Властивість SQL представляє собою список рядків. Тому щоб сформувати запит під час роботи програми, потрібно, використовуючи метод Add, додати рядки (SQL-інструкції) в список SQL.
Нижче наведено фрагмент коду, який формує запит на пошук інформації про конкретну людину (критерій вибору – вміст поля Fam має збігатися зі значенням змінної fam).

with forml.Queryl do begin
Close; // закрити файл - результат виконання
// попереднього запиту
SQL.Clear; // видалити текст попереднього запиту
// записуємо новий запит в властивість SQL
SQL.Add ( 'SELECT Fam, Name, Class 1 );


SQL.Add ( 'FROM =: Школа: school.db = ');
SQL.Add ( 'WHERE');
SQL.Add ( '(Fam = '= + Fam + '=)');
SQL.Add ( 'ORDER BY Name, Fam ');
Open; // активізуємо виконання запиту
end;

Наступна програма, її текст приведений в лістингу 17.2, а діалогове вікно – на рис. 17.19, демонструє можливість зміни запиту, точніше, критерію запиту, під час роботи програми. Програма забезпечує виведення як всього списку учнів, так і його частини. наприклад, за допомогою виконання запиту виводиться інформація тільки про конкретний учня.
Для перегляду бази даних і результату виконання запиту використовується компонент DBGrid1, який через компонент DataSourcel взаємодіє з компонентом Table1 (при перегляді всій бази даних) або з компонентом Query (при перегляді результату виконання запиту).

Рис. 17.19. Форма додатки База даних Школа

Лістинг 17.2. База даних Школа “

unit school2 _;

interface

uses
Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms,

Dialogs, Grids, DBGrids, Db,

DBTables, ExtCtrls, DBCtrls, StdCtrls;

type
TForm1 = class (TForm)
Table1: TTable; // таблиця (вся база даних)
Query1: TQuery; // запит (записи БД, що задовольняють критерію вибору)
DataSource1: TDataSource; // джерело даних - таблиця або запит
DBGrid1: TDBGrid; // таблиця для відображення БД або результату виконання запиту
DBNavigator1: TDBNavigator;
DBText1: TDBText;
Button1: TButton; // кнопка запит
Button2: TButton; // кнопка Всі записи
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
procedure FormActivate (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
end;

var
Form1: TForm1;

implementation

{$ R * .DFM}

// клацання на кнопці Запит
procedure TForm1.Button1Click (Sender: TObject);
var
fam: string [30];
begin
fam: = InputBox ( 'Вибірка інформації з БД',
'Вкажіть прізвище та клацніть на OK.', '');
if fam <> '' // користувач ввів прізвище
then
begin
with form1.Query1 do begin
Close; // закрити файл-результат виконання попереднього запиту
SQL.Clear; // видалити текст попереднього запиту
// записуємо новий запит в властивість SQL
SQL.Add ( 'SELECT Fam, Name, Class');
SQL.Add ( 'FROM: Школа: school.db ');
SQL.Add ( 'WHERE');
SQL.Add ( '(Fam = ' + fam + ')');
SQL.Add ( 'ORDER BY Name, Fam');
Open; // активізуємо виконання запиту
end;

{*** інший варіант зміни критерію запиту
begin
Query1.Close;
Query1.SQL [3]: = '(Fam = >' + fam + '>)';
Query1.Open;
DataSource1.DataSet: = Query1;
end;
}
if Query1.RecordCount <> 0 then
DataSource1.DataSet: = Query1 // відобразити рез-т виконання запиту
else begin
ShowMessage ( 'В БД немає записів, які відповідають критерію запиту.');
DataSource1.DataSet: = Table1;
end;
end;
end;

// клацання на кнопці Все записи
procedure TForm1.Button2Click (Sender: TObject);
begin
DataSource1.DataSet: = Table1; // джерело даних - таблиця
end;

// активізація форми
procedure TForm1.FormActivate (Sender: TObject);
begin
DataSource1.DataSet: = Table1;
Table1.Active: = True;
end;

end.

Процедура TForm1.Button1Click запускається клацанням кнопки Запит. Вона приймає від користувача рядок (Прізвища) і записом (додаванням) рядків в властивість SQL формує текст запиту. Потім ця процедура викликом методу Open активізує виконання запиту.
Слід звернути увагу на те, що перед зміною властивості SQL-запит повинен бути закритий за допомогою методу close (тут треба згадати, що результат виконання запиту – це файл даних (таблиця), який створюється в результаті виконання запиту).
Процедура TForm1.Button2Click, яка запускається клацанням кнопки Все записи, встановлює в якості джерела даних для компонента DataSourcel компонент Table1, тим самим забезпечуючи перехід в режим перегляду всієї бази даних.
Якщо запит записаний в властивість SQL під час розробки форми програми, то під час роботи програми критерій запиту можна змінити простою заміною відповідного рядка тексту запиту.
Наприклад, для запиту

SELECT DISTINCT Fam, Name, Class FROM : Школа: school.db  WHERE
(Class = '10 а ') ORDER BY Name, Fam
інструкція заміни критерію запиту може бути такою:
forml.Query1.SQL [3]: = '(Fam = ' + Fam + ')'

Слід звернути увагу на те, що властивість SQL є структурою типу TStrings, в якій рядки нумеруються з нуля.