§ СписокКолонок задается списком простых или групповых выражений, разделенных запятой. При наличии в этом списке хотя бы одного группового выражения, если фраза GROUP BY отсутствует в SELECT-операторе, то имеется в виду полная группировка – результат однострочная таблица (или пустая).
Если надо включить все колонки FROM-таблиц, то качестве элемента СпискаКолонок можно использовать [ПсевдонимТаблицы.]*
Имена колонок результирующей таблицы:
§ совпадает с именем поля, если оно и использовано в качестве простого выражения в СпискеКолонок,
§ генерируется системой,
§ либо может быть объявлено явно: приписать после выражения СпискаКолонок – AS Имя
§ КлючУпорядочения задается списком (через запятую) имен полей результирующей таблицы или порядковыми номерами этих полей в СпискеКолонок. Для любой колонки можно указать невозрастающий порядок: приписать после элемента КлючаУпорядочения – DESC (по умолчанию имеется в виду неубывающий).
§ WHERE-УсловиеОтбора не может содержать групповых выражений (что вполне естественно, т.к. оно проверяется до группировки).
§ HAVING-УсловиеОтбораПослеГруппировки может быть любым выражением вида «условие».
ПРИМЕРЫ.
§ Решение задачи «о крупных поставках».
SELECT Psts.ImPst, Pst.Kol FROM Pst, Psts
WHERE (Psts.KPst=Pst.KPst) AND
(Pst.KDet=1010) AND (Pst.Kol>1000)
§ Для каждой детали - количество разных поставщиков уже поставивших эту деталь.
SELECT KDet,COUNT(DISTINCT KPst) AS KolPst
FROM Pst GROUP BY KDet
§ Для каждой детали - количество партий этой детали уже полученных от всех поставщиков.
SELECT MAX(Det.ImDet), Det.KDet, COUNT(*) AS KolP
FROM Det,Pst WHERE Det.KDet=Pst.KDet
GROUP BY Det.KDet ORDER BY 1
Замечание: MAX пришлось использовать по техническим причинам – InterBase «не любит неключевые поля там».
§ Договора, по которым есть поставки.
SELECT DISTINCT Dog.* FROM Dog,Pst
WHERE (Dog.KPst=Pst.KPst)AND(Dog.KDet=Pst.KDet)
Замечание: Задачу решает декартово произведение с выборкой (естественное соединение), DISTINCT исключает повторы, появляющиеся от декартова произведения.
§ набор объектно-ориентированных библиотек, поэтому программирование в Delphi это, во многом существенном, сборка программ из готовых компонентов;
§ визуальные средства сборки программ.
VCL (Visual Component Library) – основной комплекс объектно-ориентированных библиотек Delphi. Предназначенные для работы с базами данных Delphi-средства во многом основаны на представлении данных, принятом в процессоре баз данных BDE(*).
Класс TDatabase. Объект этого типа обеспечивает соединение с (одной) базой данных.
§ property AliasName: String;
Задает внешний псевдоним, под которым база данных зарегистрирована в администраторе BDE. Использование псевдонимов позволяет обеспечить независимость Delphi-приложения от физического места хранения БД.
§ property DatabaseName: string;
Задает внутренний псевдоним, под которым БД будет известна только Delphi-приложению в периоде его выполнения. См. свойство Params.
§ property Params: TStrings;
Развитые СУДБ имеют средства контроля прав доступа к БД (DCL), SQL-сервер InterBase при соединении с БД запрашивает «Имя пользователя» и «Пароль». Свойство Params позволяет «привязать» эту информацию к внутреннему псевдониму БД. Если Delphi-приложение ссылается на БД по внутреннему псевдониму, то запрос прав доступа можно «скрыть».
§ property LoginPrompt: Boolean;
Если LoginPrompt= TRUE, то SQL-серверзапрашивает (повторное) подтверждение прав доступа.
§ property Connected: Boolean;
Это свойство позволяет включить-отключить-проверить соединение с БД.
Класс TTable. Объект этого типа обеспечиваетсвязь и выполнение операций с таблицей. Важнейшие свойства, методы и события этого класса унаследованы им от своего предка - класса TDataSet («абстрактная таблица»).
¨ Параметры связи с таблицей.
§ property DatabaseName: String;
Указывает (внутренний) псевдоним базы данных.
§ property TableName: TFileName;
Указывает имя таблицы в этой базе данных.
¨ Средства работы с таблицей на уровне записей (строк).
Как отмечалось выше - BDE является ядром СУБД, поэтому предоставляет типовой набор средств обработки таблиц в клиентском приложении (т.е. не SQL-сервером, а «на стороне клиента», на рабочей станции).
Эти средства обеспечивают построчный доступ к данным таблицы, и в этом они аналогичны стандартным средствам языка Паскаль.
§ property Active: Boolean;
procedure Open; procedure Close;
Свойство Active позволяет открыть и закрыть таблицу или проверить, открыта ли она. Открыть и закрыть можно также с помощью методов Open и Close.
§ procedure First; procedure Last;
procedure Next; procedure Prior;
Эти методы позволяют перемещать маркер текущей строки – на первую, последнюю, следующую и предшествующую строки.
§ property Eof: Boolean; property Bof: Boolean;
Eof – известная по языку Паскаль функция, Bof – аналогичная: принимает значение TRUE, когда маркер текущей строки перемещен в другой конец за пределы таблицы.
§ property RecNo: Integer; {номер текущей строки}
property RecordCount: Longint; {количество строк}
§ procedure Append; {добавить пустую строку в конец}
procedure Delete; {удалить текущую строку}
§ Доступ к полям текущей строки таблицы.
function FieldByName(const FieldName:string):TField;
Этот метод по имени поля «FieldName» возвращает значение класса TField, который мы рассмотрим далее.
Отметим важное обстоятельство: в приложении может быть несколько одновременно активных объектов типа TTable, связанных с одной и той же таблицей БД. Возникает впечатление, что «объект работает с собственной копией таблицы», однако это не совсем так. Каждый объект имеет действительно «собственный» маркер текущей строки, который только он может перемещать по строкам таблицы, реальная таблица у таких объектов общая, поэтому операции вставки-удаления-изменения, выполненные одним объектом, «видны» всем другим.
¨ Средства локального управления доступом к данным.
§ procedure Post; override;
procedure Cancel;
Изменения, проведенные в текущей строке таблицы, фактически хранятся в буфере. Только после подтверждения (Post) строка в таблице реально обновляется (для чего, в случае SQL-серверной базы данных, Post пошлет соответствующий запрос). Cancel позволяет «откатить» изменения в текущей строке (еще до запроса к SQL-серверу). Post (а в некоторых ситуациях, наоборот - Cancel) неявно отрабатывает в каждом действии, «покидающем» измененную текущую строку (потому что «заложен» в реализующей процедуре) (*).
§ procedure Refresh;
Конкретный объект TTable может «не заметить» изменений в таблице, проведенных «помимо него окольным путем». Метод Refresh позволяет «освежить» его сведения о реальном хранилище данных.
Класс TField. Объекты этого типа обеспечивают работу с полями «абстрактной таблицы» TDataSet. Поля не создаются отдельно, они входят в состав TDataSet (TTable или TQuery)(**). В программе доступ к полям «абстрактной таблицы» можно получить, используя метод FieldByName класса TDataSet.
Свойства класса TField для присваивания-извлечения значения поля и приведения его к подходящему типу:
property Value:Variant; property AsString:string; {и другие As...}