Sql

Предикаты sql: Предикаты — SQL Server | Microsoft Learn

Предикаты SQL AND и OR: примеры, синтаксис

Операторы SQL AND и SQL OR — предикаты языка SQL, служащие для создания логических выражений. В SQL предикатами называются операторы, возвращающие значения TRUE или FALSE. Предикат SQL AND — эквивалент логического умножения (конъюнкции), предикат SQL OR — эквивалент логического сложения (дизъюнкции).

Таблица истинности для предикатов следующая:

first_expressionlast_expressionANDOR
TRUETRUETRUETRUE
TRUEFALSEFALSETRUE
FALSETRUEFALSETRUE
FALSEFALSEFALSEFALSE

Это значит, что, для выполнения условия предиката SQL AND должны быть выполнены оба условия. Для выполнения предиката SQL OR должно быть выполнено хотя бы одно условие.

Предикат SQL AND имеет следующий синтаксис:

boolean_expression AND boolean_expression

Предикат SQL OR имеет следующий синтаксис:

boolean_expression OR boolean_expression

Примеры оператора SQL AND & ORИмеется следующая таблица Planets:

IDPlanetNameRadiusSunSeasonOpeningYearHavingRingsOpener
1Mars33966871659NoChristiaan Huygens
2Saturn6026810759. 22Yes
3Neptune24764601901846YesJohn Couch Adams
4Mercury2439115.881631NoNicolaus Copernicus
5Venus60512431610NoGalileo Galilei

Пример 1. Используя операторы SQL AND и SQL OR вывести записи планет, у которых радиус планеты меньше 10000 и открытых (OpeningYear) после 1620:

SELECT *
FROM Planets
WHERE Radius < 10000 AND OpeningYear > 1620

Результат:

ID
PlanetName
RadiusSunSeasonOpeningYearHavingRingsOpener
1Mars33966871659NoChristiaan Huygens
4Mercury2439115. 881631NoNicolaus Copernicus

Пример 2. Используя операторы SQL AND и SQL OR вывести записи планет, названия которых начинаются с буквы «N» или заканчиваются на букву «s» и не имеющие колец:

SELECT *
FROM Planets
WHERE (PlanetName LIKE 'N%'
OR PlanetName LIKE '%s')
AND HavingRings = 'No'

Результат:

IDPlanetName
RadiusSunSeasonOpeningYearHavingRingsOpener
1Mars33966871659NoChristiaan Huygens
5Venus60512431610NoGalileo Galilei

В этом примере используются как предикат SQL AND так и SQL OR. Конечно же, в запросах  их можно использовать сколько угодно раз (так же как и скобки, которые их ограничивают), для задания более точного условия выборки.

PostgreSQL : Документация: 9.6: 9.2. Функции и операторы сравнения : Компания Postgres Professional

Набор операторов сравнения включает обычные операторы, перечисленные в Таблице 9.1.

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

ОператорОписание
<меньше
>больше
<=меньше или равно
>=больше или равно
=равно
<> или !=не равно

Примечание

Оператор != преобразуется в <> на стадии разбора запроса.

Как следствие, реализовать операторы != и <> по-разному невозможно.

Операторы сравнения определены для всех типов данных, для которых они имеют смысл. Все операторы сравнения представляют собой бинарные операторы, возвращающие значения типа boolean; при этом выражения вида 1 < 2 < 3 недопустимы (так как не существует оператора <, который бы сравнивал булево значение с 3).

Существует также несколько предикатов сравнения; они приведены в Таблице 9.2. Они работают подобно операторам, но имеют особый синтаксис, установленный стандартом SQL.

Таблица 9.2. Предикаты сравнения

ПредикатОписание
a BETWEEN x AND y
между
a NOT BETWEEN x AND yне между
a BETWEEN SYMMETRIC x AND yмежду, после сортировки сравниваемых значений
a NOT BETWEEN SYMMETRIC x AND yне между, после сортировки сравниваемых значений
a IS DISTINCT FROM bне равно, при этом NULL воспринимается как обычное значение
a IS NOT DISTINCT FROM bравно, при этом NULL воспринимается как обычное значение
выражение IS NULLэквивалентно NULL
выражение IS NOT NULL
не эквивалентно NULL
выражение ISNULLэквивалентно NULL (нестандартный синтаксис)
выражение NOTNULLне эквивалентно NULL (нестандартный синтаксис)
логическое_выражение IS TRUEистина
логическое_выражение IS NOT TRUEложь или неопределённость
логическое_выражение IS FALSEложь
логическое_выражение IS NOT FALSEистина или неопределённость
логическое_выражение IS UNKNOWNнеопределённость
логическое_выражение IS NOT UNKNOWNистина или ложь

Предикат BETWEEN упрощает проверки интервала:

a BETWEEN x AND y

равнозначно выражению

a >= x AND a <= y

Заметьте, что BETWEEN считает, что границы интервала также включаются в интервал. NOT BETWEEN выполняет противоположное сравнение:

a NOT BETWEEN x AND y

равнозначно выражению

a < x OR a > y

Предикат BETWEEN SYMMETRIC аналогичен BETWEEN, за исключением того, что аргумент слева от

AND не обязательно должен быть меньше или равен аргументу справа. Если это не так, аргументы автоматически меняются местами, так что всегда подразумевается непустой интервал.

Обычные операторы сравнения выдают NULL (что означает «неопределённость»), а не true или false, когда любое из сравниваемых значений NULL. Например, 7 = NULL выдаёт NULL, так же, как и 7 <> NULL. Когда это поведение нежелательно, можно использовать предикаты IS [ NOT ] DISTINCT FROM:

a IS DISTINCT FROM b
a IS NOT DISTINCT FROM b

Для значений не NULL условие IS DISTINCT FROM работает так же, как оператор <>. Однако если оба сравниваемых значения NULL, результат будет false, и только если одно из значений NULL, возвращается true. Аналогично, условие

IS NOT DISTINCT FROM равносильно = для значений не NULL, но возвращает true, если оба сравниваемых значения NULL, и false в противном случае. Таким образом, эти предикаты по сути работают с NULL, как с обычным значением, а не с «неопределённостью».

Для проверки, содержит ли значение NULL или нет, используются предикаты:

выражение IS NULL
выражение IS NOT NULL

или равнозначные (но нестандартные) предикаты:

выражение ISNULL
выражение NOTNULL

Заметьте, что проверка выражение = NULL не будет работать, так как NULL считается не «равным» NULL. (Значение NULL представляет неопределённость, и равны ли две неопределённости, тоже не определено.

)

Подсказка

Некоторые приложения могут ожидать, что выражение = NULL вернёт true, если результатом выражения является NULL. Такие приложения настоятельно рекомендуется исправить и привести в соответствие со стандартом SQL. Однако в случаях, когда это невозможно, это поведение можно изменить с помощью параметра конфигурации transform_null_equals. Когда этот параметр включён, PostgreSQL преобразует условие x = NULL в x IS NULL.

Если выражение возвращает табличную строку, тогда IS NULL будет истинным, когда само выражение — NULL или все поля строки — NULL, а IS NOT NULL будет истинным, когда само выражение не NULL, и все поля строки так же не NULL. Вследствие такого определения, IS NULL и IS NOT NULL не всегда будут возвращать взаимодополняющие результаты для таких выражений; в частности такие выражения со строками, одни поля которых NULL, а другие не NULL, будут ложными одновременно. В некоторых случаях имеет смысл написать строка IS DISTINCT FROM NULL или строка IS NOT DISTINCT FROM NULL, чтобы просто проверить, равно ли NULL всё значение строки, без каких-либо дополнительных проверок полей строки.

Логические значения можно также проверить с помощью предикатов

логическое_выражение IS TRUE
логическое_выражение IS NOT TRUE
логическое_выражение IS FALSE
логическое_выражение IS NOT FALSE
логическое_выражение IS UNKNOWN
логическое_выражение IS NOT UNKNOWN

Они всегда возвращают true или false и никогда NULL, даже если какой-любо операнд — NULL. Они интерпретируют значение NULL как «неопределённость». Заметьте, что IS UNKNOWN и IS NOT UNKNOWN по сути равнозначны IS NULL и IS NOT NULL, соответственно, за исключением того, что выражение может быть только булевого типа.

Также имеется несколько связанных со сравнениями функций; они перечислены в Таблице 9.3.

Таблица 9.3. Функции сравнения

ФункцияОписаниеПримерРезультат примера
num_nonnulls(VARIADIC "any")возвращает число аргументов, отличных от NULLnum_nonnulls(1, NULL, 2)2
num_nulls(VARIADIC "any")возвращает число аргументов NULLnum_nulls(1, NULL, 2)1

Предикаты в SQL

Предикаты в SQL

3 мая 2022 г. by Robert Gravelle

На этой неделе мы ненадолго нажмем кнопку «Пауза» из серии «Некоторые основные ошибки SQL-запросов», чтобы поговорить о предикатах в SQL. Причина в том, что предикаты будут учитываться в части 3 серии «Основные ошибки SQL-запросов».

Предикат — это просто выражение, результатом которого является ИСТИНА, ЛОЖЬ или НЕИЗВЕСТНО. Предикаты обычно используются в условиях поиска предложений WHERE и HAVING, условиях соединения предложений FROM, а также в любой другой части запроса, где требуется логическое значение.

Существует множество типов предикатов, в том числе:

  • Сравнение
  • КАК
  • МЕЖДУ
  • В
  • СУЩЕСТВУЕТ
  • IS NULL (/INTEGER/DECIMAL/FLOAT…)

В оставшейся части этой статьи мы рассмотрим несколько примеров вышеупомянутых типов предикатов.

Каждый раз, когда мы используем оператор сравнения в выражении, таком как WHERE employee_salary > 100000 , мы создаем предикат, который оценивается как ИСТИНА, ЛОЖЬ или НЕИЗВЕСТНО. Операторы сравнения включают:

  • = равно
  • > Больше
  • < Меньше
  • >= Больше или равно
  • <= Меньше или равно
  • <> Не равно

Следовательно, предикат сравнения принимает вид:

