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

Предикаты в SQL

Предикат в SQL это:

Содержание

Синопсис

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

Приоритеты

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

Особенности

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

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

Предикаты сравнения

Предикат сравнения представляет собой два выражения, соединяемых оператором сравнения. Имеется шесть традиционных операторов сравнения: =, >, =, (!=).

Примеры

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

codemodelspeedramhdcdprice
1123250064512x600.0
3123350064512x600.0
71232500321012x400.0
101260500321012x350.0

Источник

Иллюстрированный самоучитель по SQL для начинающих

Компоненты SQL

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

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

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

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

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

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

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

Предикаты

Предикаты – это используемые в 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). Это объясняется тем, что SOPHOMORE считается больше, чем SENIOR, потому что в последовательности сопоставления, установленной по умолчанию (т.е. когда сортировка выполняется по алфавиту), SO следует после SE. Однако такая интерпретация, по всей вероятности, – не то, что вам нужно
.

Источник

Образовательный блог — всё для учебы

1) Сравнения (отношения)
[NOT] <=|>| =| >|( )

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

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

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

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

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

SELECT * FROM SalesPeople WHERE City IN (‘Barcelona’, ’London’)
SELECT * FROM SalesPeople WHERE SNum NOT IN (1001, 1007, 1004)
SELECT * FROM SalesPeople WHERE (SNum, SName) IN ((1001, ‘Peel’), (1002, ‘Serres’))

3) Принадлежности диапазону
[NOT] BETWEEN AND
• — определяет нижнюю границу диапазона
• — определяет верхнюю границу диапазона
• Предикат BETWEEN сходен с предикатом IN, но вместо элементов множества он задает включающие границы, в которые [не] должно попадать проверяемое значение.

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

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
Проверяются пропущенные (отсутствующие) значения в колонке таблицы.

Примеры на предикат проверки 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’)

Источник

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

Хотя на вид (на примерах) выражения запросов SQL/92 очень напоминают соответствующие конструкции SQL/89, на самом деле они гораздо мощнее. Для того, чтобы можно было лучше понять существо выражений запросов SQL/92, мы начнем с рассмотрения вспомогательных конструкций. Заметим, что синтаксические определения часто носят рекурсивный характер, но это «хорошая» рекурсия, потому что в конечном счете любой запрос опирается на именованные базовые или представляемые таблицы.

Итак, сначала введем некоторые начальные понятия, связанные с запросами. Наверное, наиболее важным из таких понятий в SQL/92 является ссылка на таблицу (tablereference), которая может встречаться во всех конструкциях, адресуемых к таблицам. Ссылка на таблицу определяется следующими синтаксическими правилами:

Пояснения: Как видно, в отличие от SQL/89, где ссылка на таблицу всегда задается ее именем, в SQL/92 возможны еще два варианта: задать таблицу запросом в традиционной форме или выражением с использованием операторов соединения. Как выглядят эти два варианта, мы увидим в следующих подразделах.

Заметим, что значение элемента по умолчанию можно использовать только в том случае, когда конструктор значения-строки используется в операторе INSERT (тогда этим значением будет значение по умолчанию соответствующего столбца).

Конструктор значения-таблицы производит таблицу на основе заданного набора конструкторов значений-строк:

Пояснение: Конечно, для того, чтобы корректно построить таблицу, требуется, чтобы строки, производимые всеми конструкторами строк, были одной и той же степени и чтобы типы (или домены) соответствующих столбцов совпадали.

3.3.1. Табличные выражения

Как и в SQL/89, табличное выражение SQL/92 в качестве результата выдает обычную или сгруппированную таблицу:

Все отличия от SQL/89 сосредоточены в разделах табличного выражения.

Формально синтаксис остался таким же, как и в SQL/89:

Но вспомним, что такое ссылка на таблицу в SQL/92 (см. выше). Реально можно весь запрос сосредоточить в разделе FROM.

Снова синтаксис формально не изменился:

Но существенно расширен набор допустимых предикатов (см. следующий раздел).

Разделы GROUPBY и HAVING остались такими же, как в SQL/89, если не считать расширения набора предикатов, которые можно использовать в условии HAVING.

Опять же на вид это очень похоже на соответствующую конструкцию SQL/89, но нужно иметь в виду, что, во-первых, в основе спецификации запроса SQL/92 лежит существенно расширенная конструкция табличного выражения, а во-вторых, в спецификации присутствует необязательный раздел AS, позволяющий присвоить имена таблице, которая генерируется при выполнении запроса. Эта возможность кажется на первый взгляд мелочью, но именно она позволяет использовать порождаемые таблицы в разделе FROM и отказаться от использования номеров столбцов порождаемой таблицы в разделе ORDERBY выражения запросов (см. ниже).

