Организация 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 Вид, Блюдо


Страница: