Теперь вернемся к синтаксису оператора SELECT. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Теперь вернемся к синтаксису оператора SELECT.



§ СписокКолонок задается списком простых или групповых выражений, разделенных запятой. При наличии в этом списке хотя бы одного группового выражения, если фраза GROUP BY отсутствует в SELECT-операторе, то имеется в виду полная группировка – результат однострочная таблица (или пустая).

Если надо включить все колонки FROM-таблиц, то качестве элемента СпискаКолонок можно использовать [ ПсевдонимТаблицы. ]*

Имена колонок результирующей таблицы:

§ совпадает с именем поля, если оно и использовано в качестве простого выражения в СпискеКолонок,

§ генерируется системой,

§ либо может быть объявлено явно: приписать после выражения СпискаКолонок – AS Имя

§ КлючГруппировки задается списком (через запятую) возможно уточненных имен полей FROM-таблиц.

§ КлючУпорядочения задается списком (через запятую) имен полей результирующей таблицы или порядковыми номерами этих полей в СпискеКолонок. Для любой колонки можно указать невозрастающий порядок: приписать после элемента КлючаУпорядочения – 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 исключает повторы, появляющиеся от декартова произведения.

§ Договора, по которым нет поставок.

SELECT Dog.* FROM Dog

WHERE NOT EXISTS (

SELECT Pst.* FROM Pst

WHERE (Dog.KPst=Pst.KPst)AND(Dog.KDet=Pst.KDet))

§ Перевыполнения по договорам.

SELECT Dog.KPst,Dog.KDet, SUM(Pst.Kol)-MAX(Dog.Kol)

FROM Dog,Pst

WHERE (Dog.KPst=Pst.KPst)AND(Dog.KDet=Pst.KDet)

GROUP BY Dog.KPst,Dog.KDet

HAVING SUM(Pst.Kol)>Dog.Kol

Замечание: опять пришлось использовать MAX по техническим причинам.

¨ INSERT (вставка).

¨ DELETE (удаление).

¨ UPDATE (обновление).


3.2. Record- ориентированные средства обработки БД. Средства обработки баз данных в Delphi.

Delphi - инструментальная среда разработки Object Pascal - программ. Delphi предоставляет программистам-разработчикам:

§ набор объектно-ориентированных библиотек, поэтому программирование в 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...}



Поделиться:


Последнее изменение этой страницы: 2016-06-23; просмотров: 120; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.8.247 (0.013 с.)