Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_№4-5.doc
Скачиваний:
9
Добавлен:
25.03.2016
Размер:
288.26 Кб
Скачать
    1. Математическая обработка бд

В FoxPro имеются средства для получения некоторых простых числовых характеристик данных, а именно количеств, сумм, средних и некоторых других величин. Смотрите команды COUNT..., SUM..., AVERAGE..., CALCULATE...

    1. Вывод текстовых файлов

Команда TYPE... (см. Помощь) выводит текстовый файл на экран, принтер или в другой файл.

  1. Команды языка запросов SQL

В язык FoxPro включен ряд команд из языка запросов SQL (Structured Query Language). Он хорошо известен многим пользователям и является стандартом. Команды SQL могут непосредственно включаться в программы наряду с собственными командами FoxPro.

    1. Создание баз данных

CREATE DBF <имя-BF-файл> (<имя поля> <тип> [(<размер>[,<дробных разрядов>]) [, <имя поля> …]])

Команда создает новую таблицу данных <DBF-файл> с указанным именем. Для каждого поля задаются его имя, тип (одной из букв C, N, D, M, F, L), длина и, при необходимости, число десятичных разрядов. Длина и точность не задаются для типов дата (D), логический (L) и примечаний (M), а точность – для символьного типа (C). Все требования к описанию полей таблицы – стандартные. Созданная таблица сразу открывается.

    1. Дополнение базы

INSERT INTO <файл БД> [(<поле1> [, <поле2> [,…] ] )] VALUES (<выр1> [, <выр2> [,…]])

Команда добавляет записи в конец существующего <файла базы данных>, используя <выражения>, перечисленные после слова VALUES. Если не указаны имена полей, <выражения> будут записываться в последовательные поля <базы данных> в соответствии с её структурой.

    1. Формирование запросов из базы данных (команда select)

Команда SELECT является мощным средством обработки запросов. С её помощью из базы-источника выделяются нужные данные и пересылаются на экран или в файл-приемник. Данные могут быть извлечены из разных таблиц, а также сгруппированы и упорядочены желаемым образом.

Команда имеет массу опций-возможностей. Ввиду этого сначала приведем её предварительный синтаксис, который позволит затем лучше осознать детали.

SELECT <что выводится>

FROM <откуда (источник)> INTO <куда (получатель)>

WHERE <каким условиям должно отвечать>

GROUP BY <колонки, по которым выполняется группирование>

ORDER BY <в каком порядке выводить данные>

Теперь приведем более полный формат этой команды:

SELECT [DISTINCT]

[<псевдоним>.] <выражение> [AS <колонка>]

[, [<псевдоним>.] <выражение> [AS <колонка>] ...]

FROM <таблица> [ <псевдоним>]

[,<таблица> [ <псевдоним>] ...]

