Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции БД к экзамену_2010.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
458.75 Кб
Скачать

4) Предикаты.

Синтаксис:

[ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]

FROM <исходная таблица>

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

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

<comparison predicate> ::=

<value expression> <comp op>

{<value expression> | <subquery>}

<comp op> ::=

= | <> | < | > | <= | >=

Через "<>" обозначается операция "неравенства". Арифметические выражения левой и правой частей предиката сравнения строятся по общим правилам построения арифметических выражений и могут включать в общем случае имена столбцов таблиц из раздела FROM и константы. Типы данных арифметических выражений должны быть сравнимыми (например, если тип столбца a таблицы A является типом символьных строк, то предикат "a = 5" недопустим).

Предикат all

SELECT ALL ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО FROM Клиенты

Выбираются перечисленные поля из всех записей таблицы Клиенты.

Если предикат не указывается, то предполагается наличие предиката ALL. Предикаты служат для установки дополнительных фильтров после применения критериев директивы WHERE.

Предикат distinct

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

SELECT DISTINCT Клиенты.Фирма

FROM Клиенты, [Заинтересованные лица]

WHERE Клиенты.Фирма = [Заинтересованные лица].Фирма;

Если в этом примере предикат DISTINCT не будет указан, в выборку будут включены названия фирм из всех записей таблицы клиентов, которые упоминаются в таблице заинтересованных лиц. В выборке могут появиться дублирующие записи. Предикат DISTINCT приведет к отбрасыванию дублирующих значений поля “Фирма”.

Предикат distinctrow

Используется, когда следует пропустить данные, представляющие собой полностью дублирующие записи в выборке, но не дублирование значений отдельных полей.

Таблица «Клиенты» не содержит дублирующих кодов клиентов, в то время как таблица «Заказы» может содержать дублирующие коды клиентов, поскольку один клиент может сделать несколько заказов. В приведенном ниже примере показано, как можно использовать предикат DISTINCTROW для того, чтобы составить список фирм, которые сделали хотя бы один заказ, не вдаваясь в подробности о количестве таких заказов:

SELECT DISTINCTROW [Название фирмы]

FROM Клиенты INNER JOIN Заказы

ON Клиенты.[Код клиента] = Заказы.[Код клиента]

ОRDER BY [Название фирмы];

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

Использование DISTINCTROW эквивалентно установке значения ДА для параметра Уникальные записи в окне свойств запроса при проектировании QBE-запросов в режиме конструирования.

Предикат TOP

Используется для включения в выборку определенного числа записей, расположенных в начале или в конце группы записей, отобранных с помощью критерия отбора WHERE и упорядоченных с помощью директивы ORDER BY.

Предположим, мы хотим отобрать 25 лучших студентов выпуска 2007 года:

SELECT TOP 25 [имя],[отчество],[фамилия]

FROM Студенты

WHERE [год выпуска] = 2007

ORDER BY [средний балл] DESC

Если не будет включена директива ORDER BY, то в выборку будут включены любые 25 студентов БД “Студенты”, удовлетворяющие условиям отбора, заданным в директиве WHERE.

Предикат TOP не разделяет записи, имеющие одинаковые значения при упорядочении. В примере, если двадцать пятый студент имеет точно такой же средний балл, как двадцать шестой и двадцать седьмой, то в выборку будут включены 27, а не 25 записей.

Можно также использовать ключевое слово PERCENT для того, чтобы включить в выборку определенный процент из верхней или нижней части диапазона, отсортированного в соответствии с директивой ORDER BY. Например, вместо 25 студентов можно запросить 10% курса:

SELECT TOP 10 PERCENT [имя],[отчество],[фамилия]

FROM Студенты

WHERE [год выпуска] = 2007

ORDER BY [средний балл] DESC

Используемое число в предикате ТОР должно быть целым без знака.

Использование TOP эквивалентно использованию параметра НАБОР ЗНАЧЕНИЙ в окне свойств запроса при проектировании QBE-запроса в режиме конструирования. Использование ключевого слова PERCENT эквивалентно использованию знака процента (%) при указании свойства НАБОР ЗНАЧЕНИЙ.

Предикат between

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

<between predicate> ::=

<value expression>

[NOT] BETWEEN <value expression> AND <value expression>

Результат "x BETWEEN y AND z" тот же самый, что результат "x >= y AND x <= z". Результат "x NOT BETWEEN y AND z" тот же самый, что результат "NOT (x BETWEEN y AND z)".