metBD (1084482), страница 34
Текст из файла (страница 34)
Соединение по условию «больше чем»
Выдать все комбинации информации о поставщиках и деталях, таких, что город местонахождения поставщика следует за городом, где хранится деталь, в алфавитном порядке:
SELECT S.*, P.*
FROM S, P
WHERE S.ГОРОД > Р.ГОРОД;
Получим в результате следующую таблицу 52.
Таблица 52
НОМЕР_ ПОСТАВЩИКА | ФАМИЛИЯ | СОСТОЯНИЕ | S.ГОРОД |
S2 | Джонс | 10 | Париж |
S2 | Джонс | 10 | Париж |
S2 | Джонс | 10 | Париж |
S3 | Блейк | 30 | Париж |
S3 | Блейк | 30 | Париж |
S3 | Блейк | 30 | Париж |
Продолжение таблицы 52
НОМЕР_ ДЕТАЛИ | НАЗВАНИЕ | ЦВЕТ | ВЕС | P.ГОРОД |
P1 | Гайка | Красный | 12 | Лондон |
P4 | Винт | Красный | 14 | Лондон |
P6 | Блюм | Красный | 19 | Лондон |
P1 | Гайка | Красный | 12 | Лондон |
P4 | Винт | Красный | 14 | Лондон |
P6 | Блюм | Красный | 19 | Лондон |
Соединение с дополнительным условием
Выдать все комбинации информации о поставщиках и информации о деталях, такие, что рассматриваемые поставщики и детали «соразмещены». Опустить при этом поставщиков с состоянием, равным 20:
SELECT S.*, P.*
FROM S, P
WHERE S.ГОРОД = Р.ГОРОД
AND S.СОСТОЯНИЕ != 20;
Результат представлен в таблице 53.
Таблица 53
НОМЕР_ ПОСТАВЩИКА | ФАМИЛИЯ | СОСТОЯНИЕ | S.ГОРОД |
S2 | Джонс | 10 | Париж |
S2 | Джонс | 10 | Париж |
S3 | Блейк | 30 | Париж |
S3 | Блейк | 30 | Париж |
Продолжение таблицы 53
НОМЕР_ ДЕТАЛИ | НАЗВАНИЕ | ЦВЕТ | ВЕС | P.ГОРОД |
P2 | Болт | Зеленый | 17 | Париж |
P5 | Кулачок | Голубой | 12 | Париж |
P2 | Болт | Зеленый | 17 | Париж |
P5 | Кулачок | Голубой | 12 | Париж |
Выборка специфицированных полей из соединения
Выдать все комбинации номеров поставщиков и номеров деталей, таких, что поставщик и деталь соразмещены:
SELECT S.НОМЕР_ПОСТАВЩИКА, Р.НОМЕР_ДЕТАЛИ
FROM S, P
WHERE S.ГOPOД = Р.ГОРОД;
Имеем результат:
НОМЕР_ПОСТАВЩИКА | НОМЕР_ДЕТАЛИ |
S1 | P1 |
S1 | P4 |
S1 | P6 |
S2 | P2 |
S2 | P5 |
S3 | P2 |
S3 | P5 |
S4 | P1 |
S4 | P4 |
S4 | P6 |
Соединение трех таблиц
Выдать все пары названий городов, таких, что какой-либо поставщик, находящийся в первом из этих городов, поставляет некоторую деталь, хранимую во втором городе. Например, поставщик S1 поставляет деталь Р1. Поставщик S1 находится в Лондоне, а деталь Р1 хранится также в Лондоне. Поэтому пара городов «Лондон, Лондон» — это пара городов, которая содержится в результате.
SELECT DISTINCT S.ГOPOД, Р.ГОРОД
FROM S, SP, P
WHERE S.HOMEP_ПОСТАВЩИКА = SP.HOMEP_ПОСТАВЩИКА
AND SP.HOMEP_ДЕТАЛИ = Р.НОМЕР_ДЕТАЛИ;
Получаем результат:
S.ГОРОД | P.ГОРОД |
Лондон | Лондон |
Лондон | Париж |
Лондон | Рим |
Париж | Лондон |
Париж | Париж |
В качестве упражнения следует установить, какие конкретно комбинации поставщик — деталь порождают каждую из строк результата в этом примере.
Соединение таблицы с ней самой
Выдать все пары номеров поставщиков, такие, что образующие их поставщики соразмещены.
SELECT ПЕРВАЯ.НОМЕР_ПОСТАВЩИКА,
ВТОРАЯ. НОМЕР_ПОСТАВЩИКА
FROM S ПЕРВАЯ, S ВТОРАЯ
WHERE ПЕРВАЯ.ГОРОД = ВТОРАЯ.ГОРОД;
Нетрудно видеть, что в этом запросе требуется соединение таблицы S с ней самой по соответствию городов. Поэтому таблица S дважды указывается во фразе FROM. Для того чтобы различать эти два ее вхождения, мы вводим в этой фразе два произвольных ее псевдонима, ПЕРВАЯ и ВТОРАЯ, и используем их как явные уточнители во фразах SELECT и WHERE.
Получаем результат:
НОМЕР_ПОСТАВЩИКА | НОМЕР_ПОСТАВЩИКА | |
S1 | S1 | |
S1 | S4 | |
S2 | S2 | |
S2 | S3 | |
S3 | S2 | |
S3 | S3 | |
S4 | S1 | |
S4 | S4 | |
S5 | S5 |
Мы можем привести в порядок этот результат, расширив следующим образом фразу WHERE:
SELECT ПЕРВАЯ.НОМЕР_ПОСТАВЩИКА,
ВТОРАЯ.НОМЕР_ПОСТАВЩИКА
FROM S ПЕРВАЯ, S ВТОРАЯ
WHERE ПЕРВАЯ.ГОРОД = ВТОРАЯ.ГОРОД
AND ПЕРВАЯ.НОМЕР_ПОСТАВЩИКА <
ВТОРАЯ.НОМЕР_ПОСТАВЩИКА
Условие ПЕРВАЯ.НОМЕР_ПОСТАВЩИКА <
ВТОРАЯ.НОМЕР_ПОСТАВЩИКА дает двоякий эффект: а) оно исключает пары номеров поставщиков вида (х, х); б) оно гарантирует, что не будут появляться одновременно пары (х, у) и (у, х).
Имеем в результате:
НОМЕР_ПОСТАВЩИКА | НОМЕР_ПОСТАВЩИКА |
S1 | S4 |
S2 | S3 |
Это первый пример, в котором мы видели, что использование синонимов необходимо. Однако введение таких синонимов никогда не будет ошибкой, даже если их использование не необходимо, и иногда они могут помочь в том, чтобы данное предложение стало более ясным.
Упражнения
Все последующие упражнения к данной части основываются на базе данных поставщиков-деталей-изделий. В каждом из них требуется записать предложение SELECT для указанного запроса. Для удобства ниже вновь приводится структура рассматриваемой базы данных:
S (HOMEP_ПОСТАВЩИКА, ФАМИЛИЯ, СОСТОЯНИЕ, ГОРОД)
Р (НОМЕР_ДЕТАЛИ, НАЗВАНИЕ, ЦВЕТ, ВЕС, ГОРОД)
J (HOMEP_ИЗДЕЛИЯ, НАЗВАНИЕ, ГОРОД)
SPJ (HOMEP_ПОСТАВЩИКА, НОМЕР_ДЕТАЛИ, НОМЕР_ИЗДЕЛИЯ, КОЛИЧЕСТВО)
Простые запросы
-
Выдать полный список деталей для всех изделий.
-
Выдать полный список деталей для всех изделий, изготавливаемых в Лондоне.
-
Выдать упорядоченный список номеров поставщиков, поставляющих детали для изделия номер J1.
-
Выдать список всех поставок, в которых количество деталей находится в диапазоне от 300 до 750 включительно.
-
Выдать список всех комбинаций «цвет детали—город, где хранится деталь», исключая дубликаты пар (цвет—город).
-
Выдать список всех поставок, в которых количество не является неопределенным значением.
-
Выдать номера изделий и города, где они изготавливаются, такие, что второй буквой названия города является «О».
Соединения
-
Выдать все триплеты «номер поставщика, номер детали и номер изделия», такие, что образующие каждый из них поставщик, деталь и изделие являются соразмещенными.
-
Выдать все триплеты «номер поставщика, номер детали и номер изделия», такие, что образующие каждый из них поставщик, деталь и изделие не являются соразмещенными.
-
Выдать все триплеты «номер поставщика, номер детали и номер изделия», такие, что в каждом триплете указанные поставщик, деталь и изделие не являются попарно соразмещенными.
-
Выдать номера деталей, поставляемых каким-либо поставщиком из Лондона, для изделия, изготавливаемого также в Лондоне.
-
Выдать номера деталей, поставляемых каким-либо поставщиком из Лондона.
-
Выдать все пары названий городов, таких, что какой-либо поставщик из первого города поставляет детали для некоторого изделия, изготавливаемого во втором городе.
-
Выдать номера деталей, поставляемых для какого-либо изделия поставщиком, находящимся в том же городе, где изготавливается это изделие.
-
Выдать номера изделий, для которых детали поставляются, по крайней мере, одним поставщиком не из того же самого города.
-
Выдать все пары номеров деталей, таких, что некоторый поставщик поставляет обе указанные детали.
8.3 Использование подзапросов и функции выборки данных
Введение
В этой части мы завершаем обсуждение предложения SELECT языка SQL. План этой части следующий:
-
Сначала вводится понятие подзапроса (Subquery) или вложенного предложения SELECT. Представляет исторический интерес тот факт, что именно возможность вкладывать одно предложение SELECT внутрь другого первоначально послужила мотивировкой использования прилагательного «структуризованный» в названии языка «структуризованный язык запросов» (Structured Query Language—SQL). Однако более поздние дополнения к языку привели к тому, что сами по себе вложенные предложения SELECT стали значительно менее важными.
-
Затем рассматривается квантор существования EXISTS (существует), который вместе с соединением расценивается, по мнению автора, как одна из наиболее важных и фундаментальных, хотя, может быть, и не самых легких для использования, возможностей полного языка SQL.
-
Далее обсуждаются стандартные функции COUNT (число значений), SUM (сумма), AVG (среднее) и т. п. В нем описывается, в частности, использование в связи с этими функциями фраз GROUP BY (группировать по) и HAVING (имея).
-
В завершение обсуждается оператор UNION (объединение).
-
Для того чтобы попытаться связать воедино ряд идей, введенных в данной и предыдущей частях, В конце представлен пример весьма сложного предложения SELECT и принципиально показано, каким образом такое предложение могло бы обрабатываться системой.
Одна из причин большого размера данной главы заключается в большой избыточности языка SQL в том смысле, что он часто предоставляет несколько различных способов формулировки одного и того же запроса. Поскольку мы пытаемся дать достаточно исчерпывающее представление этого языка, материалы данной части по необходимости также в некоторой степени избыточны.
Необходимо сделать еще одно заключительное вводное замечание, которое может быть не совсем понятным пока не будет прочитана вся часть. Несмотря на то, что наша задача состоит в исчерпывающем обсуждении языка, в данную главу намеренно не включено какое-либо детальное описание вариантов ANY (любой) и ALL (все) операторов сравнения (>ANY, =ALL и т. д.), если необходимо такое детальное описание, можно обратиться к фирменному руководству по системе. Нет такого запроса, сформулированного с их использованием, который нельзя было бы в равной степени хорошо, а на самом деле лучше, сформулировать, используя конструкцию EXISTS (существует). Более того, они запутывают и порождают потенциальную опасность ошибок. Например, корректное предложение: