Оператор выборки данных SELECT |
Оператор SELECT извлекает строки из одной или нескольких таблиц. Результат запроса представляет собой таблицу, столбцы которой определяются списком из <элемент-выборки>.
<оператор-direct-select> = SELECT [<select-hints>] [ALL | DISTINCT] [TOP <top-count>] <элемент-выборки> {, <элемент-выборки> } [ FROM <таблица-для-выборки> {, <таблица-для-выборки>} ] [ WHERE <search-condition> ] [ GROUP BY { <group-by-expression> [,...] ] [ HAVING <search-condition> ] [ UNION [ALL] ... ] [ ORDER BY { ( <order-by-expression> | <column-position> ) [ ASC | DESC ] } [,...] ]
<select-hints> - оптимизация доступа к данным: перечень индексов для доступа к таблицам. Перечень заключен в фигурные скобки, индексы перечисляются через запятую:
<select-hints> = {<имя-таблицы> (INDEX <имя-индекса>), ... }
ALL - включить в выборку все найденные записи, значение по умолчанию.
DISTINCT - включить в выборку только отличающиеся записи.
TOP - получить <top-count> первых записей выборки. Конструкция доступна начиная с Атлантис 5.4.15.
<top-count> - количество первых записей, возвращаемых запросом. Указанное количество должно быть не меньше 1. Ограничение результата проводится после выполнения order by.
Пример:
sql select top 2 xu$loginname from x$users;
<элемент-выборки> - поля для включения в выборку. Поля в списке разделяются запятой.
<элемент-выборки> = * | <поля-таблицы> | <данные-столбца> [[AS] <имя-столбца> ]
* - включить в выборку все поля.
<поля-таблицы> - включить в выборку все поля указанной таблицы:
<поля-таблицы> = <таблица>.*
<данные-столбца> - включить в выборку указанный столбец: поле таблицы или вычисляемое выражение.
<данные-столбца> = <таблица>.<поле-таблицы> | <вычисляемое-выражение>
<вычисляемое-выражение> - в т.ч. можно использовать арифметические операции, функции (см. "Функции прямого SQL. "), конструкция CASE (см. "Оператор CASE. ").
<таблица> - таблица, логическая таблица, синоним:
<таблица> = <table-name> | <view-name> | <table-alias>
<имя-столбца> - имя столбца в выборке. По умолчанию берется имя соответствующего поля исходной таблицы.
FROM - предложение определяет одну или несколько таблиц, из которых извлекаются данные. Таблицы перечисляются через запятую.
<таблица-для-выборки> - описание исходной таблицы для запроса.
<таблица-для-выборки> = (<table-name> | <view-name> | <подзапрос>) [[AS] <table-alias> ] | <соединение>
<подзапрос> - вложенный запрос.
<соединение> - операция соединения двух таблиц:
<соединение> = <table-source> <join-type> <table-source> on <search-condition>
<table-source> - соединяемые таблицы.
<join-type> - тип соединения:
<join-type> = [ CROSS | INNER | (LEFT | RIGHT | FULL) [OUTER] ] JOIN
Некоторые запросы через синтаксис JOIN на Oracle работают некорректно. Для обхода этой проблемы есть параметр ANSIJoin, который по умолчанию равен false. При выключенном параметре запросы генерируются не через JOIN, а через = с использованием (+). Однако в этом синтаксисе Oracle не поддерживает FULL OUTER JOIN, т.е. нельзя поставить (+) с обоих сторон от =. Для таких запросов предлагается временно включать параметр ANSIJoin в true, а затем выключать его обратно (на всякий случай).
WHERE - предложение определяет критерии, которым должны удовлетворять строки, чтобы их можно было использовать для получения результата.
<search-condition> - выражение, определяющее условия включения записи в результирующую выборку. Состоит из предикатов, соединенных булевыми операторами AND и OR:
<search-condition> = [not] <predicate> {(and | or) [not] <predicate>}
<predicate> - выражение, принимающее одно из трех значений: TRUE, FALSE или UNKNOWN.
<predicate> = <expression> <comparison> <expression> | <string-expression> [NOT] LIKE <string-expression> | <expression> [NOT] BETWEEN <expression> AND <expression> | <expression> IS [NOT] NULL | <expression> [NOT] IN ( <subquery> | {<expression>}[,...] ) | <expression> <comparison> {ALL | SOME | ANY} ( <subquery> ) | EXISTS ( <subquery> ) | #NULL(<имя-индекса>)
<expression>, <string-expression> - операнд предиката.
Сравнение символьных полей выполняется без учета регистра символов. Для сравнения с учетом регистра используется конструкция #noupcase. При этом в конструкцию #noupcase включаются как правое так и левое выражение операции сравнения:
#noupcase(xf$name) = #noupcase('aaa')
Если необходимо, чтобы SQL-сервер использовал индекс с обрезанным сегментом, необходимо явно написать #SUBSTRING(f, offset, length), где f - поле таблицы. Вообще-то, в дальнейшем желательно отказываться от вырезанных ключей, особенно тех, которые обрезают длину поля индекса для "оптимизации".
<comparison> - операция сравнения:
#NULL(<имя-индекса>) - использовать нулевой индекс <имя-индекса> при обработке предложения WHERE. Указывать not перед #NULL нельзя.
<comparison> = = | <> | != | > | >= | !> | < | <= | !<
GROUP BY - предложение группирует выходные данные по одинаковым значениям указанных столбцов. При использовании GROUP BY в предложении SELECT могут быть указаны только те столбцы, которые поименованы в предложении GROUP BY, и любые агрегатные функции.
HAVING - предложение определяет критерии, которым должны удовлетворять группы строк, формируемые предложением GROUP BY, чтобы их можно было поместить в выходные данные с помощью запроса.
UNION - объединяет выходные данные нескольких запросов.
ORDER BY - позволяет расположить результаты одного или нескольких запросов в определенном порядке.
Атлантис 5.4.15. Добавлена конструкция TOP <top-count>.
Атлантис 5.3.15. Для оптимизации доступа к данным можно указать перечень индексов для доступа к таблицам.