Вложенные запросы.
Составляющие оператора Select.
Оператор SELECT.
10.1. Оператор выбора SELECT
Все запросы пользователей реализуются с помощью оператора SELECT.
Структура оператора:
SELECT [ALL/DISTINСТ] <смысл полей> (| или *) FROM<список таблиц>
[WHERE<предикат - условия выборки или соединения>]
[GROUP BY<список полей результата>]
[HAVING<предикат - для группировки>]
[ORDER BY<список полей упорядочивания>]
| - в результирующий набор включаются значения всех перечисленных атрибутов исходных отношений.
* - в результирующий набор включаются значения всех атрибутов исходных отношений.
10.2. Составляющие оператора:
10.2.1. SELECT - ключевое слово начала запроса.
ALL - означает, что в результирующий набор включаются все кортежи, удовлетворяющие условию запроса.
DISTING - в результирующий набор включаются только разные кортежи.
<список полей> (| или *) - либо мы можем указать список полей, которые должны быть в результирующей таблице, либо все атрибуты отношений удовлетворяют запросу.
10.2.2. FROM - является обязательным, задаёт перечень исходных отношений запроса.
10.2.3. WHERE - содержит условия отбора кортежей или условия соединения кортежей, задается с помощью предиката.
Предикат - это выражение с неопределенными переменными; если этим переменным придать конкретные значения, то предикат принимает значение "истина" или "ложь". С помощью предиката мы задаем условия выборки, например,
Если а = в то: а = 3, в = 3 – истина, а = 3, в = 4 – ложь.
В этом разделе могут быть использованы шесть групп предикатов:
1) предикат сравнения (>,<,<=,>=):
оценка = "отлично".
2) Between A and B - предикат-диапазон, принимает значения "истина", когда сравнимое значение попадает в сравниваемый диапазон, включает границы диапазона:
Года рождения: Between 1980 and 1990.
3) Предикат отношения к множеству:
3.1) In (множество) - предикат вхождения во множество:
Оценка IN ("отлично", "хорошо").
Истина - если атрибут принимает значение "отлично" или "хорошо".
3.2) NOT IN (множество) - предикат непопадания во множество.
4) IS NULL - предикат сравнения с неопределенным значением. Истина - если значение атрибута не определено.
4.1) логическое сложение:
NOT NULL = NULL;
TRUE U NULL = TRUE;
NULL U NULL = NULL.
4.2) логическое умножение:
TRUE ∩ NULL = NULL.
5) предикат сравнения с образцами:
5.1) LIKE (образец)
Истина - если значение сравниваемого атрибута совпадает с заданным образцом.
5.2) NOT LIKE (образец)
Истина - если значение сравниваемого атрибута не совпадает с заданным образцом.
6) EXIST - предикат существования.
Итак, с помощью WHERE мы формируем выборку данных с большим набором условий.
10.2.3. GROUP BY - раздел задает список полей для группировки.
Кортежи будут группироваться по значениям какого-либо атрибута (нескольких). Кроме того, с помощью этого раздела можно задать дополнительные условия.
10.2.4. HAVING - раздел содержит предикат условий для каждой группы.
10.2.5. ORDER BY - позволяет упорядочить последовательность вывода кортежей по какому-то атрибуту.
ORDER BY <"Фамилия">- кортежи "Фамилия" будут располагаться по алфавиту.
10.3. Вложенные запросы
Внутри оператора SELECT может осуществляться ещё (не один) запрос:
Пусть требуется узнать поставщиков помидоров, являющихся поставляемым продуктом с каким-то номером. Для этого можно дать запрос:
SELECT Название, Статус
FROM Поставщики
WHERE ПС IN
( SELECT ПС
FROM Поставки
WHERE ПР IN
( SELECT ПР
FROM Продукты
WHERE Продукт = 'Помидоры' ));
В данном случае результатом самого внутреннего подзапроса является только одно значение. Подзапрос следующего уровня в свою очередь дает в результате множество. Последний, самый внешний SELECT, вычисляет окончательный результат. Вообще допускается любая глубина вложенности подзапросов.
Тот же результат можно получить с помощью соединения:
SELECT Название, Статус
FROM Поставщики, Поставки, Продукты
WHERE Поставщики.ПС = Поставки.ПС
AND Поставки.ПР = Продукты.ПР
AND Продукт = 'Помидоры';
Однако при выполнении этого компактного запроса система должна одновременно обрабатывать данные из трёх таблиц, тогда как в предыдущем примере эти таблицы обрабатываются поочередно. Естественно, что для их реализации требуются различные ресурсы памяти и времени, однако этого практически невозможно ощутить при работе с ограниченным объемом данных.
Лекция 11. Модель бинарных ассоциаций.