Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 Строгая SQL-терминология. Предикат.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
Чёта озаботился.

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

То есть выражение, полное множество возможных значений которого ограничивается списком "True, False, Unknown".

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

Вопрос 1.

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

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

Вопрос 2.

Выражение вообще - может вернуть результат, выходящий за рамки списка возможных значений предиката. Однако если выражение используется в контексте, где требуется предикат, и диалект позволяет, то выполняется либо явное приведение полученного значения к истинностному типу (например, CAST({expression} AS BOOLEAN)), либо прямая интерпретация его как значения истинностного типа (скажем, в том же MySQL - любое ненулевое число/дата или непустая строка интерпретируются как True, а ноль и пустая строка как False).

Означает ли это, что трактовка выражения как предиката зависит не только от собственно выражения, но и от его контекста?
18 ноя 20, 12:02    [22234463]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
tchingiz
Member

Откуда:
Сообщений: 38159
Akina,

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

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


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


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

Сообщение было отредактировано: 18 ноя 20, 12:31
18 ноя 20, 12:31    [22234490]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775
Akina
дальше - предикатами везде начинают называть не ВЫРАЖЕНИЯ, а ОПЕРАТОРЫ.

Нет. Не сами операторы, а их результаты. То есть оператор и его операнды складываются в предикат.

Akina
Означает ли это, что трактовка выражения как предиката зависит не только от собственно выражения, но и от его контекста?

Нет. От контекста зависит способ получения предиката: явный или неявный.
18 ноя 20, 14:43    [22234621]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
tchingiz
a < 2 -- это предикат. а символ '<' - это символ оператора сравнения 'меньше чем'.
Dimitry Sibiryakov
Нет. Не сами операторы, а их результаты. То есть оператор и его операнды складываются в предикат.
С этим вроде понятно. Просто языковая вольность - говорят "предикат Х" там, где надо сказать "предикат, использующий оператор Х".

tchingiz
от контекста ничего не зависит.
Dimitry Sibiryakov
От контекста зависит способ получения предиката: явный или неявный.

Эмм... а вот не понял. Есть вот в MySQL конструкция (table.column > 0). Можно ли, не глядя на то, что вокруг неё, сказать "это - предикат"? И то же для конструкции (table.column + 0).

В контексте - понятно, что вот тут это предикаты:
-- проверка числового поля на положительность
SELECT * FROM table WHERE (table.column > 0);
-- проверка, что строковое поле начинается с ненулевого числа
SELECT * FROM table WHERE (table.column + 0);

а вот это - нет
-- подсчёт ненулевых значений
SELECT SUM(table.column > 0) FROM table;
-- суммирование числовых префиксов строк
SELECT SUM(table.column + 0) FROM table;


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

Сообщение было отредактировано: 18 ноя 20, 14:57
18 ноя 20, 14:58    [22234639]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
Akina

-- проверка, что строковое поле начинается с ненулевого числа
SELECT * FROM table WHERE (table.column + 0);


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


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

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

p.s. одного филосовского образования для ответа на данные вопросы может не хватить, к тому же, это не модно. Надо сразу на 2-а высших закладываться: и по философии и по теологии
18 ноя 20, 15:23    [22234661]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
booby
Member

Откуда:
Сообщений: 2254
Akina,

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

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

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

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

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

Т.е. понятие "контекста" здесь полностью определяется правилами, используемыми в конкретной реализации sql для
определения того, может конкретное выражение использоваться в качестве предиката, или нет.
18 ноя 20, 15:27    [22234666]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Akina
Эмм... а вот не понял. Есть вот в MySQL конструкция (table.column > 0). Можно ли, не глядя на то, что вокруг неё, сказать "это - предикат"? И то же для конструкции (table.column + 0).
...

ИМХО теория тут ни при чем, просто авторы MySQL перестарались в попытке упростить синтаксис и смешали в кучу все что можно и не нужно.
18 ноя 20, 15:31    [22234673]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
booby,

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

Без диплома PhD тут не обойтись )))
18 ноя 20, 15:36    [22234676]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
Leonid Kudryavtsev
Вопрос к авторам MySQL. Т.к. (table.column + 0) явно не "ограничивается списком "True, False, Unknown"."

А вот опять упираемся в контекст. Значение этого выражения в этом месте, требующем предиката, будет неявно приведено к булеву типу.

С другой стороны, в запросе SELECT * FROM table WHERE {нечто}; это самое {нечто} - гарантированно и без вариантов предикат, верно?

+ semi-offtop
Dima T
просто авторы MySQL перестарались в попытке упростить синтаксис и смешали в кучу все что можно и не нужно.
А какая DBMS не грешит своими, персональными, расширениями стандарта, а? все хороши, уж коли на то, одни больше, другие меньше, но все... другое дело, что MySQL в этом вопросе несомненно в числе лидеров - ну так потому он и популярен у, скажем так, низкоквалифицированных SQL-программистов. Причём обрати внимание - Оракл, прикупивший сию DBMS, не сказать чтобы очень рвётся причесать её под стандарт и выпилить все расширения.


Сообщение было отредактировано: 18 ноя 20, 15:44
18 ноя 20, 15:49    [22234691]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Leonid Kudryavtsev
booby,

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

