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

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

8.2.Операции выборки данных

Вязыке SQL предусмотрено четыре предложения манипулирования данными: SELECT, UPDATE, DELETE и INSERT. В этой и следующей главе рассматривается предложение SELECT. В части 8.4 рассматриваются три других предложения. Предполагается также, если не оговорено противное, что все предложения языка вводятся интерактивным способом.

Примечание. Многие из примеров, особенно в следующей главе, являются весьма сложными. Дело, скорее, в том, что обычные операции настолько просты в SQL (а фактически, в большинстве реляционных языков), что примеры таких операций оказываются довольно неинтересными и не иллюстрируют полной мощности этого языка. Сначала, конечно, приводятся некоторые простые примеры затем более сложная, но чрезвычайно важная возможность, называемая соединением.

Примеры запросов

Начнем с простого примера — с запроса «Выдать номера и состояния для поставщиков, находящихся в Париже». Этот запрос может быть выражен в SQL следующим образом:

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

FROM S

WHERE ГОРОД = ’Париж’;

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

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

СОСТОЯНИЕ

S2

10

S3

30

236

Этот пример иллюстрирует самую общую форму предложения SELECT в языке SQL—

“SELECT (выбрать) специфицированные поля FROM (из) специфицированной таблицы WHERE (где) некоторое специфицированное условие

является истинным”

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

В данном случае было бы вполне возможно сформулировать запрос, используя уточненные имена полей:

SELECT S.HOMEP_ПОСТАВЩИКА, S.СОСТОЯНИЕ

FROM S

WHERE S.ГОРОД = ’Париж’;

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

Для справочных целей ниже показана общая форма предложения SELECT, в которой, однако, опущена возможность UNION, обсуждаемая в следующей части:

SELECT [DISTINCT] элемент (ы)

FROM таблица (или таблицы) [WHERE предикат]

[GROUP BY поле (или поля) [HAVING предикат]] [ORDER BY поле (или поля)];

Перейдем теперь к иллюстрации основных особенностей этого предложения с помощью весьма продолжительной серии примеров.

237

Простая выборка

Выдать номера для всех поставляемых деталей:

SELECT НОМЕР_ДЕТАЛИ

FROM SP;

Имеем результат:

НОМЕР_ДЕТАЛИ

P1

P2

P3

P4

P5

P6

P1

P2

P2

P2

P4

P5

Обратим внимание на дубликаты номеров деталей в этом результате. Система не исключает дубликатов из результата предложения SELECT, если пользователь явно не потребует это сделать с помощью ключевого слова DISTINCT (различный, различные), как показано в следующем примере.

Выборка с исключением дубликатов

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

SELECT DISTINCT НОМЕР_ДЕТАЛИ

FROM SP;

238

В этом случае результат таков:

НОМЕР_ДЕТАЛИ

P1

P2

P3

P4

P5

P6

Выборка вычисляемых значений

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

SELECT НОМЕР_ДЕТАЛИ, ВЕС*454

FROM Р;

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

НОМЕР_ДЕТАЛИ

P1

5448

P2

7718

P3

7718

P4

6356

P5

5448

P6

8626

Фраза SELECT (и фраза WHERE) может включать арифметические выражения, а также простые имена полей. Можно, кроме того, осуществлять выборку просто констант. Например:

SELECT НОМЕР_ДЕТАЛИ, ’Вес в граммах = ’, ВЕС*454 FROM P;

239

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

НОМЕР_ДЕТАЛИ

P1

’Вес в граммах =

5448

P2

’Вес в граммах =

7718

P3

’Вес в граммах =

7718

P4

’Вес в граммах =

6356

P5

’Вес в граммах =

5448

P6

’Вес в граммах =

8626

Заметим, что в этом результате три столбца.

В связи с этим примером возникает следующий вопрос: что произойдет, если вес какой-либо детали имеет неопределенное значение (NULL)? Напомним, что NULL представляет неизвестное значение. Предположим, например, что вес детали Р1 задан в базе данных как неопределенное значение вместо значения 12. Каково тогда значение выражения ВЕС*454 для этой детали? Ответ состоит в том, что оно также является неопределенным значением. В общем случае фактически любое арифметическое выражение считается имеющим неопределенное значение, если какой-либо из его операндов сам имеет неопределенное значение. Иными словами, если оказывается, что вес имеет неопределенное значение, то неопределенное значение имеют и все следующие выражения:

ВЕС+454

ВЕС — 454

ВЕС*454 ВЕС/454

Неопределенные значения показываются на терминале как тире или дефис.

Простая выборка «select *»

Выдать полные характеристики для всех поставщиков:

SELECT *

FROM S;

240

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