Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции Delphi (Колосов).pdf
Скачиваний:
77
Добавлен:
11.05.2015
Размер:
2.57 Mб
Скачать

Procedure Edit; – устанавливается режим редактирования,

Procedure Post; virtual; – запись изменений в текущую строку,

Function Seek(const KeyValues: Variant; SeekOption: TSeekOption = soFirstEQ): Boolean; – поиск записи по значению ключевого или индексного поля. Например, в таблице TSpis найдем «Иванова» по индексному полю

FIO:

If ADOTable1.Seek(’Иванов’, soFirstEQ) then ……; Перед

этим

оператором нужно будет определить текущим индексное поле «FIO»,

 

Function Locate(const KeyFields: String; const KeyValues: Variant; Options: TLocateOptions): Boolean; override; – поиск записи по заданным полям.

Например, найдем «Иванова» с 10–летним стажем работы:

If ADOTable1.Locate(’FIO,STAG’,varArrayOf([’Иванов’,’10’]),[])Then …;

29.4. Работа с локальной базой данных

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

Рассмотрим фрагмент программы, которая в таблице TSpis увеличивает зарплату сотрудников в 2 раза:

With ADOTable1 Do Begin

DisableControls; // Отключаем связь визуальных компонентов с таблицей First; // Устанавливаем указатель в начало первой записи

While not Eof do Begin // Открываем цикл просмотра таблицы

//Переводим оклад сотрудника из строки в целое число

I:=SysUtils.StrToInt(FieldByName(’OKLAD’).AsString); I:=I*2; // Увеличиваем оклад в 2 раза

Edit; // Включаем режим редактирования таблицы

//Записываем новый оклад в текущую запись

FieldByName(’OKLAD’).AsString:=SysUtils.IntToStr(I); Post; // Сохраняем изменения в таблице

Next; // Переходим к следующей записи End; // Конец цикла

//Восстанавливаем связь визуальных компонентов с таблицей

EnableControls;

End;

Вэтом примере мы использовали методы DisableControls и EnableControls для отключения и восстановления связи таблицы с визуальными компонентами, что–бы избежать прокрутки значений таблицы в визуальных компонентах при изменении значений зарплаты сотрудников во всей таблице.

30. ОСНОВЫ ЯЗЫКА SQL

Язык структурированных запросов SQL (Structured Query Language) используется в основном для работы с удаленными базами данных. Однако многие программы взаимодействия с БД , например MS Accesss, работают и с локальными базами данных через SQL.

147

30.1. Составные части SQL

SQL состоит из 3 частей:

DML (Data Manipulation Language) – язык манипулирования данными,

DDL (Data Definition Language) – язык определения данными,

DCL (Data Control Language) – язык управления данными.

DML

DML состоит из 4 основных команд:

Select – выбрать записи из таблиц,

Insert – вставить записи в таблицу,

UpDate – обновить записи в таблице,

Delete – удалить записи из таблицы.

DDL

DDL состоит из следующих команд:

Create DataBase – создать базу данных,

Create Table – создать таблицу,

Create View – создать временную таблицу,

Create Trigger – создать триггер, т.е. хранимую процедуру, которая будет вызываться автоматически при наступлении какого–то события,

Create Index – создать индекс,

Create Procedure – создать хранимую процедуру,

Alter DataBase – модифицировать базу данных,

Alter Table – модифицировать таблицу,

Alter View – модифицировать временную таблицу,

Alter Trigger – модифицировать триггер,

Alter Index – модифицировать индекс,

Alter Procedure – модифицировать хранимую процедуру,

Drop DataBase – удалить базу данных,

Drop Table – удалить таблицу,

Drop View – удалить временную таблицу,

Drop Trigger – удалить триггер,

Drop Index – удалить индекс,

Drop Procedure – удалить хранимую процедуру.

DCL

DCL управляет доступом к базе данных:

Grand – дать права доступа к базе данных,

Revoke – отобрать права доступа к базе данных.

Остановимся на рассмотрении только наиболее важной команды языка манипулирования данными – Select.

30.2. Команда SELECT

Эта команда предназначена для выбора информации из базы данных. Результатом работы команды Select (выбор) всегда является таблица. Общая форма данной команды имеет вид

148

Select [Distinct] <список полей> From <список таблиц> [Where <условия отбора>]

[Group By <поля> [Having <условия отбора для группировки>] [Union <другой Select>]

[Order By <поля или номера полей>];

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

Select FIO From Tspis;

В результате мы получим следующую таблицу:

FIO

Иванов

Сидоренко

…….

Если вместо списка имен полей поставить символ «*» (звездочка), то в итоговую таблицу будут включены все поля таблицы.

При описании полей выбора перед каждым именем поля можно вставить текстовую константу (литерал), которая будет выступать в роли «псевдостолбца». Например:

Select ”Фамилия”, FIO, ” получает”, OKLAD, ” рублей” From TSpis;

Теперь мы получим следующую таблицу:

 

FIO

 

OKLAD

 

Фамилия

Иванов

получает

300000

рублей

Фамилия

Сидоренко

получает

200000

рублей

…..

…..

…..

…..

…..

Квалификатор As

Квалификатор As позволяет при выводе итоговой таблицы изменять названия столбцов и таблиц, например:

Select FIO as Фамилия, OKLAD as Зарплата From TSpis;

Эта команда даст следующую таблицу:

Фамилия

Зарплата

Иванов

300000

Сидоренко

200000

…..

……

Агрегатные функции

Эти функции позволяют производить вычисления над значениями какого–то столбца или подсчитать число строк в таблице:

Sum – суммирование значений столбца;

Min – определение минимального значения в столбце;

Max – определение максимального значения в столбце;

Avg – определение среднего значения от значений столбца;

149

First – первое значение в столбце;

Last – последнее значение в столбце;

StDev – оценка среднеарифметического отклонения;

StDevp – несмещенная оценка среднеарифметического отклонения;

Var – оценка дисперсии;

Varp – оценка несмещенной дисперсии;

Count – число строк в таблице.

Рассмотрим пример расчета средней зарплаты и полного числа сотрудников:

Select Avg(OKLAD) as [Средняя зарплата], Count(*) as ЧС From TSpis;

В результате выполнения этой команды получим следующую таблицу:

Средняя зарплата

ЧС

250000

2

Условия отбора строк

Отбор строк осуществляется оператором Where <предикат>. В предикате могут быть использованы следующие операции:

=

– равно;

<> или !=

– не равно;

>

– больше;

<

– меньше;

>=

– больше или равно;

<=

– меньше или равно;

Between

– между;

In

– вхождение в множество значений;

Like

– похоже на что–то;

Is Null

– значение не задано;

Exit

– значение определено;

Any

– любое значение;

All

– все значения.

В операторе Where можно также использовать следующие логические операции:

And – логическое И;

Or – логическое ИЛИ;

Not – логическое отрицание.

Рассмотрим несколько примеров использования оператора Where:

1.Найдем все строки, содержащие фамилию «Иванов»:

Select * From TSpis Where FIO=”Иванов”;

Значение поля можно заключать в двойные кавычки, а если в значащей строке есть специальные символы, включая пробел, то это значение нужно заключать

вквадратные скобки, например, ”Иванов” или [Иванов].

2.Найдем всех сотрудников, у кого оклад лежит в заданном интервале:

Select * From TSpis Where OKLAD Between ”100000” and ”300000”;

3.Найдем всех сотрудников, у кого фамилии начинаются с букв «Ив»:

150

Select * From TSpis Where FIO Like ”Ив%”;

Следует отметить, что символ % (проценты) означает любую последовательность символов для стандарта ANSI–92, а для стандарта ANSI–89 следует использовать символ * (звездочка). Аналогично символ _ (подчеркивания) означает любой символ в стандарте ANSI–92, а в стандарте ANSI–89 для этих же целей используется символ ? (вопросительный знак).

4.Найти всех сотрудников с фамилиями «Иванов» или «Петров»:

Select * From TSpis Where FIO in [”Иванов”, ”Петров”];

5.Найти всех сотрудников, кому еще не установлен оклад:

Select * From TSpis Where OKLAD is Null;

Упорядочение строк

Упорядочение строк осуществляется в команде Select с помощью ключевого слова Order. Пример упорядочения строк по фамилиям сотрудников:

Select * From TSpis Order by FIO;

Связывание таблиц

Связывание таблиц производится в операторе Where команды Select по совпадению значений каких–либо двух полей в разных таблицах. Пример связывания таблиц TSpis и TDol по коду должности:

Select a.ID as Номер, a.FIO as Фамилия,

b.NAMEDOL as Должность, a.STAG as [Стаж работы], a.OKLAD as Зарплата

From TSpis as a, TDol as b Where a.CODEDOL=b.CODE;

Модификатор Distinct

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

Select Distinct OKLAD as Зарплата From TSpis Order by OKLAD;

Следующий пример показывает, как найти тех сотрудников, у кого совпадают дни рождения:

Select Distinct a.FIO as Фамилия, a.DATEB as [Дата рождения] From TSpis as a, TSpis as b

Where a.DATEB=b.DATEB and a.ID<>b.ID Order by a.DATAB;

В этом примере мы одну и ту же таблицу TSpis обозначили как таблицу «a» и таблицу «b», что позволило найти тех сотрудников, у кого совпадают дни рождения, но разные идентификационные номера «ID». Для исключения дублирования вставлен модификатор Distinct и проведена сортировка результирующей таблицы по дате рождения.

151

Работа с датами

Найдем, например, всех сотрудников, родившихся с 1 апреля 1980 г. по

31 июля 1981 г,:

Select * From TSpis

Where DATEB Between ’01/04/1980’ and ’31/06/1981’;

Эта команда записана в стандарте ANSI–92. Для стандарта ANSI–89 дату нужно заключать не в апострофы, а в символы «#» (решетка).

Текущую дату можно получить, использую функцию Date() без аргументов. Для выделения части даты из поля даты, например DATEB из таблицы TSpis, можно использовать следующие функции:

Year(DATEB)

– год;

Month(DATEB)

– месяц;

DatePart(”q”,DATEB) – квартал; DatePart(”y”,DATEB) – год; DatePart(”m”,DATEB)– месяц; DatePart(”d”,DATEB) – день.

Например, найдем всех сотрудников, родившихся в апреле:

Select FIO as Фамилия, DATEB as [Дата рождения] From TSpis Where DatePart(”m”,DATEB)=”04”;

Команда Transform

Эта команда есть только в MS Access. Она является расширением стандарта SQL и используется для создания перекрестных таблиц. Общий вид ее следующий:

Transform <агрегатная функция> Select <инструкция>

Pivot <заголовки столбцов> [in [<знач1, знач2, ….>]];

Названия строк образуют значения полей в операторе Select, а названия столбцов образуют значения полей указанных в операторе Pivot. Например, чтобы построить таблицу, показывающую распределение числа сотрудников по должностям (по столбцам) и стажу работы (по стокам), можно написать следующую команду:

Transform Count(*)

Select a.STAG as Стаж

From TSpis as a, TDol as b Where a.CODEDOL=b.CODE

Pivot b.NAMEDOL;

Таблица может принять, например, следующий вид:

Стаж

Инженер

Техник

10

4

7

5

5

6

152