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

Функция

Определение 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)
    );