Организация Web-доступа к базам данных с использованием SQL-запросовРефераты >> Программирование и компьютеры >> Организация Web-доступа к базам данных с использованием SQL-запросов
Из этого простого примера видно, что избыточные дубликаты всегда исключаются из результата UNION. Поэтому, хотя в рассматриваемом примере Помидоры, Зелень и Яблоки выбираются обеими из двух составляющих предложения SELECT, в окончательном результате они появляются только один раз.
Предложением с UNION можно объединить любое число таблиц (проекций таблиц). Так, к предыдущему запросу можно добавить (перед точкой с запятой) конструкцию
UNION
SELECT Продукт
FROM Продукты
WHERE Ca < 250
позволяющую добавить к списку продуктов Масло, Рис, Мука и Кофе. Однако тот же результат можно получить простым изменением фразы WHERE первой части исходного запроса
WHERE Жиры = 0 OR Ca < 250
Реализация операций реляционной алгебры предложением SELECT
С помощью предложения SELECT можно реализовать любую операцию реляционной алгебры.
Селекция (горизонтальное подмножество) таблицы создается из тех ее строк, которые удовлетворяют заданным условиям. Пример:
SELECT *
FROM Блюда
WHER Основа = 'Молоко'
AND Выход 200;
Проекция (вертикальное подмножество) таблицы создается из указанных ее столбцов (в заданном порядке) с последующим исключением избыточных дубликатов строк. Пример:
SELECT DISTINCT Блюдо, Выход, Основа
FROM Блюда;
Объединение двух таблиц содержит те строки, которые есть либо в первой, либо во второй, либо в обеих таблицах. Пример:
SELECT Блюдо, Основа, Выход
FROM Блюда
WHER Основа = 'Овощи'
UNION
SELECT Блюдо, Основа, Выход
FROM Блюда
WHER В = 'Г';
Пересечение двух таблиц содержит только те строки, которые есть и в первой, и во второй. Пример:
SELECT БЛ
FROM Состав
WHERE БЛ IN
( SELECT БЛ
FROM Меню);
Разность двух таблиц содержит только те строки, которые есть в первой, но отсутствуют во второй. Пример:
SELECT БЛ
FROM Состав
WHERE БЛ NOT IN
( SELECT БЛ
FROM Меню);
Здесь опущено лишь достаточно нудное описание редко встречаемой операция деления, которая также может быть реализована предложением SELECT с коррелированными вложенными подзапросами.
Резюме
Знакомство с возможностями предложения SELECT показало, что с его помощью можно реализовать все реляционные операции. Кроме того, в предложении SELECT выполняются разнообразные вычисления, агрегирование данных, их упорядочение и ряд других операций, позволяющих описать в одном предложении ту работу, для выполнения которой потребовалось бы написать несколько страниц программы на алгоритмических языках Си, Паскаль или на внутренних языках ряда распространенных СУБД.
Например, пусть требуется получить калорийность и стоимость тех блюд, для которых:
· есть все составляющие их продукты;
· калорийность не превышает 400 ккал;
· стоимость не превышает 1.5 рубля, а результат надо упорядочить по возрастанию калорийности блюд в рамках их видов.
Для этого можно дать запрос, показанный на рис. 2.7, позволяющий получить искомый результат в виде таблицы
Вид |
Блюдо | ||||
Горячее |
Помидоры с луком |
калорий - |
244.6 |
0.44 |
руб |
Горячее |
Бефстроганов |
калорий - |
321.3 |
0.53 |
руб |
Горячее |
Драчена |
калорий - |
333.9 |
0.33 |
руб |
Горячее |
Каша рисовая |
калорий - |
339.2 |
0.27 |
руб |
Горячее |
Омлет с луком |
калорий - |
354.9 |
0.36 |
руб |
Десерт |
Яблоки печеные |
калорий - |
170.2 |
0.30 |
руб |
Десерт |
Крем творожный |
калорий - |
394.3 |
0.27 |
руб |
Закуска |
Салат летний |
калорий - |
155.5 |
0.32 |
руб |
Закуска |
Салат витаминный |
калорий - |
217.4 |
0.37 |
руб |
Закуска |
Творог |
калорий - |
330.0 |
0.22 |
руб |
Закуска |
Мясо с гарниром |
калорий - |
378.7 |
0.62 |
руб |
Напиток |
Кофе черный |
калорий - |
7.1 |
0.05 |
руб |
Напиток |
Компот |
калорий - |
74.4 |
0.14 |
руб |
Напиток |
Кофе на молоке |
калорий - |
154.8 |
0.11 |
руб |
Напиток |
Молочный напиток |
калорий - |
264.9 |
0.34 |
руб |
Суп |
Суп молочный |
калорий - |
396.6 |
0.22 |
руб |
SELECT Вид, Блюдо, 'калорий –',
(SUM(INT((Белки+Углев)*4.1+Жиры*9.3)*Вес/1000)),
(SUM(Стоимость/К_во*Вес/1000)+MIN(Труд/100)),’руб’
FROM Блюда, Вид_блюд, Состав, Продукты, Наличие
WHERE Блюда.БЛ = Состав.БЛ
AND Состав.ПР = Продукты.ПР
AND Состав.ПР = Наличие.ПР
AND Блюда.В = Вид_блюд.В
AND БЛ NOT IN
( SELECT БЛ
FROM Состав
WHERE ПР IN
( SELECT ПР
FROM Наличие
WHERE К_во = 0))
GROUP BY Вид, Блюдо