выражение_1 оператор сравнения выражение_2
 

В предикате сравнения выражение2 также может быть подзапросом. Если подзапрос не возвращает ни одной строки, предикат сравнения оценивается как FALSE.

В SQL предикатом сопоставления с шаблоном номер один является оператор LIKE, поскольку он сравнивает значения столбца с указанным шаблоном. Like работает с любым символьным или датовым типом данных. Вот пример:

Оператор BETWEEN задает диапазон, который определяет нижнюю и верхнюю границы определяемых значений. Например, в Предикате доход МЕЖДУ 5000 И 20000 выбранные данные представляют собой диапазон больше или равный 5000 и меньше или равный 20000. Оператор Между может использоваться с числовыми, текстовыми типами данных и датами. Вот пример:

Оператор IN позволяет использовать два или более выражений для поиска запроса. Результатом условия является TRUE, если значение соответствующего столбца равно одному из выражений, заданных предикатом IN:

Предикат EXISTS принимает подзапрос в качестве аргумента. Он возвращает TRUE, если подзапрос возвращает одну или несколько строк, и возвращает FALSE, если он возвращает ноль строк.

Вот пример:

Используйте IS NULL, чтобы определить, является ли выражение пустым, потому что вы не можете проверить его с помощью оператора сравнения =. При применении к выражениям значений строк все элементы должны проверяться одинаково.

Предикат IS NULL принимает следующую форму:

ЯВЛЯЕТСЯ [НЕ]НУЛЬНЫМ
 

Например, выражение x IS NULL равно TRUE, если x равно NULL.

IS UNKNOWN является синонимом IS NULL, когда выражение имеет тип BOOLEAN.

Вот запрос, который использует предикат IS NOT NULL для получения всех участников, чья фамилия не равна NULL:

В этом блоге мы прервали регулярно запланированный блог, чтобы показать вам этот важный урок о предикатах SQL. Обычно используемые в условиях поиска предложений WHERE и HAVING, условиях соединения предложений FROM, предикаты — это выражения, которые оцениваются как TRUE, FALSE или UNKNOWN. В следующие недели мы снова увидим предикаты в продолжении серии «Основные ошибки SQL-запросов».

Фильтр-предикаты представляют собой основной риск для производительности Oracle SQL

База данных Oracle использует три различных метода для применения , где предложений (предикатов):

Предикат доступа («доступ»)

Предикаты доступа выражают начало и условия остановки обхода конечного узла.

Предикат индексного фильтра («фильтр» для индексных операций)

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

Предикат фильтра на уровне таблицы («фильтр» для табличных операций)

Предикаты для столбцов, не входящих в индекс, оцениваются на уровне таблицы. Для этого база данных должна сначала загрузить строку из таблицы.

Примечание

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

Планы выполнения, созданные с помощью Утилита DBMS_XPLAN (см. « Получение плана выполнения »), покажите использование индекса в разделе «Информация о предикатах» под табличным планом выполнения:

 --------------- ---------------------------------------
| Идентификатор | Операция | Имя | Ряды | Стоимость |
-------------------------------------------------- ----
| 0 | ВЫБЕРИТЕ ЗАЯВЛЕНИЕ | | 1 | 1445 |
| 1 | СОРТИРОВАТЬ АГРЕГАТ | | 1 | |
|  * 2  | ИНДЕКС ДИАПАЗОН СКАН | SCALE_SLOW | 4485 | 1445 |
-------------------------------------------------- ----
  Информация о предикате (определяется идентификатором операции): 
     2  - доступ ("РАЗДЕЛ" =: A И  "ID2" =: B )
         фильтр("ID2"=:B) 
 

Нумерация информации предиката относится к столбцу «Id» плана выполнения. Там база данных также показывает звездочку, чтобы отметить операции, которые имеют предикатную информацию.

От моего имени: Мое следующее обучение

Мое следующее онлайн-обучение « Анализ и агрегирование » начинается 14 февраля 2023 года. Это обучение сводится к менее известным аспектам предложений GROUP BY и HAVING, а также объясняет оконные функции и пункт OVER с основания. Четыре сессии по два часа каждая — не более четырех участников. Все живо. Подробнее об этом и других тренингах по SQL на сайте winand.at.

Этот пример, взятый из главы «Производительность и масштабируемость», показывает INDEX RANGE SCAN с предикатами доступа и фильтрации. Особенность базы данных Oracle заключается в том, что в качестве предикатов доступа также отображаются некоторые предикаты фильтра, например, ID2=:B в приведенном выше плане выполнения.

Важно

Если условие отображается как предикат фильтра, это предикат фильтра — не имеет значения, отображается ли оно также как предикат доступа.

Это означает, что INDEX RANGE SCAN сканирует весь диапазон на наличие условия "РАЗДЕЛ"=:A и применяет фильтр "ID2"=:B к каждой строке.

Предикаты фильтра на уровне таблицы отображаются для доступа к соответствующей таблице, например, ДОСТУП К ТАБЛИЦЕ ПО ИНДЕКСУ ROWID или ДОСТУП К ТАБЛИЦЕ ПОЛНЫЙ .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *