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    |