Материал: Базы данных и их безопасность. Плотников Д.Г

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Имеется в распоряжении также предикат NOT IN (не принадлежит), например предложение;

SELECT НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД

FROM P

WHERE ВЕС NOT IN (12, 16, 17);

дает результат

 

 

 

 

НОМЕР_

НАЗВАНИЕ

ЦВЕТ

ВЕС

ГОРОД

ДЕТАЛИ

 

 

 

 

P4

Винт

Красный

14

Лондон

P6

Блюм

Красный

19

Лондон

Подобно предикату IN предикат NOT IN может рассматриваться только как сокращенная запись другого предиката, который не использует NOT IN. Упражнение. Запишите «развернутую форму» предложения из предшествующего примера.

Выборка с использованием предиката like (похоже на)

Выдать все детали, названия которых начинаются с буквы «С»:

SELECT НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД

FROM P

WHERE НАЗВАНИЕ LIKE ’С%’;

Получаем результат:

 

 

 

НОМЕР_

НАЗВАНИЕ

ЦВЕТ

ВЕ

ГОРОД

ДЕТАЛИ

 

 

С

 

P5

Кулачок (Cam)

Голубой

12

Париж

P6

Блюм (Cog)

Красный

19

Лондон

246

Обычно предикат LIKE имеет форму:

имя—столбца LIKE литерная—строковая—константа, где «имя—столбца» должно обозначать столбец типа CHAR или VARCHAR. Этот предикат принимает для заданной записи значение истина, если значение в указанном столбце соответствует образцу, специфицируемому «литерной— строковой—константой». Литеры этой константы интерпретируются следующим образом:

-Литера «_» (разрыв или подчеркивание) обозначает

любую одиночную литеру.

-Литера «%» (процент) обозначает любую последовательность из n литер (где n может быть нулем).

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

SELECT будет осуществлять выборку записей из таблицы P, для которых значение в столбце НАЗВАНИЕ начинается буквой «С» и содержит любую последовательность из нуля или более литер, следующую за этой буквой «С».

Ниже приведено еще несколько примеров, в которых

используется LIKE:

 

 

 

АДРЕС LIKE ’% Беркли %’

будет

принимать

значение

 

истина, если АДРЕС содержит

 

где-либо

внутри него строку

 

’Беркли’

 

 

НОМЕР_ПОСТАВЩИКА LIKE ’S__’

будет

принимать

 

значение истина, если значение

 

в столбце НОМЕР_ПОСТАВ-

 

ЩИКА состоит в точности из

 

трех литер и первая из них

 

литера «S»

 

НАЗВАНИЕ LIKE ’% К___’

будет

принимать

значение

истина, если значение в столбце НАЗВАНИЕ состоит из четырех или более литер и трем последним из них предшествует литера

«К»

247

СОСТОЯНИЕ > 25 СОСТОЯНИЕ < = 25 СОСТОЯНИЕ = 25 СОСТОЯНИЕ !=25 СОСТОЯНИЕ =

ГОРОД NOT LIKE ’% Е %’

будет

принимать значение

 

истина, если значение ГОРОД

 

не содержит литеры «Е»

Выборка, при

которой

вовлекается null

(неопределенное значение)

Допустим, например, что значением в столбце СОСТОЯНИЕ для поставщика S5 является не 30, а неопределенное значение. Выдать номера поставщиков, у которых состояние больше, чем 25:

SELECT НОМЕР_ПОСТАВЩИКА

FROM S

WHERE СОСТОЯНИЕ > 25;

В результате получим:

НОМЕР_ПОСТАВЩИКА

S3

Здесь поставщик S5 не был назван в результате. Если неопределенное значение сравнивается с некоторым другим значением при вычислении предиката, то независимо от используемого оператора сравнения результатом сравнения никогда не является истина, даже если этот другой операнд также является неопределенным значением. Иными словами, если оказывается, что СОСТОЯНИЕ имеет неопределенное значение, то ни одно из следующих сравнений не будет принимать значение истина:

NULL (Это недопустимая синтаксическая конструкция. См. ниже)

СОСТОЯНИЕ != NULL (Это—тоже).

248

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

SELECT НОМЕР_ПОСТАВЩИКА

FROM S

WHERE СОСТОЯНИЕ < = 25;

и сравнить его результат с результатом предыдущего запроса, то можно установить, что поставщик S5 не появляется ни в одном из них. Результат приведенного запроса:

НОМЕР_ПОСТАВЩИКА

S1

S2

S4

Для проверки наличия (или отсутствия) неопределенного значения предусмотрен специальный предикат вида:

имя — столбца IS [NOT] NULL

Например:

SELECT НОМЕР_ПОСТАВЩИКА

FROM S

WHERE СОСТОЯНИЕ IS NULL;

В результате имеем:

НОМЕР_ПОСТАВЩИКА

S5

Синтаксическая конструкция «СОСТОЯНИЕ = NULL» является некорректной, поскольку ничто — и даже само неопределенное значение — не считается равным неопределенному значению. (Несмотря на это, два неопределенных значения рассматриваются, однако, как дубликаты друг друга при исключении дубликатов.

249

Предложение SELECT DISTINCT (ВЫБРАТЬ РАЗЛИЧНЫЕ) даст в результате не более одного неопределенного значения. Аналогичным образом индекс со спецификацией UNIQUE (уникальный) будет допускать в индексируемом столбце не более одного неопределенного значения. Наконец, при упорядочении ORDER BY (УПОРЯДОЧИТЬ ПО) неопределенные значения интерпретируются, как будто бы они больше или равны всем значениям, не являющимся неопределенными).

Заметим, между прочим, что использование символа NULL во фразе SELECT не допускается. Например, следующая конструкция некорректна:

SELECT НОМЕР_ДЕТАЛИ, ’ВЕС = ’, NULL

FROM P

WHERE ВЕС IS NULL;

Запросы, использующие соединение

Способность «соединять» две или более таблицы в одну представляет собой одну из наиболее мощных возможностей реляционных систем. Фактически наличие операции соединения (join) — едва ли не самое главное, что отличает реляционные системы от систем других типов. Итак, что такое соединение? Говоря нестрого, это запрос, в котором выборка данных осуществляется более чем из одной таблицы. Ниже приводится простой пример.

Простое эквисоединение

Выдать все комбинации информации о таких поставщиках и деталях, которые размещены в одном и том же городе (иначе говоря, «соразмещены»—безобразный, но удобный термин):

SELECT S.*, P.*

FROM S, Р

WHERE S.ГОРОД = Р.ГОРОД;

250

Источник: https://studfile.net/preview/16563653/