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)
);