Опубликован: 10.10.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 4:

Предикаты раздела WHERE оператора SELECT

Аннотация: В этой лекции мы продолжим рассматривать механизм выборки данных языка SQL - оператора SELECT. Лекция целиком посвящена видам условных выражений, которые могут содержаться в разделе WHERE оператора выборки. Определяются и иллюстрируются на примерах запросов все виды предикатов, специфицированных в стандарте SQL:1999.
Ключевые слова: SQL, предикат, стандарт SQL:1999, логическое выражение раздела WHERE, предикат сравнения, тип мультимножества, Дополнение, значение, Мультимножество, member, конструктор типа мультимножества, стандарт SQL:2003, тип коллекции, конструктор типа, булевское выражение, использование базы данных, EMP, PRO, interval, CLOB, первичный ключ, внешний ключ, менеджер проекта, менеджер, алгебра, сравнение символьных строк, набор символов (regular character set), сравнение битовых строк, сравнение значений типа дата-время, no-op, тип дата/время, сравнение значений анонимного строкового типа, спецификация DISTINCT, SQL-запрос, подзапрос, корреляционный подзапрос, реализация языка, таблица разделов, строка данных, реляционная алгебра, полусоединение, декартово произведение, имя таблицы, эквисоединение, скалярное выражение, эквивалентное выражение, предикат between, агрегатные функции, AVG, псевдоним, предикат null, семантика предиката null, предикат in, distinction, предикат like, тип символьной строки, BLOB, vary, символьная строка, раздел ESCAPE, октет, код символа, escape, предикат similar, регулярные выражения предиката similar, регулярное выражение, метасимволы, BNF, терминальный символ, digitize, идентификатор набора символов (regular charset id), символ алфавита, UPPER, верхняя граница, ing, функция SUBSTRING ... SIMILAR ... ESCAPE, предикат exists, UNIQUE, совместимость типов, вычисление выражения, табличный подзапрос, Типы данных столбцов, тип сопоставления SIMPLE, matching, избыточность, SQL/92, запрос, вероятность

Введение

Конструкции оператора SELECT языка SQL в значительной степени ортогональны. В частности, выбор способа указания ссылки на таблицы в разделе FROM никак не влияет на выбор варианта формирования условия выборки в разделе WHERE. Это полезное свойство языка позволяет нам абстрагироваться от обсуждавшегося в предыдущей лекции многообразия способов указания ссылки на таблицу и сосредоточиться на возможностях формирования запросов при использовании различных предикатов, допускаемых стандартом SQL:1999 в логических выражениях раздела WHERE.

В стандарте SQL:1999 специфицированы 12 разновидностей предикатов, причем некоторые из них в действительности представляют собой семейства (например, под общим названием предиката сравнения скрываются шесть видов предикатов ). Набор допустимых предикатов в SQL явно избыточен, но тем не менее в языке SQL имеется явная тенденция расширения этого набора. В частности, в SQL:2003 в связи с введением генератора типов мультимножеств в дополнение ко всем разновидностям предикатов SQL:1999 появилось три новых вида предикатов: предикаты для проверки того, что заданное значение является элементом мультимножества ( MEMBER ); что одно мультимножество входит в другое мультимножество ( SUBMULTISET ) и что мультимножество не содержит дубликаты ( IS A SET ). В этом курсе мы не приводим подробного описания этих видов предикатов по нескольким причинам:

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

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

Логические выражения раздела WHERE

Синтаксически логическое выражение раздела WHERE определяется как булевское выражение ( boolean_value_expression ), правила построения которого обсуждались в предыдущей лекции. Основой логического выражения являются предикаты. Предикат позволяет специфицировать условие, результатом вычисления которого может быть true, false или unknown. В языке SQL:1999 допустимы следующие предикаты: 1Мы не обсуждаем в этом курсе предикаты, основанные на использовании выражений типа мультимножества, которые были введены в стандарте SQL:2003.

predicate ::= comparison_predicate
    | between_predicate
    | null_predicate 
    | in_predicate 
    | like_predicate
    | similar_predicate
    | exists_predicate 
    | unique_predicate 
    | overlaps_predicate 
    | quantified_comparison_predicate 
    | match_predicate 
    | distinct_predicate

Далее мы будем последовательно обсуждать разные виды предикатов и приводить примеры запросов с использованием базы данных СЛУЖАЩИЕ-ОТДЕЛЫ-ПРОЕКТЫ, определения таблиц которой на языке SQL были приведены в лекции 2. Для удобства повторим здесь структуру таблиц.

EMP:
EMP_NO : EMP_NO
EMP_NAME : VARCHAR
EMP_BDATE : DATE
EMP_SAL : SALARY
DEPT_NO : DEPT_NO
PRO_NO : PRO_NO
DEPT:
DEPT_NO : DEPT_NO
DEPT_NAME : VARCHAR
DEPT_EMP_NO : INTEGER
DEPT_TOTAL_SAL : SALARY
DEPT_MNG : EMP_NO
PRO:
PRO_NO : PRO_NO
PRO_TITLE : VARCHAR
PRO_SDATE : DATEP
PRO_DURAT : INTERVAL
PRO_MNG : EMP_NO
PRO_DESC : CLOB

Столбцы EMP_NO, DEPT_NO и PRO_NO являются первичными ключами таблиц EMP, DEPT и PRO соответственно. Столбцы DEPT_NO и PRO_NO таблицы EMP являются внешними ключами, ссылающимися на таблицы DEPT и PRO соответственно ( DEPT_NO указывает на отделы, в которых работают служащие, а PRO_NO - на проекты, в которых они участвуют; оба столбца могут принимать неопределенные значения). Столбец DEPT_MNG является внешним ключом таблицы DEPT ( DEPT_MNG указывает на служащих, которые исполняют обязанности руководителей отделов; у отдела может не быть руководителя, и один служащий не может быть руководителем двух или более отделов). Столбец PRO_MNG является внешним ключом таблицы PRO ( PRO_MNG указывает на служащих, которые являются менеджерами проектов, у проекта всегда есть менеджер, и один служащий не может быть менеджером двух или более проектов).

Алексей Ковтун
Алексей Ковтун

При попытке исполнения запроса:

CREATE DOMAIN EMP_NO AS INTEGER

    CHECK (VALUE BETWEEN 1 AND 10000);

Выдается ошибка: Неизвестный тип объекта "DOMAIN" в интсрукции CREATE, DROP или ALTER. 

Используется SQL Server MS SQL 2008R2

Александра Каева
Александра Каева