WHERE-спецификация

Функция

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

Спецификация

   
<​WHERE-спецификация​>::=

Синтаксические правила

  1. Каждая <​спецификация столбца​>, непосредственно содержащаяся в <​логическом выражении​>, должна однозначно указывать на столбец таблицы (представления) из <​FROM-спецификации​>.

    Получить список автовладельцев, у которых предел кредита равен $100, и марки их автомобилей:
    select B.NAME, A.MODEL from auto A, person B
     where A.personid=B.personid and exists(
             select * from finance C
              where C.personid=A.personid and crditlim=100);
    
     NAME          MODEL
     ----------------------------------
    |KIM          |BUICK SKYLARK V8    |
    |MERTA        |GREMLIN X           |
    |SPARCK JONES |MERCURY COMET GT V8 |
    |SPIEGEL      |CADILLAC DE VILLE   |
  2. <​Значимое выражение​>, заданное в <​логическом выражении​>, не должно включать в себя ссылок на столбцы, которые являются результатом агрегатной функции.

    Недопустимая конструкция:

    select count(college) as CNT from finance where CNT​>3;
  3. <​Значимое выражение​>, заданное в <​логическом выражении​>, может включать в себя значение CURRVAL-последовательности. Использование NEXTVAL запрещено. В этом случае в условии WHERE используется то значение CURRVAL, которое было установлено перед выполнением запроса. Если значение CURRVAL не установлено, будет выдан код завершения 1102 (текущее значение последовательности не установлено).

    ! Например, если используется запрос вида
    select "TEST".NEXTVAL, "TEST".CURRVAL from AUTO
    where rowid <​ "TEST".CURRVAL;
    ! то значения "TEST".CURRVAL в секциях SELECT и WHERE будут
    ! разными, а именно: первое значение в секции SELECT будет
    ! отличаться от значения в секции WHERE на величину шага
    ! последовательности.
    DROP SEQUENCE "TEST";
    CREATE SEQUENCE "TEST";
    !error 1102:
    select rowid,"TEST".NEXTVAL, "TEST".CURRVAL
      from AUTO where rowid <​ "TEST".CURRVAL;
    !3 rows with rowid 1,2,3:
    select rowid,"TEST".NEXTVAL, "TEST".CURRVAL
      from AUTO where rowid <​ 4;
    !2 rows with rowid 1,2:
    select rowid,"TEST".NEXTVAL, "TEST".CURRVAL
      from AUTO where rowid <​ "TEST".CURRVAL;
    
    ! Результат работы примера:
    error 1102:
    INL : состояние выполнения : 1102
    текущее значение последовательности не установлено
    3 rows with rowid 1,2,3:
     ROWID
     -----
    |          1|                   1|                   1|
    |          2|                   2|                   2|
    |          3|                   3|                   3|
    INL : выдано строк     : 3
    2 rows with rowid 1,2:
     ROWID
     -----
    |          1|                   4|                   4|
    |          2|                   5|                   5|
     INL : выдано строк     : 2

    То есть после второго SELECT-запроса значение CURRVAL стало равно 3, и именно это значение было использовано в условии WHERE последнего (третьего) запроса.

  4. NEXTVAL запрещено в <​WHERE-спецификации​>.

  5. Если <​значимое выражение​>, непосредственно содержащееся в <​логическом выражении​>, является агрегатной функцией, то <​WHERE-спецификация​> должна содержаться в <​HAVING-спецификации​>, а аргументом этой функции должна быть внешняя ссылка.

    Получить список учебных заведений, которые закончили не менее 5 сотрудников, имеющих кредитные карточки AMERICAN EXPRESS:

    select college from finance
    where crditcrd ='AMERICAN EXPRESS'
      group by college having count(college)​>5;
    
     COLLEGE
    -------------
    |ARIZONA     |
    |CONNECTICUT |
    |RUTGERS     |
    |…           |
  6. Запрещено использование множественных функций в <​WHERE-спецификации​> без внешнего HAVING-запроса.

  7. Числовые значения <​значимого выражения​>, заданного в <​логическом выражении​>, допускается представлять в строковом виде.

    select count(*) from person where age​>'40' and salary between '20000' and 50000;

Общие правила

  1. <​Логическое выражение​> применяется к каждой строке, получаемой в результате <​FROM-спецификации​>. Результат <​WHERE-спецификации​> – таблица, состоящая из тех строк, для которых результат <​логического выражения​> истинен.

  2. Подзапрос (из <​логического выражения​>) выполняется для каждой строки, получаемой в результате <​FROM-спецификации​>, и его результаты используются при применении к данной строке <​логического выражения​>. Если подзапрос содержит внешнюю ссылку на столбец, то это будет ссылка на значение этого столбца в данной строке в результате выполнения <​FROM-спецификации​>.

    Получить список владельцев автомобилей черного цвета:

    select name||' '||firstnam from person where exists
    (select * from auto
      where person.personid=auto.personid and color='BLACK');
    
    |ADKINSON SYLVIA |
    |ADKINSON ED     |
    |ADKINSON STEVE  |
    |ADKINSON ART    |
    |ALDEN ARTHUR    |
    |ALDEN MARTHA    |
    |ALDEN CLAUDE    |
    |ALEXANDER TY    |