Раздел WHERE

Если в табличном выражении присутствует раздел WHERE, то следующим вычисляется он.

Условие, следующее за ключевым словом WHERE, может включать предикат условия поиска, булевские операторы AND, OR и NOT и скобки, указывающие требуемый порядок вычислений.

Поскольку в таблицах допускается наличие неопределенных значений, то вычисление условия поиска производится не в булевой, а в трехзначной логике со значениями true, false и unknown. Для любого предиката известно, в каких ситуациях он может порождать значение unknown. Булевские операции AND, OR и NOT работают в трехзначной логике следующим образом:

Значение Операция Значение Результат
true AND unknown unknown
unknown AND true unknown
unknown AND unknown unknown
true OR unknown true
unknown OR true true
unknown OR unknown unknown
  NOT unknown unknown

Среди предикатов условия поиска в соответствии со стандартом могут находиться следующие предикаты: предикат сравнения, предикат BETWEEN, предикат IN, предикат LIKE, предикат NULL, предикат с квантором и предикат EXISTS.

При проверке условия выборки числа сравниваются алгебраически: отрицательные числа считаются меньше, чем положительные, независимо от их абсолютной величины. Строки сравниваются в соответствии с их представлением в коде ANSI. При сравнении двух строк, имеющих разные длины, предварительно более короткая строка дополняется справа пробелами для того, чтобы обе строки имели одинаковую длину.

Предикат сравнения с выражениями или результатами подзапроса. Условие определяется из двух выражений, разделенных одним из знаков операции отношения: =, <>(не равно), >, >=, < и <=.

Арифметические выражения левой и правой частей предиката сравнения строятся по общим правилам построения арифметических выражений и могут включать в общем случае имена столбцов таблиц из раздела FROM и константы. Типы данных арифметических выражений должны быть сравнимыми (например, если тип столбца a таблицы A является типом символьных строк, то предикат “a = 5” недопустим).

Если правый операнд операции сравнения задается подзапросом, то дополнительным ограничением является то, что мощность результата подзапроса должна быть не более единицы. Если хотя бы один из операндов операции сравнения имеет неопределенное значение, или если правый операнд является подзапросом с пустым результатом, то значение предиката сравнения равно unknown.

Пример 4. Выборка фамилии и балла студентов, имена которых Александр.

SELECT fam, ball FROM student WHERE im = 'Александр’;

Пример 5. Выборка из таблицы student данных по студентам специальности с номером 2:

SELECT * FROM student WHERE kod_s = 2;

Пример 6. Извлечение из таблицы student записей с полями фамилия,имя, балл за исключением студентов специальности с номером 2:

SELECT fam, im, ball FROM student WHERE NOT kod_s = 2;

Предикат BETWEEN — проверка вхождения в диапазон. Условие определяется следующим синтаксисом:

 
 

Результат приведенных ниже выражений одинаковый:

x BETWEEN y AND z

x >= y AND x <= z

Пример 7. Отображение диапазона баллов студентов следующим образом:

SELECT fam, ball FROM student WHERE ball BETWEEN 80 AND 100;

Условие NOT BETWEEN определяет не принадлежность диапазону. Результат приведенных ниже выражений одинаковый:

x NOT BETWEEN y AND z

NOT (x BETWEEN y AND z)

Пример 8. Можно показать, что балл не принадлежит диапазону следующим образом:

SELECT fam, ball FROM student WHERE ball NOT BETWEEN 80 AND 100;

Предикат IN — проверка наличия элемента в списке. Условие определяется следующим синтаксисом:

 
 

Типы левого операнда и значений из списка правого операнда должны быть сравнимыми.

Значение предиката равно TRUE в том и только в том случае, когда значение левого операнда совпадает хотя бы с одним значением списка правого операнда. Если список правого операнда пуст (так может быть, если правый операнд задается подзапросом), или значение “подразумеваемого” предиката сравнения x = y (где x— значение арифметического выражения левого операнда) равно FALSE для каждого элемента y списка правого операнда, то значение предиката IN равно FALSE. В противном случае значение предиката IN равно UNKNOWN. По определению значение предиката “x NOT IN S” равно значению предиката “NOT (x IN S)”.

Пример 9. Для выбора студентов, балл которых равен 80, 90 или 100 можно ввести следующую команду:

SELECT fam, ball FROM student WHERE ball IN (80, 90, 100);

Оператор IN является в действительности просто краткой записью условия, представляющего собой последовательность отдельных сравнений, соединенных операторами ОR (или). Предыдущая конструкция SELECT эквивалентна следующей конструкции:

SELECT fam, ball FROM student WHERE ball = 80 OR ball = 90 OR ball = 100;

Пример 10. Можно использовать также оператор NOT IN (не принадлежит), например:

SELECT fam, ball FROM student WHERE ball NOT IN (80, 90, 100);

Предикат LIKE — проверка соответствия образцу. Условие определяется следующим синтаксисом

 
 

Типы данных столбца левого операнда и образца должны быть типами символьных строк. В разделе ESCAPE должен специфицироваться одиночный символ.

Значение предиката равно TRUE, если char2 является подстрокой заданного столбца. При этом, если раздел ESCAPE отсутствует, то при сопоставлении шаблона со строкой производится специальная интерпретация двух символов шаблона:

символ подчеркивания (‘_’) или пробел обозначает любой одиночный символ;

символ процента (‘%’) обозначает последовательность произвольных символов произвольной длины (может быть, нулевой).

Если же раздел ESCAPE присутствует и специфицирует некоторый одиночный символ x, то пары символов ‘x_’ и ‘x%’ представляют одиночные символы ‘_’ и ‘%’ соответственно.

Значение предиката LIKE есть unknown, если значение столбца, либо шаблона не определено.

Значение предиката ‘x NOT LIKE y ESCAPE z’ совпадает со значением ‘NOT x LIKE y ESCAPE z’.

Пример 11. Выбор всех студентов, фамилии которых начинаются с буквы ‘М’:

SELECT fam FROM student WHERE fam LIKE 'М%';

Пример 12. Выбор студентов, адреса которых содержат комбинацию символов 'A_B'.

Опция ESCAPE здесь идентифицирует обратную наклонную черту (\) как символ отмены. В образце этот символ появляется перед подчеркиванием (_).

Это заставляет ORACLE интерпретировать подчеркивание буквально, а не как специальный поисковый символ образца.

SELECT fam FROM student WHERE adres LIKE 'A\_B%' ESCAPE '\';

Предикат NULL — проверка на NULL. Условие определяется следующим синтаксисом

 
 

Этот предикат всегда принимает значения TRUE или FALSE. При этом значение “x IS NULL” равно TRUE тогда и только тогда, когда значение x не определено. Значение предиката “x NOT IS NULL” равно значению “NOT x IS NULL”.

Пример 13. Выбор всех студентов с неопределенными значениями в поле fam:

SELECT fam FROM student WHERE fam IS NULL

Предикат с квантором — сравнение с любыми или всеми элементами в списке или подзапросе. Условие определяется следующим синтаксисом

 
 

Обозначим через x результат вычисления арифметического выражения левой части предиката, а через S результат вычисления подзапроса.

Предикат “x <операция сравнения> ALL S” имеет значение true, если S пусто или значение предиката “x <операция сравнения> s” равно true для каждого s, входящего в S. Предикат “x <операция сравнения> ALL S” имеет значение false, если значение предиката “x <операция сравнения> s” равно false хотя бы для одного s, входящего в S. В остальных случаях значение предиката “x <операция сравнения>ALL S” равно unknown.

Предикат “x <операция сравнения> SOME S” имеет значение false, если S пусто или значение предиката “x <операция сравнения> s” равно false для каждого s, входящего в S. Предикат “x <операция сравнения> SOME S” имеет значение true, если значение предиката “x <операция сравнения> s” равно true хотя бы для одного s, входящего в S. В остальных случаях значение предиката “x <операция сравнения>SOME S” равно unknown.

Действие опции ANY аналогично действию опции SOME.

Предикат EXISTS — проверка существования строк в подзапросе. Условие определяется следующим синтаксисом

 
 

Значением этого предиката всегда является TRUE или FALSE, и это значение равно TRUE тогда и только тогда, когда результат вычисления подзапроса не пуст. Оператор EXISTS(существует) представляет в SQL запросах квантор существования — понятие, заимствованное из формальной логики.

Пример 14. Предположим, что имеется таблица result, содержащая информацию о результатах прохождения теста студентами.

Необходимо выбрать фамилии студентов, которые прошли тест успешно.

SELECT fam FROM student WHERE EXISTS (SELECT * FROM result WHERE student.kod_stud = result.kod_stud AND ball_test>=70);

В данном примере поочередно рассматривается каждое значение поля FAM и проверяется истинность условия существования. Предположим, что первое значение поля FAM - Андреева, а соответствующее значение поля KOD_STUD - 100. Если множество записей из RESULT, содержащих KOD_STUD=100 и BALL_TEST >= 70, не пусто, то Андреева будет одним из результирующих значений. Аналогично выбираются и другие значения поля FAM.

Фактически любой запрос, который может бьпь выражен с использованием IN, может быть альтернативным образом сформулирован также с помощью EXISTS.

Пример 15. Можно сконструировать отрицание существования, используя совместно операторы NOT и EXISTS. Например, выбрать фамилии студентов, которые не прошли тест успешно, т.е. набрали менее 70 баллов:

SELECT fam FROM student WHERE NOT EXISTS (SELECT * FROM result WHERE student.kod_stud = result.kod_stud AND ball_test>=70);

В начало


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: