RSS    

   Реферат: Организация Web-доступа к базам данных с использованием SQL-запросов

Хотя этот первый пример только показывает иной способ формулировки запроса для задачи, решаемой и другими путями (с помощью оператора IN или соединения), EXISTS представляет собой одну из наиболее важных возможностей SQL. Фактически любой запрос, который выражается через IN, может быть альтернативным образом сформулирован также с помощью EXISTS. Однако обратное высказывание несправедливо.

Выдать название и статус поставщиков, не поставляющих продукт с номером 11.

Результат:

  SELECT     Название, Статус

  FROM       Поставщики

  WHERE      NOT EXISTS

             (            SELECT       *

                          FROM         Поставки

                          WHERE        ПС = Поставщики.ПС

                          AND          ПР = 11 );

Название

Статус

ПОРТОС кооператив
ШУШАРЫ совхоз
ТУЛЬСКИЙ универсам
ОГУРЕЧИК ферма

Функции в подзапросе

Теперь, после знакомства с различными формулировками вложенных подзапросов и псевдонимами легче понять текст и алгоритм реализации запроса на получение тех поставщиков продуктов для Сырников, которые поставляют эти продукты за минимальную цену:

SELECT  Продукт, Цена, Название, Статус

FROM    Продукты, Состав, Блюда, Поставки, Поставщики

WHERE   Продукты.ПР = Состав.ПР

AND     Состав.БЛ = Блюда.БЛ

AND     Поставки.ПР = Состав.ПР

AND     Поставки.ПС = Поставщики.ПС

AND     Блюдо = 'Сырники'

AND     Цена =  (       SELECT MIN(Цена)

                        FROM    Поставки X

                        WHERE   X.ПР = Поставки.ПР );

Естественно, что это коррелированный подзапрос: здесь сначала определяется минимальная цена продукта, входящего в состав Сырников, и только затем выясняется его поставщик.

На этом примере мы закончим знакомство с вложенными подзапросами, предложив попробовать свои силы в составлении ряда запросов, с помощью механизма таких подзапросов:

1.    Выдать названия всех мясных блюд.

2.    Выдать количество всех блюд, в состав которых входят помидоры.

3.    Выдать блюда, продукты для которых поставляются агрофирмой ЛЕТО.

Объединение (UNION)

Для SQL это означает, что две таблицы можно объединять тогда и только тогда, когда:

a.    они имеют одинаковое число столбцов, например, m;

b.    для всех i (i = 1, 2, …, m) i-й столбец первой таблицы и i-й столбец второй таблицы имеют в точности одинаковый тип данных.

Например, выдать названия продуктов, в которых нет жиров, либо входящих в состав блюда с кодом БЛ = 1:

Результат:

Продукт

SELECT       Продукт

FROM         Продукты

WHERE        Жиры = 0

UNION

SELECT       Продукт

FROM         Соста

WHERE        БЛ = 1

Майонез
Лук
Помидоры
Зелень
Яблоки
Сахар

            Из этого простого примера видно, что избыточные дубликаты всегда исключаются из результата 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  Вид, Блюдо, 'калорий –',

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.