Предикат sql что это
Иллюстрированный самоучитель по 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. Однако такая интерпретация, по всей вероятности, – не то, что вам нужно.
Предикаты в SQL
Предикат в SQL это:
Содержание
Синопсис
Предикаты используются в условиях поиска предложений WHERE и HAVING в условиях соединения предложений FROM и др. конструкциях, где требуется логическое значение.
Приоритеты
Самые популярные предикаты:
Особенности
Предикаты представляют собой выражения, принимающие значение булевых типов и не определённый тип. Они могут представлять собой как одно выражение, так и любую комбинацию из неограниченного количества выражений, построенную с помощью булевых операторов AND, OR или NOT. Кроме того, в этих комбинациях может использоваться SQL-оператор IS, а также круглые скобки для конкретизации порядка выполнения операций.
Правила комбинирования всех трех истинностных значений легче запомнить, обозначив TRUE как 1, FALSE как 0 и UNKNOWN как 1/2 или 0.5, т.е. половина единицы (где-то между истинным и ложным, т.е. между нулём и единицей).
Предикаты сравнения
Предикат сравнения представляет собой два выражения, соединяемых оператором сравнения. Имеется шесть традиционных операторов сравнения: =, >, =, (!=).
Примеры
Запрос возвращает следующие данные:
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 |
Глава 4. ИСПОЛЬЗОВАНИЕ РЕЛЯЦИОННЫХ
И БУЛЕВЫХ ОПЕРАЦИЙ ДЛЯ СОЗДАНИЯ
БОЛЕЕ СЛОЖНЫХ ПРЕДИКАТОВ
В Главе 3 вы узнали, что предикаты могут оценивать равенство в операции как true/верное или false/неверное. Они могут также оценивать другие виды связей, помимо равенств.
Эта глава будет исследовать другие реляционные операции, используемые в SQL. Вы также узнаете, как использовать булевы операции, чтобы изменять и объединять значения предиката. С помощью булевых операций (или, проще говоря, логических операций) одиночный предикат может содержать любое число условий. Это позволяет создавать очень сложные предикаты. Использование круглых скобок в структуре этих сложных предикатов будет также разъясняться.
РЕЛЯЦИОННЫЕ ОПЕРАЦИИ
= Равно > Больше Меньше >= Больше или равно Меньше или равно <> Не равно
Эти операции имеют стандартное значение для чисел. Для символов их определение зависит от формата преобразования, ASCII или EBCDIC, который вы используете.
SQL сравнивает символьные значения в терминах основных чисел, как определено в формате преобразования. Даже значение символа, такого как «1», который представляет число, не обязательно равняется числу, которое он представляет. Вы можете использовать реляционные операции, чтобы установить алфавитный порядок, например, «a» 200 тоже? Как уже было сказано, правильный ответ будет прежним: SQL может применять NOT с булевым выражением, которое идёт только сразу после него. Вы можете получить другой результат при команде:
Здесь SQL понимает круглые скобки как означающие, что всё внутри них будет вычисляться в первую очередь и обрабатываться как единое выражение с помощью всего, что снаружи них (это является стандартной интерпретацией, как в математике). Другими словами, SQL берет каждую строку и определяет, соответствует ли истине равенство city = ‘San Jose’ или равенство rating > 200.
Если любое условие верно, булево выражение внутри круглых скобок верно. Однако, если булево выражение внутри круглых скобок верно, предикат как единое целое неверен, потому что NOT преобразует верно в неверно и наоборот.
Вывод для этого запроса показан на Рисунке 4.5. Имеется намеренно усложнённый пример. Сможете ли вы проследить его логику (вывод показан на Рисунке 4.6)?
Несмотря на то что булевы операции по отдельности просты, они не так просты, когда комбинируются в комплексное выражение.
Способ оценки булева комплекса состоит в том, чтобы оценивать булевы выражения, наиболее глубоко вложенные в круглых скобках, объединять их в единое булево значение, а затем объединять его с вышележащими значениями.
Вот подробное объяснение того, как пример выше был вычислен. Наиболее глубоко вложенные булевы выражения, в предикате это odate = 10/03/1990 и snum > 1002, объединяются с помощью AND, формируя одно булево выражение, которое будет оценено как верное для всех строк, в которых встретились оба эти условия. Это составное булево выражение (которое мы будем называть булево номер 1, или B1, для краткости) объединяется с выражением (amt) > 2000.00 (B2) с помощью OR, формируя третье выражение (B3), которое является верным для данной строки, если или B1 или B2 верны для этой строки.
B3 полностью содержится в круглых скобках, которым предшествует NOT, формируя последнее булево выражение (B4), которое является условием предиката.
Из оставшихся, строки, которые на 3 октября имеют snum > 1002 (такие как строки для onum 3001 на 3 октября с snum = 1007), делают B1 верным с помощью верного B3 и неверного предиката запроса. Они будут также удалены из вывода. Вывод показан для строк, которые оставлены.
РЕЗЮМЕ
В этой главе вы значительно расширили ваше знакомство с предикатами. Теперь вы можете находить значения, которые связаны с данным значением любым способом, определяемым различными реляционными операциями.
Вы можете также использовать булевы операции AND и OR, чтобы несколько условий, каждое из которых автономно в предикатах, объединять в единый предикат.
Булева операция NOT, как вы уже видели, может изменять значение условия или группы условий на противоположное.
Булевы и Реляционные операции могут эффективно управляться с помощью круглых скобок, которые определяют порядок, в котором операции будут выполнены. Эти операции применимы к любому уровню сложности, и вы поняли, как сложные условия могут создаваться из этих простых частей.
Теперь, когда мы показали, как используются стандартные математические операции, мы можем перейти к операциям которые являются специфичными для SQL. Это мы сделаем в Главе 5.
Образовательный блог — всё для учебы
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’)
Предикаты I стр. 3
Предикат в предложении WHERE выполняет реляционную операцию ограничения, т.е. строки, появляющиеся на выходе предложения FROM ограничиваются теми, для которых предикат дает значение TRUE.
Если cond1 и cond2 являются простыми условиями, то ограничение по предикату
эквивалентно пересечению ограничений по каждому из предикатов.
Ограничение по предикату
эквивалентно объединению ограничений по каждому из предикатов, а ограничение по предикату
Обратимся к примерам.
Получить информацию о моделях ПК производителя A.
cond1 AND cond2
Пересечение
Получить информацию о моделях производителей A и B.
cond1 OR cond2
Объединение
В свою очередь, условия condX могут не быть простыми. Например,
Получить информацию о моделях ПК производителей A и B.
Найти модели, которые не являются ПК
NOT cond1
Разность
Несколько слов о производительности
Если на столбцах, по которым выполняется ограничение нет индексов, при выполнении запроса будет выполнено сканирование таблицы. В первых вариантах решений такое сканирование будет выполнено один раз, в то время как в решениях на основе объединения, пересечения и разности запросов таблица сканируется дважды, плюс будет выполнена операция, сравнивающая наборы строк, возвращаемые каждым из запросов (например, Nested Loops). Это делает запрос менее производительным, хотя, возможно, существуют оптимизаторы, способные построить один и тот же план в двух сравниваемых нами случаях.