Oracle что такое предикат

Обновлено: 03.07.2024

Выражение со значениями типа записи, как это ни удивительно, определяет значение типа записи. Значение типа записи может состоять из одного выражения с каким-либо значением либо из множества таких выражений. Например:

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

Выражения со значениями типа коллекции

Значением выражения типа коллекции является массив.

Выражения со значениями типа ссылки

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

Предикаты

Предикаты – это используемые в SQL эквиваленты логических высказывании. Примером высказывания является следующее выражение:

В таблице, содержащей информацию об учениках, домен столбца CLASS (класс) может быть набором таких значений: SENIOR (выпускной), JUNIOR (предпоследний), SOPHOMORE (второй старший класс), FRESHMAN (первый старший класс) и NULL (неизвестен). Предикат можно использовать для отсева тех строк, для которых его значение ложно, оставляя, соответственно, только те строки, для которых значение этого предиката истинно. Иногда в какой – либо строке значение этого предиката не известно (т.е. представляет собой NULL). В таком случае строку можно отбросить или оставить в зависимости от конкретной ситуации.

CLASS = SENIOR – это пример предиката сравнения. В SQL имеется шесть операторов сравнения. В простом предикате сравнения используется только один из этих операторов. Предикаты сравнения и примеры их использования приведены в таблице 3.3.

Таблица 3.3. Операторы и предикаты сравнения.

Оператор Сравнение Выражение
= Равно CLASS = SENIOR
<> Не равно CLASS <> SENIOR
< Меньше CLASS < SENIOR
> Больше CLASS > SENIOR
<= Меньше или равно CLASS <= SENIOR
>= Больше или равно CLASS >= SENIOR

Внимание:
В последнем примере только первые два выражения имеют смысл (CLASS = SENIOR и CLASS <> SENIOR). Это объясняется тем, что SOPHOMORE считается больше, чем SENIOR, потому что в последовательности сопоставления, установленной по умолчанию (т.е. когда сортировка выполняется по алфавиту), SO следует после SE. Однако такая интерпретация, по всей вероятности, – не то, что вам нужно
.

Сравниваются два множества, одно из которых – это обычно значение столбца, а другое – чаще всего константа или подзапрос. Значения. Которые при этом сравниваются, называют скалярными.

Примечание по предикатам:
• Если хотя бы одно из сравниваемых значений (слева или справа) равно NULL, то результатом сравнения будет UNKNOWN.
• При сравнении строк разной длины недостающие символы дополняются пробелами. Следует также иметь в виду, что в ASCII коды заглавных букв меньше, чем коды строчных, а у цифр коды меньше, чем у букв. В EBCDIC все наоборот.
• Эти предикаты существенно влияют на эффективность запроса, поскольку в этом случае при поиске строк используются индексы. Что позволяет избежать полного просмотра таблицы.

Особенности промышленных серверов:
• В SQL помимо <> можно использовать !=
• Кроме того допустимы такие операторы отношения, как ! (не больше).

2) Попадания во множество
[NOT] IN ( | )

Определяется множество значений, которому объект сравнения, записанный до ключевого слова IN, может принадлежать или не принадлежать. Если подзапрос не возвращает строк, то предикат принимает значение FALSE.

Примеры на работу со множествами:

Примеры на принадлежность диапазону:

SELECT * FROM Customer WHERE CName BETWEEN ‘A’ AND ‘G’
SELECT * FROM SalesPeople WHERE (Comm BETWEEN .10 AND .12) AND NOT Comm IN (.10, .12)
//Показывает, как исключить границы из диапазона значений.

4) Подобия:
[NOT] [ESCAPE ]

Примечания по предикату подобия:
• Предикат подобия применим только к символьным данным, поскольку используется для поиска подстрок. С этой целью используются спецсимволы, которые могут обозначать все, что угодно. Так символ «_» заменяет любой одиночный символ, который может быть размещен в данной позиции, а символ «%» заменяет последовательность символов произвольной длины.
• В тех случаях, когда объектом поиска являются перечисленные спецсимволы, используется ключевое слово ESCAPE оно позволяет определить любой символ своеобразным флагом, используемым непосредственно перед спецсимволом и означающим, что следующий за ним символ «%» или «_» следует воспринимать как обычный символ. Если при этом необходимо найти и ESCAPE-символ, то его следует написать дважды подряд.

