Шрифт:
Второй предикат использует другой оператор. Ключевое слово BETWEEN задает проверку "больше или равно значению в левой части и меньше или равно значению в правой части".
Круглые скобки здесь не являются обязательными, хотя для многих сложных выражений скобки должны быть использованы для задания приоритета вычислений выражений и предикатов. В ситуациях, когда проверяются серии предикатов, использование для них скобок является хотя и необязательным, но весьма полезным для документирования и отладки.
Решение, что является истинным
На рис. 21.1 показаны возможные результаты вычисления двух предикатов из предыдущего примера.
В нашем примере вначале проверяется (HIRE_DATE > CORRENT_DATE - 366), потому что это самый левый предикат. Если бы у него были вложенные предикаты, то сначала проверялись бы они. Ни для одного из предикатов нет проверки на NULL, но мы включили сюда тот случай, когда встречается пустое ("неизвестное") значение в проверяемых данных, что приведет к результату "ложь", поскольку проверка не может вернуть истину. Должна быть доказана истинность предикатов, чтобы они считались истинными.
Если NULL встречается в HIRE DATE, то проверка немедленно прекращается и возвращает ложь [72] . Связка AND означает: два предиката, соединенные операцией AND, не могут давать результат истина, если один из них является ложным, следовательно, нет необходимости выполнять проверку второго предиката.
Если проверяемые данные не являются NULL, ТО следующей является проверка, верно ли, что значение больше указанной константы. Если нет, проверка прекращается. Другими словами, NULL и ложь имеют один и тот же эффект, поскольку оба не являются истиной.
72
Это "ускоренное" вычисление логических значений, которое реализовано в Firebird 1.5 и выше. Firebird l.Ojc использует полное логическое вычисление. Для тех, кто любит изобретательные загадочные выражения, старый метод может быть восстановлен при использовании параметра конфигурации FullBooleanEvaluation.
Рис. 21.1. Вычисление истинности
Если первый предикат истинный, похожий процесс вычисления выполняется для второго предиката. Только когда будет выполнено все это, процесс вычисления утверждения завершается.
Символы, используемые в выражениях
Табл. 21.1 описывает символы, которые могут появляться в выражениях SQL.
Таблица 21.1. Элементы выражений SQL
Элемент | Описание |
Имя столбца | Идентификаторы столбцов из указанных таблиц, представляющих поле, используемое в вычислении, или сравнении, или в качестве условия поиска. На любой столбец базы данных может быть ссылка в выражении за исключением столбцов типа массива. (Исключение: любой столбец, являющийся массивом, может проверяться на is [NOT] NULL) |
Элементы массива | На элементы массива может быть ссылка в выражении |
Имена столбцов только для вывода | Во время выполнения идентификаторы задают вычисляемые столбцы или алиасы столбцов базы данных |
Ключевое слово AS | Используется (необязательно) как маркер для имени только для выходного столбца списка столбцов в SELECT |
Арифметические операторы | Символы +, -, * и / используются для вычисления значений |
Логические операторы | Зарезервированные слова NOT, AND и OR используются в простых условиях поиска или при комбинировании простых условий поиска для создания сложных предикатов |
Операторы сравнения | <, >, <=, >=, = и <> используются для сравнения утверждений |
Другие операторы сравнения | LIKE, STARTING WITH, CONTAINING, BETWEEN, и IS [NOT] NULL |
Операторы существования | Предикаторы, используемые для проверки существования значения в наборе, IN может быть использован с наборами констант или со скалярными подзапросами, EXISTS, SINGULAR, ALL, ANY и SOME могут быть использованы только с подзапросами |
Оператор конкатенации | Пара из вертикальных черт (||) используется для соединения символьных строк. Обратите внимание, что символы + и & не являются символами конкатенации в стандарте SQL |
Константы | Числа или заключенные в апострофы строковые литералы, такие как 507 или 'Tokyo', которые могут быть включены в вычисления или сравнения в качестве полей времени выполнения |
Литералы даты | Выражения, подобные строковым литералам, заключенным в апострофы, которые могут быть интерпретированы как значения даты, времени или даты-времени в операциях EXTRACT, SELECT, INSERT и UPDATE. Литералами даты могут быть предварительно определенные литералы ('TODAY', 'NOW' 'YESTERDAY', 'TOMORROW') или подходящие строки даты и времени, как описано в главе 10. В диалекте 3 литералы даты обычно требуют преобразования (CAST) в допустимый тип даты/времени при использовании в выражениях EXTRACT и SELECT |
Внутренние контекстные переменные | Получаемые с сервера переменные, которые возвращают зависимые от контекста значения, такие как серверное время или идентификатор текущей транзакции |
Подзапросы | Внутренние операторы SELECT, которые возвращают единственное (скалярное) значение для вывода или для сравнения в предикате |
Локальные переменные | Именованные хранимые процедуры, триггеры или (в ESQL) переменные приложений, содержащие значения, которые могут изменяться в процессе выполнения |
Идентификаторы функций | Идентификаторы внутренних или внешних функций в функциональных выражениях |
CAST(значение AS тип-данных) | Функциональные выражения, явно преобразующие значение одного типа данных в другой тип данных |
Условные выражения | Функции, объявляющие два или более взаимоисключающих условия для одного столбца, начинающиеся с ключевого слова CASE, COALESCE или NULLIF |
Круглые скобки | Используются для группирования выражений. Операции внутри скобок выполняются перед операциями вне скобок. Когда используются вложенные скобки, вначале вычисляются значения самых внутренних выражений, затем вычисления перемещаются вверх по уровням вложенности |
Предложение COLLATE | Может быть применено со значениями CHAR и VARCHAR, чтобы использовать строковые сравнения в указанной последовательности сортировки |
Операторы SQL
Синтаксис SQL Firebird включает операторы для сравнения и вычисления значений столбцов, констант, переменных и выражений встраиваемого SQL для получения различных утверждений.
Приоритет операторов
Приоритет определяет порядок, в котором операторы и создаваемые ими значения вычисляются в выражении.
Когда выражение содержит несколько операторов одного и того же типа, операторы вычисляются слева направо, если только не существует конфликта, когда два оператора одного и того же типа воздействуют на одни и те же значения. Когда возникает конфликт, приоритет операторов определяется типом. В табл. 21.2 показаны приоритеты типов операторов Firebird от высшего к низшему.
Таблица 21.2. Приоритеты типов операторов
Тип оператора | Приоритет | Объяснение |
Конкатенация | 1 | Строки объединяются до выполнения любых других операций |
Арифметический | 2 | Арифметические операции выполняются после конкатенации строк, но перед выполнением сравнений и логических операций |
Сравнение | 3 | Операции сравнения вычисляются после конкатенации строк и выполнения арифметических операций, но до логических операций |
Логический | 4 | Логические операции выполняются после всех других операций. Приоритет: когда условия поиска являются комбинированными, порядок вычислений определяется приоритетом используемых операторов, NOT вычисляется перед AND, а AND вычисляется перед OR. Круглые скобки могут использоваться для изменения порядка вычисления |
Оператор конкатенации
Оператор конкатенации (и) соединяет две символьные строки и создает одну строку. Символьные строки могут быть константами или значениями, полученными из столбцов:
SELECT Last_name ||', ' || First_Name AS Full_Name FROM Membership;
! ! !
ПРИМЕЧАНИЕ. Firebird более требователен к переполнению строк, чем его предшественники. Он проверит длину входных столбцов и заблокирует конкатенацию, если результирующий размер потенциально может превысить лимит для VARCHAR (32 765 байтов).
. ! .
Арифметические операции
Арифметические выражения вычисляются слева направо за исключением случаев, когда возникает двусмысленность. В этих случаях арифметические операции вычисляются в соответствии с приоритетами, описанными в табл. 21.3. Например, умножение выполняется до деления, а деление выполняется до вычитания.
Арифметические операции всегда выполняются до сравнений и логических операций. Для изменения порядка вычислений сгруппируйте операции с помощью круглых скобок.