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

Функция

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

Спецификация
   
< select-запрос выборки >::=
[ ( ] SELECT [ALL | DISTINCT] список выборки
[FROM-спецификация] [ ) ]
< список выборки >::=
< псевдоним выбираемого значения >::=
Синтаксические правила
  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)
    );