[[INTO <получатель>]

| [TO FILE <имя_файла> [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]]

[WHERE <условие связи> [AND <условие связи> ...]

[AND | OR <условие отбора> [AND | OR <условие отбора> ...]]]

[GROUP BY <колонка> [, <колонка> ...]]

[UNION [ALL] SELECTCommand]

[ORDER BY <колонка> [ASC | DESC] [, <колонка> [ASC | DESC] ...]]

Параметры

[ALL | DISTINCT]

[<псевдоним>.] <выражение> [AS <колонка>]

[, [<псевдоним>.] <выражение> [AS <колонка>] ...]

Предложение SELECT задает поля, константы и выражения, которые будут отображены в результатах запроса.

Опция DISTINCT исключает из результатов запроса повторяющиеся строки.

Префикс <псевдоним>. уточняет имена элементов. Каждый элемент <выражение> генерирует один столбец результатов запроса. Если несколько элементов имеют одинаковые имена, укажите перед именем элемента псевдоним таблицы с точкой, чтобы столбцы не повторялись.

<выражение> задает элемент, который следует включить в столбец результатов запроса. Эти выбираемые элементы могут быть следующими:

  • Имя поля из таблицы, указанной в предложении FROM.

  • Константа, которая задает одинаковое постоянное значение во всех строках результатов запроса.

  • Выражение, которое может быть именем пользовательской функции.

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

  • AVG(<выражение>), вычисляющая среднее в столбце числовых данных.

  • COUNT(<выражение>), подсчитывающая число выбираемых элементов в столбце. COUNT(*) подсчитывает число строк в выводе запроса.

  • MIN(<выражение>), определяющая наименьшее значение среди выбираемых элементов <выражение> в столбце.

  • MAX(<выражение>), определяющая наибольшее значение <выражение> в столбце.

  • SUM(<выражение>), вычисляющая итоговую сумму столбца числовых данных.

Функции полей не могут быть вложенными.

AS <колонка>

Задает заголовок столбца в выводе запроса. Это предложение полезно в случае, когда <выражение> является вычисляемым выражением или содержит функцию поля, а вы хотите дать столбцу осмысленное название.

Имя <колонка> может быть выражением, но не может содержать символы, запрещенные в именах табличных полей (например, пробелы).

FROM <таблица> [<псевдоним>] [, [<таблица> [ <псевдоним>] ...] ]

Задает список таблиц, которые содержат данные, извлекаемые по данному запросу. Если ни одна из таблиц не открыта, FoxPro отображает диалоговое окно Open, в котором можно задать местоположение файла. Если вы открыли таблицу, она останется открытой до завершения запроса.

<псевдоним> задает временное имя для таблицы <таблица>. Если этот локальный псевдоним задан, его нужно будет использовать вместо имени таблицы на протяжении всего оператора SELECT.

INTO <получатель>

Указывает, где следует сохранить результаты запроса. Если задать в одном запросе и предложение INTO, и предложение TO, последнее будет проигнорировано. Если предложение INTO опущено, результаты запроса отображаются в окне просмотра. Вы также можете использовать предложение TO, позволяющее направлять результаты запроса на принтер или в файл.

В качестве <получатель> можно использовать одно из следующих предложений:

  • ARRAY ArrayName, сохраняющее результаты запроса в массиве переменных памяти. Если в запросе выбирается 0 записей, этот массив не создается.

  • CURSOR CursorName, сохраняющее результаты запроса в курсоре. После того как SELECT выполнится, временный курсор останется открытым и активным, но будет доступен только для чтения. Когда вы закроете этот временный курсор, он будет удален.

  • DBF TableName | TABLE TableName, сохраняющее результаты запроса в таблице. Если вы не задали расширение имени, FoxPro присвоит таблице расширение .DBF. Таблица останется открытой и активной после того, как SELECT выполнится.

TO FILE <имя_файла> [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN

Используя предложение TO вместо предложения INTO, можно направить результаты запроса в текстовый ASCII-файл <имя_файла>, на принтер или в основное окно FoxPro.

Опция ADDITIVE добавляет вывод запроса к существующему содержимому текстового файла, заданного в предложении TO FILE <имя_файла>.

Опция TO PRINTER направляет вывод запроса на принтер.

Опция TO SCREEN направляет вывод запроса в основное окно FoxPro или в активное пользовательское окно.

Когда вы создаете вывод запроса, имена столбцов формируются в соответствии со следующими правилами:

  • Если выбираемый элемент является полем с уникальным именем, столбец вывода получает имя этого поля.

  • Если несколько выбираемых элементов обладают одним и тем же именем, происходит следующее. Например, если в таблице Customer есть поле STREET и в таблице Employees тоже есть поле с таким именем, то столбцы вывода получают имена Extension_A и Extension_B (STREET_A и STREET_B). Если имя выбираемого элемента состоит из 10 символов, оно укорачивается таким образом, чтобы можно было добавить символ подчеркивания и букву. Например, DEPARTMENT превратится в DEPARTME_A.

  • Если выбираемый элемент является выражением, соответствующий ему столбец вывода получит имя EXP_A. Если существуют другие выражения, им назначаются имена EXP_B, EXP_C и т.д.

  • Если выбираемый элемент содержит функцию поля, такую как COUNT( ), столбец вывода получает имя CNT_A. Если какой-либо выбираемый элемент содержит SUM(), его столбец в выводе получает имя SUM_B.

WHERE <условие связи> [AND <условие связи> ...]

[AND | OR <условие отбора> [AND | OR <условие отбора> ...]]

– указывает, что FoxPro включает в результаты запроса только некоторые записи. Предложение WHERE требуется при извлечении данных из нескольких таблиц.

Условие <условие связи> задает поля, которые связывают таблицы, указанные в предложении FROM. Если в запрос включено более одной таблицы, то для каждой таблицы, кроме первой, необходимо задать условие объединения.

Важное замечание: при создании условия объединения необходимо учитывать, что если вы включили в запрос две таблицы и не задали условие объединения, каждая запись первой таблицы будет объединяться с каждой записью второй таблицы до тех пор, пока соблюдаются условия фильтра. У такого запроса будет слишком много результатов.

Чтобы связать несколько условий объединения, воспользуйтесь оператором AND (И). Каждое условие объединения имеет следующий формат:

FieldName1 Comparison FieldName2

FieldName1 _ это имя поля из одной таблицы, FieldName2 _ имя поля из другой таблицы, а Comparison представляет один из следующих операторов:

Оператор

Тип сравнения

Оператор

Тип сравнения

=

Равно

>

Больше

==

В точности равно

> =

Больше или равно

LIKE

Сравнение по шаблону

<

Меньше

< >, !=, #

Не равно

< =

Меньше или равно

LIKE – позволяет построить условие сравнения по шаблону, где символ “_” указывает единичный неопределенный символ в строке, “%” – любое их количество. Эти символы аналогичны символам маски “?” и “*” в MS DOS. Формат оператора:

<выражение> LIKE <шаблон>

<условие отбора> задает критерий, которому должны удовлетворять записи, чтобы быть включенными в результаты запроса. В запросе можно задать сколько угодно условий фильтра, связывая их операторами AND (И) и OR (ИЛИ). Также можно использовать оператор NOT (НЕ), изменяющий значение логического выражения на противоположное, и функцию EMPTY( ), проверяющую наличие пустых полей. Условие <условие отбора> может иметь один из форматов, показанных в следующих примерах:

Пример 1

FieldName1 Comparison FieldName2

customer.cust_id = orders.cust_id

Пример 2

FieldName Comparison Expression

payments.amount >= 1000

Пример 3

FieldName Comparison ALL (Subquery)

company < ALL (SELECT company FROM customer WHERE country = "UK")

Если условие фильтра включает опцию ALL, это означает, что запись будет включена в результаты запроса только в том случае, когда данное поле удовлетворяет условию при всех значениях, генерируемых подзапросом.

GROUP BY <колонка> [, <колонка> ...]

Группирует строки в запросе исходя из значений в одном или нескольких столбцах. В качестве <колонка> можно задать имя обычного поля таблицы, имя поля, содержащего функцию поля SQL, или числовое выражение, указывающее позицию данного столбца в таблице результатов (самый левый столбец имеет номер 1).

ORDER BY <колонка> [ASC | DESC] [, <колонка> [ASC | DESC] ...]

Сортирует результаты запроса по содержимому одного или нескольких столбцов. Каждый аргумент <колонка> должен соответствовать некоторому столбцу результатов и может представлять собой один из следующих элементов:

  • Поле в таблице, указанной в предложении FROM, которое также является выбираемым элементом в основном предложении SELECT (не в подзапросе).

  • Числовое выражение, указывающее местоположение столбца в таблице результатов. (Самый левый столбец имеет номер 1.)

Опция ASC задает возрастающий порядок сортировки результатов запроса, в соответствии с элементом (или элементами) <колонка>, и используется по умолчанию в предложении ORDER BY.

Опция DESC задает убывающий порядок сортировки результатов запроса.

Если вы не задали порядок результатов запроса с помощью предложения ORDER BY, они останутся неупорядоченными.

Комментарии

SELECT – это команда языка SQL, встроенная в FoxPro и работающая как любая другая команда FoxPro. Когда вы представляете запрос с помощью SELECT, FoxPro интерпретирует этот запрос и извлекает из таблиц указанную информацию. Запрос SELECT можно создать в следующих средах:

  • В окне команд

  • В программе FoxPro (в виде обычной команды FoxPro)

  • В конструкторе запросов

Если вы выдали SET TALK ON и выполнили команду SELECT, FoxPro отображает величину интервала времени, затраченного на выполнение запроса, и количество записей в полученных результатах. Переменная _TALLY содержит число записей в результатах запроса.

Следует отметить, что SELECT не несет ответственности за текущий фильтр, установленный с командой SET FILTER.

Замечание. Подзапрос, о котором идет речь в описании некоторых аргументов, – это команда SELECT внутри другой команды SELECT; она должна быть заключена в скобки. В предложении WHERE можно формировать не более двух подзапросов на одном и том же уровне, то есть не вложенных друг в друга (см. описание предложения WHERE). Подзапросы могут содержать несколько условий объединения.

Примеры запросов

* Пример 1

SELECT company FROM customer

В примере 1 отображаются названия всех компаний из таблицы customer (одно поле из одной таблицы).

* Пример 2

SELECT a.company, b.order_date, b.shipped_on ;

FROM customer a, orders b ;

WHERE a.cust_id = b.cust_id

В примере 2 отображается содержимое трех полей из двух таблиц и эти таблицы объединяются по полю cust_id. Для обеих таблиц используются локальные псевдонимы.

* Пример 3

SELECT DISTINCT a.company, b.order_date, b.shipped_on ;

FROM customer a, orders b ;

WHERE a.cust_id = b.cust_id

В примере 3 отображаются только записи, содержащие уникальные данные в заданных полях.

* Пример 4

SELECT country, postalcode, company ;

FROM customer ;

ORDER BY country, postalcode, company

В примере 4 отображаются поля country, postalcode и company в возрастающем порядке.

* Пример 5

SELECT a.company, b.order_date, b.shipped_on ;

FROM customer a, orders b ;

WHERE a.cust_id = b.cust_id ;

INTO TABLE custship.dbf

BROWSE

В примере 5 содержимое полей из двух таблиц сохраняется в третьей таблице. Далее выполняется просмотр новой таблицы.

* Пример 6

SET DATE TO GERMAN

SELECT a.company, b.order_date, b.shipped_on ;

FROM customer a, orders b ;

WHERE a.cust_id = b.cust_id AND b.order_date < {16.02.95}

В примере 6 отображаются только записи, для которых дата заказа более ранняя, чем 16.02.95.

* Пример 7

SELECT * FROM customer a WHERE a.company LIKE "C%"

В примере 7 отображаются все записи из таблицы customer, в которых название компании начинается с прописной буквы C и имеет неизвестную длину.

* Пример 8

SELECT * FROM customer a WHERE a.country LIKE "U_"

В примере 8 отображаются все записи из таблицы customer, у которых название страны начинается с прописной буквы U и содержит еще только один неизвестный символ.

* Пример 9

SELECT UPPER(city) AS CityList FROM customer

В примере 9 отображаются названия всех городов из таблицы customer прописными буквами и столбцу вывода присваивается имя CityList.

38