Доступные версии документации

select-запрос выборки

Функция

Определение select-запроса выборки данных.

Спецификация
   
Синтаксические правила
  1. Допустимые привилегии для имен таблиц (представлений), содержащихся в <табличном выражении>, должны включать SELECT.

  2. По умолчанию опцию WAIT можно использовать только в select-запросе выборки (не в подзапросах).

  3. Количество столбцов таблицы, получаемой по <select-запросу выборки>, равно числу элементов <списка выборки>.

  4. Максимальное количество элементов в <списке выборки> равно 250.

  5. Если в <списке выборки> задано *, это означает выбор всех столбцов из списка таблиц (представлений). Столбцы выбираются в соответствии с порядком, в котором они были определены при создании таблицы (представления) и порядке очередности таблиц (представлений), заданных во <FROM-спецификации>. Каждый столбец выбирается только один раз.

  6. Имена столбцов в каждом <значимом выражении> должны однозначно указывать столбец в <табличном выражении>.

  7. Ключевое слово 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 |
  8. <Значимое выражение> может включать пользовательскую функцию СУБД ЛИНТЕР.

  9. <Значимое выражение> может быть <логическим выражением>.

    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 |   |
    |   |   |   |
  10. В качестве <пользовательской функции> может быть использована любая хранимая процедура, возвращающая значение одного из типов, разрешенных в языке SQL, не имеющая аргументов класса OUT или INOUT и не содержащая обращений к СУБД.

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

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

  13. Тип данных, длина, точность и дробная часть столбца таблицы-результата <запроса выборки> наследуются от <значимого выражения>, из которого получен столбец.

  14. Если i-ое <выбираемое значение> в <списке выборки> специфицировано следующим за ним <именем столбца>, то i-ый столбец результата есть именованный столбец. Если i-ое <выбираемое значение> в <списке выборки> не специфицировано следующим за ним <именем столбца>, но <значимое выражение> представлено <спецификацией столбца>, то i-ый столбец результата есть именованный столбец с именем <спецификация столбца>. В противном случае, i-ый столбец считается неименованным.

  15. <Запрос выборки> является обновляемым только тогда, когда выполняются следующие условия:

    • ключевое слово DISTINCT не указано;

    • все <значимые выражения> из <списка выборки> включают в себя только <спецификацию столбца>, и ни одна <спецификация столбца> не встречается более одного раза;

    • <FROM-спецификация> из <табличного выражения> содержит точно одну <табличную ссылку>, и эта таблица (представление) является обновляемой;

    • <WHERE-спецификация> из <табличного выражения> не включает в себя <подзапрос>;

    • <табличное выражение> не содержит ни <GROUP BY-спецификации>, ни <HAVING-спецификации>.

  16. <Табличное выражение> можно не задавать. В этом случае запрос 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|
  17. Запрещено использование агрегатных функций в <запросе выборки> без <табличного выражения>.

  18. Если в качестве выбираемого значения указано имя несуществующего столбца (<псевдоним столбца>), то оно должно быть перечислено в списке имен столбцов-псевдонимов <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             |строка в таблице отсутствует |
  19. В качестве <функции> в данной версии допустимы только функции LEAD и LAG.

Общие правила
  1. Если результат <табличного выражения> не является сгруппированным, а <список выборки> включает только агрегатные функции, то результат <табличного выражения> представляет собой значение каждой такой функции, а результатом <запроса выборки> будет таблица, состоящая из одной строки. i-ым значением в строке будет значение, специфицированное i-ым <значимым выражением>.

    select count(*), min(year+1900), max(cylnders), default(make) from auto;
    |1000 |1970 |12 |null |
  2. Если результат <табличного выражения> не является сгруппированным, <список выборки> не включает агрегатные функции, то каждое <значимое выражение> применяется к каждой строке результата <табличного выражения>, и в результате получается таблица из «m» строк, где «m» – мощность <табличного выражения>. Если DISTINCT не указан, то результатом <запроса выборки> будет такая таблица. Если DISTINCT указан, то результатом <запроса выборки> будет таблица, полученная из описанной путем исключения дубликатов строк.

  3. Если результат <табличного выражения> является сгруппированным и имеет нуль групп, то результатом выполнения <запроса выборки> будет пустая таблица.

    Сравните:

    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;
  4. Если результат <табличного выражения> является сгруппированным и имеет одну группу, а каждое <значимое выражение> в <списке выборки> представляет собой агрегатную функцию, то результатом <запроса выборки> будет таблица, имеющая одну строку. I-е значение этой строки – результат i-й функции:

    select count(*), min(year+1900), max(cylnders), default(make) from auto group by 2;
    |1000  |1970  |12     |       |
  5. Если результат <табличного выражения> является сгруппированным и имеет одну или более групп, то результатом применения каждого <значимого выражения> к каждой группе результата является таблица из «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 |
     …
  6. Строка является дубликатом другой строки только тогда, когда все пары значений в одних и тех же позициях строк равны.

  7. Суммарная длина значений всех столбцов ответа должна быть не более 64 Кбайт.

  8. Разрешено использование в одном и том же подзапросе двух функций с модификатором DISTINCT, если они ссылаются к разным <значимым выражениям>.

  9. Если в одном и том же запросе встречаются и 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)
    );
Заметили ошибку?
Выделите текст и нажмите Ctrl + Enter