Новости



Visual FoxPro 9 позволяет создавать ещё более производительные приложения баз данных.
Двадцатиление FoxPro! Microsoft принимает поздравления.
Visual FoxPro Toolkit for .NET - более 225 функций VFP 7.0, для языков .NET (подробнее)

Команда SELECT - SQL

См. также Пример

Извлекает данные из одной или нескольких таблиц.

Синтаксис

SELECT [ALL | DISTINCT]
[Alias.] Select_Item [AS Column_Name]
[, [Alias.] Select_Item [AS Column_Name] ...]
FROM [DatabaseName!]Table [Local_Alias]
[, [DatabaseName!]Table [Local_Alias] ...]
[[INTO Destination]
| [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]]
[PREFERENCE PreferenceName]
[NOCONSOLE]
[PLAIN]
[NOWAIT]
[WHERE JoinCondition [AND JoinCondition ...]
[AND | OR FilterCondition [AND | OR FilterCondition ...]]]
[GROUP BY GroupColumn [, GroupColumn ...]]
[HAVING FilterCondition]
[UNION [ALL] SELECTCommand]
[ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]

Параметры

[ALL | DISTINCT]

[Alias.] Select_Item [AS Column_Name]
[, [Alias.] Select_Item [AS Column_Name] ...]

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

Опция ALL по умолчанию отображает в результатах запроса все строки.

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

Замечание Опцию DISTINCT можно использовать в предложении SELECT только один раз.

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

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

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

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

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

Пользовательские функции в предложении SELECT

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

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

fox90000.gif В пользовательских функциях, выдаваемых в предложении SELECT, ничего неизвест о о структуре ввода-вывода или табличной среде Visual FoxPro. В общем случае вы не знаете ни номера выбранной рабочей области, ни имени текущей таблицы, ни аже имен обрабатываемых полей. Значения этих переменных зависят от того, в какой именно момент в процессе оптимизации инициирована пользовательская функция.

fox90000.gif Довольно рискованно изменять среду ввода-вывода или таблиц Visual FoxPro в по ьзовательских функциях, инициируемых в предложении SELECT. В общем случае резу ьтаты будут непредсказуемыми.

fox90000.gif Единственный надежный метод передачи значений пользовательским функциям, и ициируемым в предложении SELECT, fox90001.gif передача по списку аргументов в момент инициирования функции.

fox90000.gif Если вы в процессе экспериментирования натолкнулись на некий прием (предпо ожительно, запрещенный), который правильно срабатывает в определенной версии FoxPro, то нет никаких гарантий, что он будет работать и в последующих версиях.

Не считая этих ограничений, пользовательские функции вполне допустимы в пред ожении SELECT. Однако не забывайте, что применение SELECT может снизить произво ительность.

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

fox90000.gif AVG(Select_Item), вычисляющая среднее в столбце числовых данных.

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

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

fox90000.gif MAX(Select_Item), определяющее наибольшее значение Select_Item в столбце.

fox90000.gif SUM(Select_Item), вычисляющая итоговую сумму столбца числовых данных.

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

AS Column_Name

Задает заголовок столбца в выводе запроса. Это предложение полезно в случае, когда Select_Item является выражением или содержит функцию поля, а вы хотите дать столбцу осмыс енное название. Имя Column_Name может быть выражением, но не может содержать символы, запрещенные в именах та личных полей (например пробелы).

FROM [DatabaseName!]Table [Local_Alias]
[, [DatabaseName!]Table [Local_Alias] ...]

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

DatabaseName! задает имя базы данных, которая содержит данную таблицу и отлична от текущей. Имя базы данных следует задавать только в том случае, если она не является текущей. Между именем базы данных и именем таблицы поставьте символ-разделитель fox90001.gif восклицательный знак (!).

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

INTO Destination

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

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

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

fox90000.gif CURSOR CursorName, сохраняющее результаты запроса в курсоре. Если вы задали имя открытой таблиц и установили значение SET SAFETY равным OFF, Visual FoxPro сгенерирует сообще ие об ошибке. После того как SELECT выполнится, временный курсор останется отк ытым и активным, но будет доступен только для чтения. Когда вы закроете этот в еменный курсор, он будет удален. Курсоры могут создаваться в виде временных файлов на диске, заданном SORTWORK.

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

TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN

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

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

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

В Visual FoxPro, FoxPro для Windows и FoxPro для Macintosh можно включить нео язательное предложение PROMPT, по которому перед началом печати появится диа оговое окно. В этом диалоговом окне можно изменить установки принтера. Состав па аметров, допускающих регулирование, зависит от установленного в данный момент д айвера принтера. Ключевое слово PROMPT нужно ставить сразу после TO PRINTER. В FoxPro для MS-DOS предложение PROMPT игнорируется.

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

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

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

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

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

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

PREFERENCE PreferenceName

Если результаты запроса направляются в окно просмотра, предложение PREFERENCE позволяет сохранить атрибуты и опции окна просмотра для использования впосле ствии. Это предложение сохраняет атрибуты (настройки) в файле ресурсов FOXUSER на неопределенный период времени. Настройки можно извлечь в любой момент.