3.3.2. Соединенные таблицы

В стандарте SQL/92 специфицированы три вида подзапросов: скалярный, строчный и табличный. Скалярный подзапрос выдает одно значение некоторого типа; строчный подзапрос выдает одну строку; табличный подзапрос выдает таблицу. В основе каждого вида подзапроса лежит табличное выражение. Синтаксически соответствующие конструкции определяются следующими правилами:

Теперь мы в состоянии привести синтаксические определения и соответствующие пояснения по поводу выражения запросов:

3.4. Допустимые предикаты и условия поиска

Внешне предикаты, которые можно использовать в условиях поиска SQL/92, очень похожи на предикаты SQL/89. Но, во-первых, ассортимент допустимых предикатов расширен, а во-вторых, возможности задания условий «старых» предикатов стали существенно шире. Поэтому мы перечислим все возможные предикаты с приведением их синтаксиса и кратких пояснений. В конце раздела будут приведены правила формулировки и семантика условий поиска.

Предикат позволяет специфицировать условие, результатом вычисления которого может быть true, false или unknown. В языке SQL/92 допустимы следующие предикаты:

3.4.1. Предикат сравнения

В SQL/92 этот предикат предназначен для спецификации сравнения двух строчных значений. Синтаксис предиката следующий:

3.4.2. Предикат between

Как и в SQL/89, предикат позволяет специфицировать условие вхождения в диапазон значений, но в SQL/92 операндами являются строки:

Формально предикат определяется следующими синтаксическими правилами:

Пояснения: Если не считать того, что в соответствующем условии можно использовать выражения, вырабатывающие значения типа символьных строк, и того, что для используемого набора символов может быть явно задан порядок сортировки, смысл предиката LIKE в SQL/92 не изменился по сравнению с SQL/89.

Как и в SQL/89, предикат null позволяет проверить, не является ли значение неопределенным, но теперь в нем можно использовать операнд-строку:

Замечание: для всех R условие «RISNOTNULL» имеет то же значение, что условие «NOTRISNULL» в том и только в том случае, когда степень R равна 1. Полная семантика предиката null приведена в следующей таблице:

УсловиеRISNULLRISNOTNULLNOTRISNULLNOTRISNOTNULL
Степень 1: nulltruefalsefalsetrue
Степень 1: notnullfalsetruetruefalse
Степень > 1: все nulltruefalsefalsetrue
degree > 1: есть nullfalsefalsetruetrue
degree > 1: нет nullfalsetruetruefalse

3.4.6. Предикат сравнения с квантором

Этот предикат позволяет специфицировать квантифицированное сравнение строчного значения и определяется следующими синтаксическими правилами:

3.4.7. Предикат exists

Этот предикат имеет тот же смысл, что и соответствующий предикат языка SQL/89, но теперь его операндом может быть табличный подзапрос:

3.4.8. Предикат unique

Этот предикат позволяет сформулировать условие отсутствия дубликатов в результате запроса:

Пояснение: результат вычисления условия UNIQUE есть true, если в таблице-результате вычисления табличного подзапроса нет таких двух строк, что значение каждого столбца одной строки не является неопределенным и равным значению соответствующего столбца второй строки; в противном случае значение условия есть false.

3.4.9. Предикат match

Предикат позволяет сформулировать условие соответствия строчного значения результату табличного подзапроса. Синтаксис определяется следующим правилом:

3.4.10. Предикат overlaps

Этот предикат служит для проверки перекрытия во времени двух событий. Условие определяется следующим синтаксисом:

Источник

Предикаты I стр. 3

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

Если cond1 и cond2 являются простыми условиями, то ограничение по предикату

эквивалентно пересечению ограничений по каждому из предикатов.

Ограничение по предикату

эквивалентно объединению ограничений по каждому из предикатов, а ограничение по предикату

Обратимся к примерам.

Получить информацию о моделях ПК производителя A.

cond1 AND cond2

Пересечение

Получить информацию о моделях производителей A и B.

cond1 OR cond2

Объединение

В свою очередь, условия condX могут не быть простыми. Например,

Получить информацию о моделях ПК производителей A и B.

Найти модели, которые не являются ПК

NOT cond1

Разность

Несколько слов о производительности

Если на столбцах, по которым выполняется ограничение нет индексов, при выполнении запроса будет выполнено сканирование таблицы. В первых вариантах решений такое сканирование будет выполнено один раз, в то время как в решениях на основе объединения, пересечения и разности запросов таблица сканируется дважды, плюс будет выполнена операция, сравнивающая наборы строк, возвращаемые каждым из запросов (например, Nested Loops). Это делает запрос менее производительным, хотя, возможно, существуют оптимизаторы, способные построить один и тот же план в двух сравниваемых нами случаях.

Источник

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

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