select-запрос выборки
Функция
Определение select-запроса выборки данных.
Спецификация
::=
::=
::=
::=
::=
Синтаксические правила
-
Допустимые привилегии для имен таблиц (представлений), содержащихся в
<табличном выражении>
, должны включатьSELECT
. -
По умолчанию опцию
WAIT
можно использовать только в select-запросе выборки (не в подзапросах). -
Количество столбцов таблицы, получаемой по
<select-запросу выборки>
, равно числу элементов<списка выборки>
. -
Максимальное количество элементов в
<списке выборки>
равно 250. -
Если в
<списке выборки>
задано *, это означает выбор всех столбцов из списка таблиц (представлений). Столбцы выбираются в соответствии с порядком, в котором они были определены при создании таблицы (представления) и порядке очередности таблиц (представлений), заданных во<FROM-спецификации>
. Каждый столбец выбирается только один раз. -
Имена столбцов в каждом
<значимом выражении>
должны однозначно указывать столбец в<табличном выражении>
. -
Ключевое слово
DISTINCT
не должно задаваться в<select-запросе выборки>
более одного раза, за исключением случаев, когда оно задается в<подзапросах>
, входящих в этот<основной запрос выборки>
.select distinct make, count (*) from auto group by make having count(*) >(select count (distinct name) from person); | AMERICAN MOTORS | 91 | | CHRYSLER | 168 | | FORD | 118 | | GENERAL MOTORS | 284 |
-
<Значимое выражение>
может включать пользовательскую функцию СУБД ЛИНТЕР. -
<Значимое выражение>
может быть<логическим выражением>
.create or replace table t_bool (b boolean); insert into t_bool values (TRUE); insert into t_bool values (FALSE); insert into t_bool values (NULL); select b, not (b) "NOT" from t_bool; B NOT ---- ---- | T | F | | F | T | | | |
select t1.b, t2.b, t1.b or t2.b "OR" from t_bool t1, t_bool t2; B B OR ------------ | T | T | T | | T | F | T | | T | | T | | F | T | T | | F | F | F | | F | | | | | T | T | | | F | | | | | |
-
В качестве
<пользовательской функции>
может быть использована любая хранимая процедура, возвращающая значение одного из типов, разрешенных в языке SQL, не имеющая аргументов классаOUT
илиINOUT
и не содержащая обращений к СУБД. -
Если результатом
<табличного выражения>
является сгруппированная таблица, то каждая<спецификация столбца>
в каждом<значимом выражении>
должна быть группируемым столбцом или задаваться посредством агрегатной функции. -
Если результатом
<табличного выражения>
не является сгруппированная таблица, а какое-нибудь<значимое выражение>
включает в себя агрегатную функцию, то все столбцы каждого<значимого выражения>
должны быть заданы посредством агрегатной функции. -
Тип данных, длина, точность и дробная часть столбца таблицы-результата
<запроса выборки>
наследуются от<значимого выражения>
, из которого получен столбец. -
Если i-ое
<выбираемое значение>
в<списке выборки>
специфицировано следующим за ним<именем столбца>
, то i-ый столбец результата есть именованный столбец. Если i-ое<выбираемое значение>
в<списке выборки>
не специфицировано следующим за ним<именем столбца>
, но<значимое выражение>
представлено<спецификацией столбца>
, то i-ый столбец результата есть именованный столбец с именем<спецификация столбца>
. В противном случае, i-ый столбец считается неименованным. -
<Запрос выборки>
является обновляемым только тогда, когда выполняются следующие условия:-
ключевое слово
DISTINCT
не указано; -
все
<значимые выражения>
из<списка выборки>
включают в себя только<спецификацию столбца>
, и ни одна<спецификация столбца>
не встречается более одного раза; -
<FROM-спецификация>
из<табличного выражения>
содержит точно одну<табличную ссылку>
, и эта таблица (представление) является обновляемой; -
<WHERE-спецификация>
из<табличного выражения>
не включает в себя<подзапрос>
; -
<табличное выражение>
не содержит ни<GROUP BY-спецификации>
, ни<HAVING-спецификации>
.
-
-
<Табличное выражение>
можно не задавать. В этом случае запросSELECT
может содержать только константные выражения и пользовательские функции от них, обращения к значениям последовательности (NEXTVAL, CURRVAL
), а также константные предикаты. Такой запрос всегда возвращает одну запись.SELECT SYSDATE; SELECT LOG(2,5); SELECT MY_SEQ.NEXTVAL; SELECT 'СУБД ЛИНТЕР','версия 6.0'; SELECT ?(char(10)); //запрос с параметром create or replace table xxx (i int); insert into xxx values (10); insert into xxx values (20); create or replace procedure ppp () result int declare var i int; // code execute "select max(i) from xxx;" into i; // return i; // end; select ppp() in (20,30); |T|
-
Запрещено использование агрегатных функций в
<запросе выборки>
без<табличного выражения>
. -
Если в качестве выбираемого значения указано имя несуществующего столбца (
<псевдоним столбца>
), то оно должно быть перечислено в списке имен столбцов-псевдонимов<FROM-спецификации>
.select nmrerr, msg from errors fetch first 2; |NMRERR |MSG | |0 |операция завершена успешно | |1 |строка в таблице отсутствует |
select "Код завершения", "Текст сообщения" from errors as "Ошибки" ("Код завершения", "Текст сообщения") fetch first 2; |Код завершения|Текст сообщения | |0 |операция завершена успешно | |1 |строка в таблице отсутствует |
select nmrerr as "Код завершения", msg as "Текст сообщения" from errors fetch first 2; |Код завершения|Текст сообщения | |0 |операция завершена успешно | |1 |строка в таблице отсутствует |
-
В качестве
<функции>
в данной версии допустимы только функцииLEAD
иLAG
.
Общие правила
-
Если результат
<табличного выражения>
не является сгруппированным, а<список выборки>
включает только агрегатные функции, то результат<табличного выражения>
представляет собой значение каждой такой функции, а результатом<запроса выборки>
будет таблица, состоящая из одной строки. i-ым значением в строке будет значение, специфицированное i-ым<значимым выражением>
.select count(*), min(year+1900), max(cylnders), default(make) from auto; |1000 |1970 |12 |null |
-
Если результат
<табличного выражения>
не является сгруппированным,<список выборки>
не включает агрегатные функции, то каждое<значимое выражение>
применяется к каждой строке результата<табличного выражения>
, и в результате получается таблица из «m» строк, где «m» – мощность<табличного выражения>
. ЕслиDISTINCT
не указан, то результатом<запроса выборки>
будет такая таблица. ЕслиDISTINCT
указан, то результатом<запроса выборки>
будет таблица, полученная из описанной путем исключения дубликатов строк. -
Если результат
<табличного выражения>
является сгруппированным и имеет нуль групп, то результатом выполнения<запроса выборки>
будет пустая таблица.Сравните:
a) в ответе 31 группа:
select make from auto where color='BLACK' group by make; |ALPINE | |AMERICAN MOTORS | |BMW | …
б) ответ пуст:
select make from auto where color='GOLD' group by make;
-
Если результат
<табличного выражения>
является сгруппированным и имеет одну группу, а каждое<значимое выражение>
в<списке выборки>
представляет собой агрегатную функцию, то результатом<запроса выборки>
будет таблица, имеющая одну строку. I-е значение этой строки – результат i-й функции:select count(*), min(year+1900), max(cylnders), default(make) from auto group by 2; |1000 |1970 |12 | |
-
Если результат
<табличного выражения>
является сгруппированным и имеет одну или более групп, то результатом применения каждого<значимого выражения>
к каждой группе результата является таблица из «m» строк, где «m» – число групп в<табличном выражении>
. Когда<значимое выражение>
применяется к данной группе, эта группа является аргументом каждой агрегатной функции в<значимом выражении>
. ЕслиDISTINCT
не указан, то результатом будет описанная таблица. Если указанDISTINCT
, результатом<запроса выборки>
будет таблица, полученная из описанной путем исключения дубликатов строк.select make, count( make) from auto where color='BLACK' group by make; |ALPINE | 1 | |AMERICAN MOTORS | 23 | |BMW | 3 | …
select make, count( distinct make) from auto where color='BLACK' group by make; |ALPINE | 1 | |AMERICAN MOTORS | 1 | |BMW | 1 | …
-
Строка является дубликатом другой строки только тогда, когда все пары значений в одних и тех же позициях строк равны.
-
Суммарная длина значений всех столбцов ответа должна быть не более 64 Кбайт.
-
Разрешено использование в одном и том же подзапросе двух функций с модификатором
DISTINCT
, если они ссылаются к разным<значимым выражениям>
. -
Если в одном и том же запросе встречаются и
UNION DISTINCT
, иUNION ALL
, то всеUNION ALL
заменяются наUNION DISTINCT
.
Пример
select 1 from $$$sysrl group by $$$s11 having exists (select 1 from $$$attri group by $$$s21 having avg(distinct $$$s12) = sum(distinct $$$s22) );