Особенности промышленных серверов: В SQL Server можно шаблоны задавать с помощью маски с []: ‘[A-D]%’, ‘^[F-M]%’

Примеры на предикат подобия:

SELECT * FROM SalesPeople WHERE SName LIKE ‘P__I%’
SELECT * FROM SalesPeople WHERE SName LIKE ‘%/_//%’ ESCAPE ‘/’

5) Проверки NULL-значений:
IS [NOT] NULL
Проверяются пропущенные (отсутствующие) значения в колонке таблицы.

Примечание: если включает несколько значений, то в общем случае: IS NOT ? NULL NOT (IS NULL), поскольку аргумент не значение, а конструктор строки.

Примеры на предикат проверки NULL-значений:

SELECT * FROM Customer WHERE City IS NULL
SELECT * FROM SalesPeople WHERE Comm IS NOT NULL

Примечания: булевы оператора связывают один или несколько предикатов, образуя единственное логическое значение TRUE|FALSE. Используя предикаты с булевыми операторами, можно значительно увеличить и избирательную способность по отбору строк в результат запроса.

При использовании булевых операторов, особенно оператора NOT, следует применять круглые скобки для правильного составления условий.

Примеры на булевы операторы:

SELECT * FROM Customer WHERE City=’San Jose’ OR Rating>200
SELECT * FROM Orders WHERE NOT ((ODate=10/03/1990 AND SNum>1002) OR Amt>2000)

7) Перекрытия
OVERLAPS

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

Примеры:

(Datetime ‘1992-11’ Interval ‘0004-01’) OVERLAPS (Datetime ‘1994-11’, Datetime ‘1994-02’)
(Datetime ‘1992-11’ Interval ‘-0004-01’) OVERLAPS (Datetime ‘1994-11’, Datetime ‘1994-02’)

Предикаты используются в условиях поиска предложений WHERE и HAVING в условиях соединения предложений FROM и др. конструкциях, где требуется логическое значение.

В SQL все операторы возвращающие один из вышеперечисленных типов ( TRUE , FALSE , UNKNOWN ) являются предикатами.

Приоритеты

Самые популярные предикаты:

Внимание! Настоятельно рекомендуется в SQL запросах использовать их именно в той последовательности, в которой они перечислены, т.к. СУБД выполняют их именно в такой последовательности.

Особенности

Предикаты представляют собой выражения, принимающие значение булевых типов и не определённый тип. Они могут представлять собой как одно выражение, так и любую комбинацию из неограниченного количества выражений, построенную с помощью булевых операторов AND, OR или NOT. Кроме того, в этих комбинациях может использоваться SQL-оператор IS, а также круглые скобки для конкретизации порядка выполнения операций.

Предикат в языке SQL может принимать одно из трех значений TRUE (истина), FALSE (ложь) или UNKNOWN (неизвестно). Исключение составляют следующие предикаты: NULL (отсутствие значения), EXISTS (существование), UNIQUE (уникальность) и MATCH (совпадение), которые не могут принимать значение UNKNOWN .

Правила комбинирования всех трех истинностных значений легче запомнить, обозначив TRUE как 1, FALSE как 0 и UNKNOWN как 1/2 или 0.5, т.е. половина единицы (где-то между истинным и ложным, т.е. между нулём и единицей).

  • AND с 2-мя истинностными значениями дает минимум этих значений. Напр., TRUE AND UNKNOWN = UNKNOWN .
  • OR с 2-мя истинностными значениями дает максимум этих значений. Напр., 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:

Запрос возвращает следующие данные:

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

Получить информацию обо всех принтерах, которые не являются матричными и стоят меньше $300:

Пока всё просто. А вот теперь два вопроса.

В документации к любой DBMS, как только заходит речь о предикатах - цитируется указанное определение (с той или иной формой полноты и подробности), а дальше. дальше - предикатами везде начинают называть не ВЫРАЖЕНИЯ, а ОПЕРАТОРЫ. Операторы сравнения, всякие BETWEEN, LIKE, NOT IN и так далее.

Это что - просто вольность такая? или всё же в этом есть какой-то глубинный смысл?

a < 2 -- это предикат. а символ '<' - это символ оператора сравнения 'меньше чем'.

просто к символу 'меньше чем' ты привык, а к символу BETWEEN - нет.


'a BETWEEN 1 AND 10' - такое же выражение как и 'a > 0 AND a < 11'