И как туда вписывается значение Unknown
18 ноя 20, 15:50    [22234696]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
booby
Member

Откуда:
Сообщений: 2254
Akina,

для конструкции
Where (table.column > 0)

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

А конструкция
Where (table.column + 0)

не во всякой реализации может быть интерпретирована как предикат.
Oracle database, например, ее забракует.
С его точки зрения, это выражение вообще не содержит никакого предикатного символа.
18 ноя 20, 15:51    [22234698]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
booby, то есть, понятие предиката, или по крайней мере "предикатость" некоей конкретной конструкции - контекстнозависимо.

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

Сообщение было отредактировано: 18 ноя 20, 15:49
18 ноя 20, 15:53    [22234699]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
booby
Member

Откуда:
Сообщений: 2254
Dima T
Leonid Kudryavtsev
booby,

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

И как туда вписывается значение Unknown


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

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

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

Сообщение было отредактировано: 18 ноя 20, 15:57
18 ноя 20, 15:56    [22234703]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
booby
Member

Откуда:
Сообщений: 2254
Akina
booby, то есть, понятие предиката, или по крайней мере "предикатость" некоей конкретной конструкции - контекстнозависимо.

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

слова людские перегружены.
Вот сферический конь - кто его видел?
Зато все о нём знают.

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


Akina

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


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

Не все, что на взгляд привыкшего считать логическим выражением (table.column + 0) в одной реализации,
является таковым или приводится к нему в другой.
18 ноя 20, 16:02    [22234708]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Как понимаю чтобы предикат стал предикатом мало того чтобы он содержал какие-то формальные символы, но еще надо чтобы он находился в том месте запроса где ожидается предикат, например во WHERE или HAVING.

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

Сообщение было отредактировано: 18 ноя 20, 16:03
18 ноя 20, 16:08    [22234716]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Akina
С другой стороны, в запросе SELECT * FROM table WHERE {нечто}; это самое {нечто} - гарантированно и без вариантов предикат, верно?

Верно, а также {нечто} может состоять из нескольких других предикатов
18 ноя 20, 16:21    [22234723]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
booby
Member

Откуда:
Сообщений: 2254
Dima T
Как понимаю чтобы предикат стал предикатом мало того чтобы он содержал какие-то формальные символы, но еще надо чтобы он находился в том месте запроса где ожидается предикат, например во WHERE или HAVING.

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

если совсем коротко -то , в общем, оба раза да.

в части трактования второй части высказывания дело можно представить как приведение значения выражения к логическому значению.
Мне, например, это, в целом больше не нравится, чем могло бы быть удбно.
(Правда, могло бы. И в каких-то случаях, и 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_... быть произвольным выражением, приводимым к логическому виду по правилам конкретной реализации.

Сообщение было отредактировано: 18 ноя 20, 16:22
18 ноя 20, 16:23    [22234726]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
booby, сложно как-то (((

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

В документации Oracle как-то проще:
https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10002.htm

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

а предикатов никаких вообще нету ))) по крайне мере по Ctrl-F не находятся
18 ноя 20, 16:36    [22234741]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Dima T
Member

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

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

MSSQL в таких гадостях не замечен, а MySql неприятно удивил. Не стал копаться в документации, позапускал разные запросы, походу там true реализовано по принципу != 0 как в С/С++, т.е. "where numeric_field" равносильно "where numeric_field != 0", а со строками вообще жесть - похоже они конвертируются в число, у меня из таблицы пользователей "where login" выбрало все логины начинающиеся с цифр.
18 ноя 20, 16:39    [22234748]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
Leonid Kudryavtsev, да Оракл вообще на своей волне, походу...

Conditional Predicates for Detecting Triggering DML Statement
18 ноя 20, 16:45    [22234754]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9249
У них просто поставщики разные.

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

p.s.
без трех высших:
философия, теология (настаиваю!) и фармацевтика - в вопросе subj не разберешся )))
18 ноя 20, 16:48    [22234759]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20765
Dima T
а со строками вообще жесть - похоже они конвертируются в число
У MySQL есть правила неявного приведения типов.
Но в данном случае - у условия numeric-контекст, вот оно и приводится к числу.
18 ноя 20, 16:49    [22234760]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Akina
Leonid Kudryavtsev, да Оракл вообще на своей волне, походу...

Conditional Predicates for Detecting Triggering DML Statement

не, там стандартный CASE WHEN {предикат} THEN

MSSQL тоже зовет условие поиска (search_condition), а не предикат.

Это же тупые студенты могут прочитать, надо писать как можно понятней ))
18 ноя 20, 16:51    [22234762]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
tchingiz
Member

Откуда:
Сообщений: 38159
о, как все хорошо,
главное - друг друга не обсуждайте
:))
18 ноя 20, 17:51    [22234811]     Ответить | Цитировать Сообщить модератору
 Re: Строгая SQL-терминология. Предикат.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775
Akina
Можно ли, не глядя на то, что вокруг неё, сказать "это - предикат"?

Ты сам себя загнал в угол, ограничив своё определение предиката булевскими предикатами. А смотреть надо не "вокруг неё" а в документацию MySQL на предмет неявного преобразования других типов в булев.
19 ноя 20, 15:00    [22235401]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить