WHERE-спецификация
Функция
Задает таблицу, которая получается путем применения < логического выражения >
к результату предшествующей < FROM-спецификации >
.
Спецификация
::=
Синтаксические правила
-
Каждая
< спецификация столбца >
, непосредственно содержащаяся в< логическом выражении >
, должна однозначно указывать на столбец таблицы (представления) из< 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 |
-
< Значимое выражение >
, заданное в< логическом выражении >
, не должно включать в себя ссылок на столбцы, которые являются результатом агрегатной функции.Недопустимая конструкция:
select count(college) as CNT from finance where CNT >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
последнего (третьего) запроса. -
NEXTVAL
запрещено в< WHERE-спецификации >
. -
Если
< значимое выражение >
, непосредственно содержащееся в< логическом выражении >
, является агрегатной функцией, то< WHERE-спецификация >
должна содержаться в< HAVING-спецификации >
, а аргументом этой функции должна быть внешняя ссылка.Получить список учебных заведений, которые закончили не менее 5 сотрудников, имеющих кредитные карточки AMERICAN EXPRESS:
select college from finance where crditcrd ='AMERICAN EXPRESS' group by college having count(college) >5; COLLEGE ------------- |ARIZONA | |CONNECTICUT | |RUTGERS | |… |
-
Запрещено использование множественных функций в
< WHERE-спецификации >
без внешнего HAVING-запроса. -
Числовые значения
< значимого выражения >
, заданного в< логическом выражении >
, допускается представлять в строковом виде.select count(*) from person where age >'40' and salary between '20000' and 50000;
Общие правила
-
< Логическое выражение >
применяется к каждой строке, получаемой в результате< FROM-спецификации >
. Результат< WHERE-спецификации >
– таблица, состоящая из тех строк, для которых результат< логического выражения >
истинен. -
Подзапрос (из
< логического выражения >
) выполняется для каждой строки, получаемой в результате< 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 |