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