Предикаты (часть I)
Предикаты представляют собой выражения, принимающие истинностное значение. Они могут представлять собой как одно выражение, так и любую комбинацию из неограниченного количества выражений, построенную с помощью булевых операторов AND, OR или NOT. Кроме того, в этих комбинациях может использоваться SQL-оператор IS, а также круглые скобки для конкретизации порядка выполнения операций.
Предикат в языке SQL может принимать одно из трех значений TRUE (истина), FALSE (ложь) или UNKNOWN (неизвестно). Исключение составляют следующие предикаты: NULL (отсутствие значения), EXISTS (существование), UNIQUE (уникальность) и MATCH (совпадение), которые не могут принимать значение UNKNOWN.
Правила комбинирования всех трех истинностных значений легче запомнить, обозначив TRUE как 1, FALSE как 0 и UNKNOWN как 1/2 (где то между истинным и ложным).
Данные типа NUMERIC (числа) сравниваются в соответствии с их алгебраическим значением.
Данные типа CHARACTER STRING (символьные строки) сравниваются в соответствии с их алфавитной последовательностью. Если a1a2…an и b1b2…bn - две последовательности символов, то первая "меньше" второй, если а1<b1, или а1=b1 и а2<b2 и т.д. Считается также, что а1а2…аn<b1b2…bm, если n<m и а1а2…аn=b1b2…bn, т.е. если первая строка является префиксом второй. Например, 'folder' < 'for', т.к. первые две буквы этих строк совпадают, а третья буква строки 'folder' предшествует третьей букве строки 'for'. Также справедливо неравенство 'bar' < 'barber', поскольку первая строка является префиксом второй.
Данные типа DATETIME (дата/время) сравниваются в хронологическом порядке.
Данные типа INTERVAL (временной интервал) преобразуются в соответствующие типы, а затем сравниваются как обычные числовые значения типа NUMERIC.Пример. Получить информацию о компьютерах, имеющих частоту процессора не менее 500 Мгц и цену ниже $800:
Запрос возвращает следующие данные:
Пример. Получить информацию обо всех принтерах, которые не являются матричными и стоят меньше $300:
Результат выполнения запроса:
<Проверяемое выражение> [NOT] BETWEEN
<Начальное выражение> AND <Конечное выражение>
Предикат
exp1 BETWEEN exp2 AND exp3
равносилен предикату
exp1>=exp2 AND exp1<=exp3
А предикат
exp1 NOT BETWEEN exp2 AND exp3
равносилен предикату
NOT (exp1 BETWEEN exp2 AND exp3)
Если значение предиката exp1 BETWEEN exp2 AND exp3 равно TRUE, в общем случае это отнюдь не означает, что значение предиката exp1 BETWEEN exp3 AND exp2 тоже будет TRUE, так как первый можно интерпретировать как предикат
exp1>=exp2 AND exp1<=exp3
а второй как
exp1>=exp3 AND exp1<=exp2
Пример. Найти модель и частоту процессора компьютеров стоимостью от $400 до $600:
<Проверяемое выражение> [NOT] IN (<подзапрос>)
| (<выражение для вычисления значения>,...)
Пример. Найти модель, частоту процессора и объем жесткого диска тех компьютеров, которые комплектуются накопителями 10 или 20 Мб:
Пример. Найти модель, частоту процессора и объем жесткого диска тех компьютеров, которые комплектуются накопителями 10 или 20 Мб и выпускаются производителем А:
Рекомендуемые упражнения: 1, 5, 8, 23, 38.
Предикат в языке SQL может принимать одно из трех значений TRUE (истина), FALSE (ложь) или UNKNOWN (неизвестно). Исключение составляют следующие предикаты: NULL (отсутствие значения), EXISTS (существование), UNIQUE (уникальность) и MATCH (совпадение), которые не могут принимать значение UNKNOWN.
Правила комбинирования всех трех истинностных значений легче запомнить, обозначив TRUE как 1, FALSE как 0 и UNKNOWN как 1/2 (где то между истинным и ложным).
- AND с двумя истинностными значениями дает минимум этих значений. Например, TRUE AND UNKNOWN будет равно UNKNOWN.
- OR с двумя истинностными значениями дает максимум этих значений. Например, FALSE OR UNKNOWN будет равно UNKNOWN.
- Отрицание истинностного значения равно 1 минус данное истинностное значение. Например, NOT UNKNOWN будет равно UNKNOWN.
Предикаты сравнения
Предикат сравнения представляет собой два выражения, соединяемых оператором сравнения. Имеется шесть традиционных операторов сравнения: =, >, <, >=, <=, <>.Данные типа NUMERIC (числа) сравниваются в соответствии с их алгебраическим значением.
Данные типа CHARACTER STRING (символьные строки) сравниваются в соответствии с их алфавитной последовательностью. Если a1a2…an и b1b2…bn - две последовательности символов, то первая "меньше" второй, если а1<b1, или а1=b1 и а2<b2 и т.д. Считается также, что а1а2…аn<b1b2…bm, если n<m и а1а2…аn=b1b2…bn, т.е. если первая строка является префиксом второй. Например, 'folder' < 'for', т.к. первые две буквы этих строк совпадают, а третья буква строки 'folder' предшествует третьей букве строки 'for'. Также справедливо неравенство 'bar' < 'barber', поскольку первая строка является префиксом второй.
Данные типа DATETIME (дата/время) сравниваются в хронологическом порядке.
Данные типа INTERVAL (временной интервал) преобразуются в соответствующие типы, а затем сравниваются как обычные числовые значения типа NUMERIC.Пример. Получить информацию о компьютерах, имеющих частоту процессора не менее 500 Мгц и цену ниже $800:
SELECT * FROM Pc WHERE speed >= 500 AND price < 800; |
Запрос возвращает следующие данные:
code | model | speed | ram | hd | cd | price |
1 | 1232 | 500 | 64 | 5 | 12x | 600.0 |
3 | 1233 | 500 | 64 | 5 | 12x | 600.0 |
7 | 1232 | 500 | 32 | 10 | 12x | 400.0 |
10 | 1260 | 500 | 32 | 10 | 12x | 350.0 |
SELECT * FROM Printer WHERE NOT (type = 'matrix') AND price < 300; |
Результат выполнения запроса:
code | model | color | type | price |
2 | 1433 | y | Jet | 270.0 |
3 | 1434 | y | Jet | 290.0 |
Предикат BETWEEN
Предикат BETWEEN проверяет, попадают ли значения проверяемого выражения в диапазон, задаваемый пограничными выражениями, соединяемыми служебным словом AND. Естественно, как и для предиката сравнения, выражения в предикате BETWEEN должны быть совместимы по типам.Синтаксис BETWEEN::=<Проверяемое выражение> [NOT] BETWEEN
<Начальное выражение> AND <Конечное выражение>
Предикат
exp1 BETWEEN exp2 AND exp3
равносилен предикату
exp1>=exp2 AND exp1<=exp3
А предикат
exp1 NOT BETWEEN exp2 AND exp3
равносилен предикату
NOT (exp1 BETWEEN exp2 AND exp3)
Если значение предиката exp1 BETWEEN exp2 AND exp3 равно TRUE, в общем случае это отнюдь не означает, что значение предиката exp1 BETWEEN exp3 AND exp2 тоже будет TRUE, так как первый можно интерпретировать как предикат
exp1>=exp2 AND exp1<=exp3
а второй как
exp1>=exp3 AND exp1<=exp2
Пример. Найти модель и частоту процессора компьютеров стоимостью от $400 до $600:
SELECT model, speed FROM Pc WHERE price BETWEEN 400 AND 600; |
model | speed |
1232 | 500 |
1233 | 500 |
1232 | 500 |
Предикат IN
Предикат IN определяет, будет ли значение проверяемого выражения обнаружено в наборе значений, который либо явно определен, либо получен с помощью табличного подзапроса. Табличный подзапрос это обычный оператор SELECT, который создает одну или несколько строк для одного столбца, совместимого по типу данных со значением проверяемого выражения. Если целевой объект эквивалентен хотя бы одному из указанных в предложении IN значений, истинностное значение предиката IN будет равно TRUE. Если для каждого значения Х в предложении IN целевой объект<>X, истинностное значение будет равно FALSE. Если подзапрос выполняется, и результат не содержит ни одной строки (пустая таблица), предикат принимает значение FALSE. Когда не соблюдается ни одно из упомянутых выше условий, значение предиката равно UNKNOWN.Синтаксис IN::=<Проверяемое выражение> [NOT] IN (<подзапрос>)
| (<выражение для вычисления значения>,...)
Пример. Найти модель, частоту процессора и объем жесткого диска тех компьютеров, которые комплектуются накопителями 10 или 20 Мб:
SELECT model, speed, hd FROM Pc WHERE hd IN (10, 20); |
model | speed | hd |
1233 | 750 | 20 |
1232 | 500 | 10 |
1232 | 450 | 10 |
1260 | 500 | 10 |
SELECT model, speed, hd FROM Pc WHERE hd IN (10, 20) AND model IN (SELECT model FROM product WHERE maker = 'A'); |
model | speed | hd |
1233 | 750 | 20 |
1232 | 500 | 10 |
1232 | 450 | 10 |