Когда SELECT впервые выдается с предложением PREFERENCE PreferenceName, создается набор настроек. Если затем вновь выдать SELECT с этим именем набо а настроек, окно просмотра будет восстановлено в том же виде. При закрытии окна просмотра набор настроек обновляется.

Если выйти из окна просмотра, нажав клавиши Ctrl+Q, изменения, внесенные в окно просмотра, не сохранятся в файле ресурсов.

NOCONSOLE

Запрещает отображение результатов запроса, направленных в файл, на принтер или в основное окно Visual FoxPro.

PLAIN

Запрещает отображение заголовков столбцов в выводе запроса. Предложение PLAIN можно использовать независимо от того, задано предложение TO или нет. Если вк ючить предложение INTO, предложение PLAIN игнорируется.

NOWAIT

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

Если вы включили предложение TO SCREEN, чтобы направить вывод в основное окно Visual FoxPro или в пользовательское окно, то когда это окно заполнится резу ьтатами запроса, вывод приостановится. Чтобы посмотреть следующую группу резу ьтатов запроса, нажмите любую клавишу. Если задано NOWAIT, результаты запроса бу ут прокручиваться в основном окне Visual FoxPro или в пользовательском окне неп ерывно, без пауз. Предложение NOWAIT игнорируется, если оно включено вместе с п едложением INTO.

WHERE JoinCondition [AND JoinCondition ...]
[AND | OR FilterCondition [AND | OR FilterCondition ...]]

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

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

Важное замечание При создании условия объединения необходимо учитывать следующие обстояте ьства:

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

fox90000.gif С осторожностью пользуйтесь в условиях объединения такими функциями, как DELETED( ), EOF( ), FOUND( ), RECCOUNT( ) и RECNO( ), поддерживающими необязательный аргумент в виде псевдонима или номера рабочей области. Если в подобной функции задать псевдоним или рабочую область, могут получиться непредсказуемые резу ьтаты. Предложение SELECT не будет использовать ваши рабочие области; оно выпол ит операцию, эквивалентную команде USE ... AGAIN. Запросы с одной таблицей, в которых эти функции используются без псевдонима и номера рабочей области, возв ащают правильные результаты. Однако если эти функции используются в запросах с есколькими таблицами (даже если в них не задавать псевдоним или рабочую об асть), результаты могут оказаться самыми неожиданными.

fox90000.gif Будьте внимательны, объединяя таблицы с пустыми полями, поскольку в Visual FoxPro такие поля соответствуют друг другу. Например, если вы объединяете таблицы по полям CUSTOMER.ZIP и INVOICE.ZIP, причем таблица CUSTOMER содержит 100 пуст х почтовых кодов, а таблица INVOICE fox90001.gif 400 пустых почтовых кодов, в выводе запроса будет содержаться 40000 лишних записей, сгенерированных из этих пустых полей. Чтобы исключить пустые записи из в вода запроса, используйте функцию EMPTY( ).

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

FieldName1 Comparison FieldName2

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

Оператор
Тип сравнения
=
Равно
==
В точности равно
LIKE
SQL LIKE (похоже)
< >, !=, #
Не равно
>
Больше
> =
Больше или равно
<
Меньше
< =
Меньше или равно

Когда оператор = используется по отношению к символьным строкам, он действует по-разному в зависимости от установки SET ANSI. Когда значение SET ANSI равно OFF, Visual FoxPro выполняет сравнение строк методом, знакомым пользователям Xbase. Когда значение SET ANSI равно ON, Visual FoxPro при сравнении строк соблю ает стандарты ANSI. Подробнее о том, как Visual FoxPro выполняет сравнение ст ок, см. SET ANSI и SET EXACT.

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

Пример 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, это означает, что запись будет включе а в результаты запроса только в том случае, когда данное поле удовлетворяет ус овию при всех значениях, генерируемых подзапросом.

Пример 4

FieldName Comparison ANY | SOME (Subquery)

company < ANY ;

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

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

Пример 5

FieldName [NOT] BETWEEN Start_Range AND End_Range

customer.postalcode BETWEEN 90000 AND 99999

В данном примере проверяется, попадают ли значения поля в указанный диапазон.

Пример 6

[NOT] EXISTS (Subquery)

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

В данном примере проверяется, существует ли хотя бы одна строка в подзапросе, удовлетворяющая критерию. Когда условие фильтра включает опцию EXISTS, его з ачением будет "истина" (.T.), если только подзапрос не образует пустое множество.

Пример 7

FieldName [NOT] IN Value_Set

customer.postalcode NOT IN ("98052","98072","98034")

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

Пример 8

FieldName [NOT] IN (Subquery)

customer.cust_id IN ;

(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")

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

Пример 9

FieldName [NOT] LIKE cExpression

customer.country NOT LIKE "UK"

Данное условие фильтра ищет все поля, совпадающие с выражением cExpression. В состав cExpression можно включать символы подстановки fox90001.gif знак процента (%) и символ подчеркивания ( _ ). Символ подчеркивания обоз ачает один произвольный символ строки.

GROUP BY GroupColumn [, GroupColumn ...]

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

HAVING FilterCondition

Задает условие фильтра, которому должны удовлетворять группы, чтобы быть вк юченными в результаты запроса. Предложение HAVING следует использовать вместе с GROUP BY. Оно может включать сколько угодно условий фильтра, связанных операто ами AND (И) и OR (ИЛИ). Также можно использовать оператор NOT (НЕ), изменяющий з ачение логического выражения на противоположное.

Условие FilterCondition не может содержать подзапрос.

Предложение HAVING без предложения GROUP BY действует, как предложение WHERE. В предложении HAVING можно использовать локальные псевдонимы и функции полей. Если в предложении HAVING нет функций полей, используйте вместо него предложение WHERE fox90001.gif оно работает быстрее.

[UNION [ALL] SELECTCommand]

Комбинирует окончательные результаты одного запроса SELECT с окончательными езультатами другого запроса SELECT. По умолчанию предложение UNION проверяет скомбинированные результаты и удаляет повторяющиеся строки. Чтобы скомбинировать есколько предложений UNION, используйте скобки.

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

Предложения UNION подчиняются следующим правилам:

fox90000.gif С помощью UNION нельзя комбинировать подзапросы.

fox90000.gif У обеих команд SELECT в выводе запросов должно быть одинаковое число столбцов.

fox90000.gif Каждый столбец результатов запроса одной команды SELECT должен иметь тот же тип данных и ту же ширину, что и соответствующий столбец другого запроса SELECT.

fox90000.gif Только в окончательном варианте SELECT может присутствовать предложение ORDER BY, которое должно ссылаться на столбцы вывода по номерам. Если предложение ORDER BY включено, оно влияет на весь результат.

Предложение UNION также можно использовать для моделирования внешнего объедине ия (outer join).

Когда вы объединяете две таблицы в одном запросе, в вывод включаются только записи с совпадающими значениями в объединяемых полях. Если у некоторой записи ро ительской таблицы нет соответствующей ей записи в дочерней таблице, эта родите ьская запись не включается в вывод. Внешнее объединение позволяет включить в в вод все записи родительской таблицы вместе с совпадающими записями из дочерней таблицы. Чтобы создать внешнее объединение в Visual FoxPro, нужно использовать вложенную команду SELECT, как это сделано в следующем примере:

SELECT customer.company, orders.order_id, orders.emp_id ;

FROM customer, orders ;

WHERE customer.cust_id = orders.cust_id ;

UNION ;

SELECT customer.company, 0, 0 ;

FROM customer ;

WHERE customer.cust_id NOT IN ;

(SELECT orders.cust_id FROM orders)

Замечание Обязательно ставьте пробел непосредственно перед точкой с запятой. В против ом случае возникнет ошибка.

Первая часть данной команды, которая предшествует предложению UNION, выбирает те записи из обеих таблиц, которые содержат совпадающие значения. Компании (таб ица customer), не имеющие соответствующих заказов (таблица orders), не учитываются. В той части, которая следует за предложением UNION, выби аются записи в таблице customer, у которых нет совпадающих записей в таблице orders.

Что касается второй части команды, обратите внимание на следующее:

fox90000.gif Оператор SELECT, стоящий в скобках, обрабатывается первым. В результате его в полнения выбираются все номера клиентов в таблице orders.

fox90000.gif Предложение WHERE ищет все номера клиентов в таблице customer, которых нет в таблице orders. Поскольку в первом разделе команды были выбраны все компании, для которых указан номер клиента в таблице orders, то теперь в результаты запроса будут включены все компании из таблицы customer.

fox90000.gif Поскольку структуры таблиц, включенных в предложение UNION, должны быть иде тичны, во втором операторе SELECT предусмотрены два заполнителя, соответствующие полям orders.order_id и orders.emp_id из первого оператора SELECT.

Замечание Заполнители должны быть того же типа, что и представляемые ими поля. Полю типа даты должна соответствовать заполнитель { / / }, а символьному полю fox90001.gif пустая строка ("").

ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]

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

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

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

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

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

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

Комментарии

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

fox90000.gif В окне команд

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

fox90000.gif В конструкторе запросов

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

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

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



Новое на сайте

  • Обновлен портфель программиста

    Добавлены: Установка HTML Help (Создание справочной системы), Imagedit.zip - Графический редактор ( ico и bmp), Библиотека локализации HTML Help (Русский)
  • Новые примеры программ

    Установка библиотек, Игровая программа "Охота на лис", Установка библиотек "Охота на лис", plastic -"Платежки", Библиотеки (на FPD26), platan -"Платежки" (на Clipper 5.2)
  • Обновленна справка

    Подсказки, технология программирования и использование Visual FoxPro. Команды, функции, операторы, объекты, свойства, события и методы.