Выдать все пары номеров поставщиков, такие, что образующие их поставщики соразмещены.
SELECT ПЕРВАЯ НОМЕР_ПОСТАВЩИКА,
ВТОРАЯ. НОМЕР_ПОСТАВЩИКА
FROM S ПЕРВАЯ, S ВТОРАЯ
WHERE ПЕРВАЯ.ГОРОД = ВТОРАЯ.ГОРОД;
Нетрудно видеть, что в этом запросе требуется соединение таблицы S с ней самой по соответствию городов. Поэтому таблица S дважды указывается во фразе FROM. Для того чтобы различать эти два ее вхождения, мы вводим в этой фразе два произвольных ее псевдонима, ПЕРВАЯ и ВТОРАЯ, и используем их как явные уточнители во фразах SELECT и WHERE. Получаем результат:
НОМЕР_ПОСТАВЩИКА | НОМЕР_ПОСТАВЩИКА |
S1 S1 S2 S2 S3 S3 S4 S4 S5 | S1 S4 S2 S3 S2 S3 S1 S4 S5 |
Мы можем привести в порядок этот результат, расширив следующим образом фразу WHERE:
SELECT ПЕРВАЯ.НОМЕР_ПОСТАВЩИКА.ВТОРАЯ.НОМЕР_ПОСТАВЩИКА
FROM S ПЕРВАЯ, S ВТОРАЯ
WHERE ПЕРВАЯ.ГОРОД = ВТОРАЯ.ГОРОД
AND ПЕРВАЯ.НОМЕР_ПОСТАВЩИКА < ВТОРАЯ. НОМЕР_ПОСТАВЩИКА
Условие ПЕРВАЯ.НОМЕР_ПОСТАВЩИКА < ВТОРАЯ.НОМЕР_ПОСТАВЩИКА дает двоякий эффект: а) оно исключает пары номеров поставщиков вида (х,х); б) оно гарантирует, что не будут появляться одновременно пары (х, у) и (у, х).
|
|
Имеем в результате:
НОМЕР_ПОСТАВЩИКА | НОМЕР_ПОСТАВЩИКА |
S1 S2 | S4 S3 |
Это первый пример, в котором мы видели, что использование синонимов необходимо. Однако введение таких синонимов никогда не будет ошибкой, даже если их использование не необходимо, и иногда они могут помочь в том, чтобы данное предложение стало более ясным. Мы иногда будем использовать их в наших примерах в следующей главе.
РЕЗЮМЕ
Мы подошли к концу первой из двух глав, посвященных предложению SELECT. В ней были рассмотрены:
— само предложение SELECT, в том числе использование констант, выражений и конструкции «SELECT *»;
— использование спецификации DISTINCT для исключения дубликатов, в том числе использование DISTINCT с соединением;
— фраза FROM с одной или более таблицами, включающая использование псевдонимов;
— использование фразы ORDER BY для упорядочения результата;
— фраза WHERE, включающая:
+ операторы сравнения =, Ø =,>, > =, Ø >, <, <=, Ø<
+ предикаты соединения
+ булевские операторы AND, OR, NOT
+ специальные операторы [NOT] BETWEEN, [NOT] IN, [NOT] LIKE
+ специальное сравнение «поле IS [NOT] NULL».
В следующей главе будут рассмотрены некоторые более сложные возможности предложения SELECT, а именно возможность «подзапросов», квантор существования, использование стандартных функций и оператор объединения (union).