- •«Национальный исследовательский томский политехнический университет»
- •Работа с данными в среде FoxPro
- •Создание программных продуктов
- •Главное меню субд
- •Меню FoxPro для dos
- •Главное окно и меню FoxPro дляWindows.
- •Знаки операций
- •Структура команд
- •Создание структуры файла
- •Заполнение базы данных
- •Дополнение бд
- •Фильтрация данных
- •Последовательный поиск
- •Продолжение поиска
- •Понятие о рабочих областях
- •Связь вида одна_запись_к_одной
- •Связь вида одна_запись_ко_многим
- •Цикл с условием
- •Цикл с параметром
- •Цикл сканирования базы данных
- •Математические функции
- •Математическая обработка бд
- •Вывод текстовых файлов
- •Создание баз данных
- •Дополнение базы
- •Формирование запросов из базы данных (команда select)
Математическая обработка бд
В FoxPro имеются средства для получения некоторых простых числовых характеристик данных, а именно количеств, сумм, средних и некоторых других величин. Смотрите команды COUNT..., SUM..., AVERAGE..., CALCULATE...
Вывод текстовых файлов
Команда TYPE... (см. Помощь) выводит текстовый файл на экран, принтер или в другой файл.
Команды языка запросов SQL
В язык FoxPro включен ряд команд из языка запросов SQL (Structured Query Language). Он хорошо известен многим пользователям и является стандартом. Команды SQL могут непосредственно включаться в программы наряду с собственными командами FoxPro.
Создание баз данных
CREATE DBF <имя-BF-файл> (<имя поля> <тип> [(<размер>[,<дробных разрядов>]) [, <имя поля> …]])
Команда создает новую таблицу данных <DBF-файл> с указанным именем. Для каждого поля задаются его имя, тип (одной из букв C, N, D, M, F, L), длина и, при необходимости, число десятичных разрядов. Длина и точность не задаются для типов дата (D), логический (L) и примечаний (M), а точность – для символьного типа (C). Все требования к описанию полей таблицы – стандартные. Созданная таблица сразу открывается.
Дополнение базы
INSERT INTO <файл БД> [(<поле1> [, <поле2> [,…] ] )] VALUES (<выр1> [, <выр2> [,…]])
Команда добавляет записи в конец существующего <файла базы данных>, используя <выражения>, перечисленные после слова VALUES. Если не указаны имена полей, <выражения> будут записываться в последовательные поля <базы данных> в соответствии с её структурой.
Формирование запросов из базы данных (команда 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.