второй вопрос недопонял,
но склонен ответить на него - нет, от контекста ничего не зависит.

В контексте - понятно, что вот тут это предикаты:

А без контекста - не видать? то есть контекст - существенен?

Вопрос к авторам MySQL. Т.к. (table.column + 0) явно не "ограничивается списком "True, False, Unknown"."

Много в мире кривых поделок. Это же повод задаваться глубокомысленными вопросами "what is the secret of life", "what is the predicat" и поступать на филосовский факультет и кафедру теологии. После получения профильного образования, ответы на данные вопросы будут очевидны )))).

Предикат - это выражение, результатом которого является истинностное значение.

Применительно к разннобразным версиям SQL, вероятно так:

Предикат - это выражение, допустимое к использованию в условиях фильтра или соединения наборов данных,
результатом вычисления которого является интерпретируется как истинностное значение в конкретном диалекте SQL.

Так, в одних диалектах допускается явное использование функций, возвращающих логическое значение (boolean) в качестве предикатов, а в других нет (Oracle Database, например).
То же касается приведения значений оператора/функции к логическому значению.
Обычно там, где не допускают использования boolean функций, не допускают и автоматического приведения значения к логическому типу.

Оператор и функция обычно синонимы, но там, где Oracle Database, например, даже если вы определяете user defined operator,
возвращаемое им значение, для формирования предиката в фильтре, должно использовать известный sql-машине
"реляционный" оператор сравнения (=, >= и т.п.)

Тут же мы приходит к следующему вопросу "а что такое boolean"

в любой реализации sql можно твёрдо сказать, что это предикат или часть предиката.
И это легко опознается по наличию двуместного предикатного символа >
(Т.е. есть набор предикатных символов соответствующей арности, и правильность предиката легко опознается по их опознанию).

Или Вы имеете в виду, что понятие предиката - это тот самый сферический конь? А в практической реализации оно есть логическое выражение, и на этом можно успокоиться?

Unknown - запрещенный американским правительством к использованию в математической логике
(которой вменено в обязанность соблюдать закон исключения третьего) символ.

SQL использует его, не произнося вслух, и во всех случаях, исключая явное манипулирование им.

Это одна из причин (запрет на отказ от закона исключения третьего), почему некоторые мыслители на темы реляционных датабейсес,
пытаются "запретить Null" в реляционной теории.

Что такое "предикат", так или иначе пытаются пояснить, определяя контекст последующего рассуждения о нём.

ну, нет.
В практической реализации это то, что признается или способно интерпретироваться релизацией как логическое выражение.

А дальше каждая СУБД берет стандартные предикаты и в своих рамках изобретает правила трактования различного синтаксиса предикатов.

в части трактования второй части высказывания дело можно представить как приведение значения выражения к логическому значению.
Мне, например, это, в целом больше не нравится, чем могло бы быть удбно.
(Правда, могло бы. И в каких-то случаях, и MySql и MSSQL "умеют")

Мой глаз, например, плохо смотрит на (table.column + 0 ) как на логичесское выражение.
В простых случаях в общем, норм.
В сложных - может оказаться сложно определить глазом и границу и интерпретацию такого выражения.

По первой части:
Да.
Но собственно предикатом (фильтра, соединения, или послефильта (Having) является их полное содержимое.

Например, пусть фильтрующий предикат такой:
Where
(expr_1 And expr_2)
Or (expr_3 And expr_4)
-----
здесь пока 3 предикатных символа (они же связки) - два And и один OR, служат для соединения нескольких частных предикатов в один общий.

Тoгда, в одних интерпретациях каждое из expr. должно быть опознаваемо как самостоятельный предикат, который, где-то в своих нутрях, в конце концов,
кроме логических связок содержит "реляционные операторы" (>, <, IN, Between ,= !=, All, Any. )
а другие реализации позволяют любому из expr_. быть произвольным выражением, приводимым к логическому виду по правилам конкретной реализации.

Ну и например в Oracle 11.2 вообще никаких "predicate" нет )))

"WHERE condition"
.
Chapter 7, "Conditions"
.
Logical conditions can combine multiple conditions into a single condition.
.

Oracle - изначально Америка. Там ближе Мексика, Колумбия. Натур продукт
"MySQL was created by a Swedish company, MySQL AB" - тут до Амстердама ближе. Похоже чистая химия

Читайте также: