Секция SQL-оператора SELECT содержит список полей, констант, выражений, которые определяют столбцы в результирующем наборе Запроса.

Общая синтаксическая конструкция представлена в разделе описания команды SELECT - SQL .

Детальный синтаксис секции SELECT имеет следующий вид:

SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] Select_List_Item [AS Column_Name] [, ...]

Параметры

[ALL | DISTINCT]

Определяет выборку в результирующий набор Запроса Всех (ALL) записей (по-умолчанию); или исключая дублируюемые записи данных (DISTINCT). Опция DISTINCT может быть использована только с первой секцией SELECT.

NoteОбратите внимание

Система Visual FoxPro не поддерживает использование опции DISTINCT в операторах выборки SQL SELECT, которые содержат поля данных типа: Memo, General, или Blob. Однако, для использования полей типа Memo в таких запросах, вы можете "укоротить" поля типа Memo с помощью функций PADR( ) или ALLTRIM( ).  Смотрите дополнительные разделы  PADL( ) | PADR( ) | PADC( ), функции  и  ALLTRIM( ), функция.

[TOP nExpr [PERCENT]]

Определяет, что в результитрующий набор Запроса будут выбраны первые nExpr записей или заданный процент от общего количества записей выборки. Диапазон допустимых значений для выражения nExpr : от 1 - до 32,767, или,  если задана опция PERCENT, вы можете задать значения процентов: от 0.01 - до 99.99. Visual FoxPro сортирует результирующий набор Запроса, а за тем возвращает соответствующее количество записей, как указано в TOP nExpr [PERCENT].

NoteПримечание

Для использования опции ограниченной выборки TOP, вы болжны обязательно определить секцию ORDER BY, для сортировки. В секции ORDER BY определяется имя / номер столбца, относительно которого выполняется выборка первых записей Запроса, количество которых задается в опции TOP.

NoteОбратите Внимание

Установка системной команды SET ENGINEBEHAVIOR определяет механизм работы рассматриваемой Опции TOP, и влияет на результирующий набор Запроса. Смотрите дополнительно раздел: SET ENGINEBEHAVIOR, команда.

При указании опции PERCENT количество записей в результирующем наборе округляется до большего целого числа.

NoteПримечание

Записи результирующего набора, имеющие одинаковые значения столбца/поля, который определяется в секции сортировки ORDER BY, включаются в результирующий набор. Следовательно, в результирующем наборе может быть больше записей, чем задается в выражении nExpr. Например, если задается nExpr = 10, результирующий набор может содержать более 10 записей; только 10 будут иметь уникальные значения столбца сортировки ORDER BY, дубликаты также включаются в результирующий набор.

Select_List_Item

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

  • Это некоторая константа, включаемая в каждую запись результата Запроса.

  • Это некоторое вычисляемое выражение, содержащее пользовательскую функцию или Подзапрос.

  • [Alias.]Select_Item 

    Alias определяет внутренний алиас исходной таблицы, если выполняется выборка нескольких полей, имеющих одинаковые имена, для однозначной идентификации их в списке Select_Item. Использование алиасов таблиц предохраняет от дублирования столбцов. Пробелы между конструкциями [Alias.] и Select_Item допустимы.

    Select_Item может быть также полем из таблицы, указанной в секции FROM.

  • (Subquery)

    Subquery определяет некоторый подзапрос SQL SELECT, который представляет собой другой оператор SQL SELECT, его нужно заключать в круглые скобки (()).

    Нет ограничений по количеству подзапросов, используемых в главном операторе SQL SELECT. Нет также ограничений по количеству вложенных подзапросов, используемых в операторе SQL SELECT.

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

    Подзапросы могут содержать: опцию ограниченной выборки TOP nExpr, для некоррелированных запросов; множественные условия Соединения таблиц; а также секции группировки данных GROUP BY. Если подзапрос не выгружает записи в результирующий набор подзапроса, то возвращается значение = NULL.

    NoteОбратите внимание

    Если вы используете опцию ограниченной выборки TOP nExpr в Подзапросе, вы должны также указать соответствующую секцию сортировки данного подзапроса ORDER BY.

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

  CopyCode imageКопировать Код
AggregateFunction([Alias.]Select_Item)

Дополнительная информация по использованию агрегатных, функций пользователя, общих правил формирования имен полей результата Запроса смотрите в разделе Общие рекомендации по использованию операторов SQL SELECT.

[AS Column_Name]

Определяет имя поля / столбца в наборе результата Запроса. Column_Name может быть некоторым вычисляемым выражением, но не может содержать недопустимые в данном случае символы; например, как пробел недопустим в именах полей таблиц.

NoteСовет

Когда в рассматриваемом списке Select_List_Item используются выражения или различные функции, то для определения значения Column_Name рекомендуется использовать осмысленное наименование, соответствующее назначению данного столбца.

Expand imageКомментарии

В следующем программном коде показаны ключевые секции команды SELECT - SQL:

  CopyCode imageКопировать Код
SELECT Select_List
FROM Table_List
...[WITH (BUFFERING = lExpr)]
[WHERE Conditions]
[GROUP BY Column_List]
[HAVING Conditions]
[UNION Clause]
[ORDER BY Column_List]
[INTO Clause | TO Clause ]
[Additional_Display_Options]

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

Expand imageПримеры

Пример 1

В представленном примере выполняется выборка уникальных значений с использованием опции DISTINCT; соединяются две таблицы с помощью параметров секции WHERE. В запросе выбираются поля: Company, Order_Date, и Shipped_On, имеющие уникальные совокупные значения в таблицах-источниках: Customer и Orders. В операторе SELECT определены внутренние (локальные ) алиасы таблиц - для однозначного указания связующего поля Cust_ID, которое присутствует в обоих таблицах.

  CopyCode imageКопировать Код
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
SELECT DISTINCT TAlias1.company, TAlias2.order_date, ;
TAlias2.shipped_on ;
FROM customer TAlias1, orders TAlias2 ;
WHERE TAlias1.cust_id = TAlias2.cust_id

Пример 2

В следующем примере выполняется выборка всех записей из исходной таблицы; для определения нового имени выбираемого поля используется опция AS Column_Name. В результирующий набор выбирается поле City, из таблицы Customer, значение которого преобразуется в верхний регистр, с помощью функции UPPER( ); выбираемому столбцу присваивается имя: CityList.

  CopyCode imageКопировать Код
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'Data\TestData')
SELECT UPPER(city) AS CityList FROM customer

Expand imageСм. также