Главная    Почта    Новости    Каталог    Одноклассники    Погода    Работа    Игры     Рефераты     Карты
  
по Казнету new!
по каталогу
в рефератах

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

ц)  в
терминологии  реляционных  СУБД.  При  проектировании  стремятся   создавать
таблицы, в каждой из которых содержалась бы информация об одном и только  об
одном типе сущностей. Это облегчает модификацию базы  данных  и  поддержание
ее   целостности.   Но   такой   подход   тяжело   усваивается   начинающими
проектантами, которые пытаются привязать проект к будущим приложениям и  так
организовать таблицы, чтобы в каждой из них хранилось  все  необходимое  для
реализации возможных запросов. Типичен вопрос: как же  получить  сведения  о
том,  где  купить  продукты  для  приготовления  того  или  иного  блюда   и
определить его калорийность и стоимость, если нужные данные  «рассыпаны»  по
семи различным таблицам? Не лучше ли иметь одну большую таблицу,  содержащую
все сведения базы данных ПАНСИОН ?
      Даже при отсутствии средств одновременного доступа ко многим  таблицам
нежелателен  проект,  в  котором  информация  о   многих   типах   сущностей
перемешана в одной таблице. SQL  же  обладает  великолепным  механизмом  для
одновременной  или   последовательной   обработки   данных   из   нескольких
взаимосвязанных  таблиц.  В  нем  реализованы  возможности  «соединять»  или
«объединять» несколько  таблиц  и  так  называемые  «вложенные  подзапросы».
Например, чтобы получить перечень  поставщиков  продуктов,  необходимых  для
приготовления Сырников, возможен запрос

SELECT      Продукт, Цена, Название, Статус
FROM  Продукты, Состав, Блюда, Поставки, Поставщики
WHERE Продукты.ПР = Состав.ПР
AND   Состав.БЛ = Блюда.БЛ
AND   Поставки.ПР = Состав.ПР
AND   Поставки.ПС = Поставщики.ПС
AND   Блюдо = 'Сырники'
AND   Цена IS NOT NULL;

|Продукт |Цена  |Название     |Статус        |
|Яйца    |1.8   |ПОРТОС       |Кооператив    |
|Яйца    |2.    |КОРЮШКА      |Кооператив    |
|Сметана |3.6   |ПОРТОС       |Кооператив    |
|Сметана |2.2   |ОГУРЕЧИК     |Ферма         |
|Творог  |1.    |ОГУРЕЧИК     |Ферма         |
|Мука    |0.5   |УРОЖАЙ       |Коопторг      |
|Сахар   |0.94  |ТУЛЬСКИЙ     |Универсам     |
|Сахар   |1.    |УРОЖАЙ       |Коопторг      |


      Он получен следующим образом: СУБД  последовательно  формирует  строки
декартова произведения  таблиц,  перечисленных  во  фразе  FROM,  проверяет,
удовлетворяют ли данные сформированной строки условиям фразы WHERE,  и  если
удовлетворяют,  то  включает  в  ответ  на  запрос  те  ее   поля,   которые
перечислены во фразе SELECT.
      Следует  подчеркнуть,   что   в   SELECT   и   WHERE   (во   избежание
двусмысленности) ссылки на все (*) или отдельные столбцы могут (а  иногда  и
должны) уточняться именем соответствующей  таблицы,  например,  Поставки.ПС,
Поставщики.ПС, Меню.*, Состав.БЛ, Блюда.* и т.п.
      Очевидно, что с помощью соединения  несложно  сформировать  запрос  на
обработку данных из нескольких таблиц. Кроме  того,  в  такой  запрос  можно
включить любые части предложения SELECT, рассмотренные в главе 2  (выражения
с  использованием  функций,  группирование  с  отбором  указанных  групп   и
упорядочением полученного результата). Следовательно,  соединения  позволяют
обрабатывать множество взаимосвязанных таблиц как единую таблицу, в  которой
перемешана  информация  о  многих  типах   сущностей.   Поэтому   начинающий
проектант базы данных может  спокойно  создавать  маленькие  нормализованные
таблицы, так как он всегда может получить из них любую «большую» таблицу.
      Кроме механизма соединений в SQL есть механизм вложенных  подзапросов,
позволяющий объединить  несколько  простых  запросов  в  едином  предложении
SELECT. Иными словами, вложенный подзапрос – это уже знакомый нам  подзапрос
(с  небольшими  огра-ничениями),  который  вложен  в  WHERE  фразу   другого
вложенного подзапроса или WHERE фразу основного запроса.
      Для иллюстрации вложенного подзапроса вернемся к предыдущему примеру и
попробуем получить перечень тех поставщиков продуктов для Сырников,  которые
поставляют нужные продукты за минимальную цену.

SELECT      Продукт, Цена, Название, Статус
FROM  Продукты, Состав, Блюда, Поставки, Поставщики
WHERE Продукты.ПР = Состав.ПР
AND   Состав.БЛ = Блюда.БЛ
AND   Поставки.ПР = Состав.ПР
AND   Поставки.ПС = Поставщики.ПС
AND   Блюдо = 'Сырники'
AND   Цена = (   SELECT      MIN(Цена)
            FROM Поставки X
            WHERE      X.ПР = Поставки.ПР );
Результат запроса имеет вид
|Продукт   |Цена |Название   |Статус           |
|Яйца      |1.8  |ПОРТОС     |Кооператив       |
|Сахар     |0.94 |ТУЛЬСКИЙ   |Универсам        |
|Мука      |0.5  |УРОЖАЙ     |Коопторг         |
|Сметана   |2.2  |ОГУРЕЧИК   |Ферма            |
|Творог    |1.   |ОГУРЕЧИК   |Ферма            |


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

                      Запросы, использующие соединения
                        Декартово произведение таблиц
      Так как декартово произведение n таблиц – это таблица, содержащая  все
возможные строки r, такие, что r является сцеплением  какой-либо  строки  из
первой таблицы, строки из второй таблицы, … и строки из n-й  таблицы  (а  мы
уже научились выделять  с  помощью  SELECT  любое  подмножество  реляционной
таблицы), то осталось лишь выяснить, можно  ли  с  помощью  SELECT  получить
декартово произведение.  Для  получения  декартова  произведения  нескольких
таблиц надо указать во фразе FROM перечень перемножаемых таблиц, а во  фразе
SELECT – все их столбцы.
      Так, для получения декартова  произведения  Вид_блюд  и  Трапезы  надо
выдать запрос

SELECT      Вид_блюд.*, Трапезы.*
FROM  Вид_блюд, Трапезы;
Получим таблицу, содержащую 5 х 3 = 15 строк:

|В              |Вид         |Т      |Трапеза          |
|З              |Закуска     |1      |Завтрак          |
|З              |Закуска     |2      |Обед             |
|З              |Закуска     |3      |Ужин             |
|С              |Суп         |1      |Завтрак          |
|С              |Суп         |2      |Обед             |
|С              |Суп         |3      |Ужин             |
|Г              |Горячее     |1      |Завтрак          |
|Г              |Горячее     |2      |Обед             |
|Г              |Горячее     |3      |Ужин             |
|Д              |Десерт      |1      |Завтрак          |
|Д              |Десерт      |2      |Обед             |
|Д              |Десерт      |3      |Ужин             |
|Н              |Напиток     |1      |Завтрак          |
|Н              |Напиток     |2      |Обед             |
|Н              |Напиток     |3      |Ужин             |


      В другом примере, где перемножаются таблицы Меню,  Трапезы,  Вид_блюд,
Блюда:

SELECT Меню.*, Трапезы.*, Вид_блюд.*, Блюда.*
FROM  Меню, Трапезы, Вид_блюд, Блюда;
образуется таблица (рис 2.6), содержащая 21 х 3 х 5 х 33 = 10395 строк.


                            Эквисоединение таблиц
      Если из декартова произведения убрать ненужные строки  и  столбцы,  то
можно получить актуальные таблицы, соответствующие любому из соединений.

|Меню|    |    |Трап|    |Вид_|    |Блюд|    |    |    |    |    |
|    |    |    |езы |    |блюд|    |а   |    |    |    |    |    |
|Т   |В   |БЛ  |Т   |Трап|В   |Вид |БЛ  |Блюд|В   |Осно|Выхо|Труд|
|    |    |    |    |еза |    |    |    |о   |    |ва  |д   |    |
|1   |З   |3   |1   |Завт|З   |Заку|1   |Сала|З   |Овощ|200.|3   |
|    |    |    |    |рак |    |ска |    |т   |    |и   |    |    |
|    |    |    |    |    |    |    |    |летн|    |    |    |    |
|    |    |    |    |    |    |    |    |ий  |    |    |    |    |
|1   |З   |3   |1   |Завт|З   |Заку|2   |Сала|З   |Мясо|200.|4   |
|    |    |    |    |рак |    |ска |    |т   |    |    |    |    |
|    |    |    |    |    |    |    |    |мясн|    |    |    |    |
|    |    |    |    |    |    |    |    |ой  |    |    |    |    |
|1   |З   |3   |1   |Завт|З   |Заку|3   |Сала|З   |Овощ|200.|4 * |
|    |    |    |    |рак |    |ска |    |т   |    |и   |    |    |
|    |    |    |    |    |    |    |    |вита|    |    |    |    |
|    |    |    |    |    |    |    |    |минн|    |    |    |    |
|    |    |    |    |    |    |    |    |ый  |    |    |    |    |
|. . |    |    |    |    |    |    |    |    |    |    |    |    |
|.   |    |    |    |    |    |    |    |    |    |    |    |    |
|1   |З   |3   |1   |Завт|З   |Заку|12  |Суп |С   |Моло|500.|3   |
|    |    |    |    |рак |    |ска |    |моло|    |ко  |    |    |
|    |    |    |    |    |    |    |    |чный|    |    |    |    |
|1   |З   |3   |1   |Завт|З   |Заку|13  |Баст|Г   |Мясо|300.|5   |
|    |    |    |    |рак |    |ска |    |урма|    |    |    |    |
|. . |    |    |    |    |    |    |    |    |    |    |    |    |
|.   |    |    |    |    |    |    |    |    |    |    |    |    |
|1   |З   |3   |1   |Завт|З   |Заку|32  |Кофе|Н   |Кофе|100.|1   |
|    |    |    |    |рак |    |ска |    |черн|    |    |    |    |
|    |    |    |    |    |    |    |    |ый  |    |    |    |    |
|1   |З   |3   |1   |Завт|З   |Заку|33  |Кофе|Н   |Кофе|200.|2   |
|    |    |    |    |рак |    |ска |    |на  |    |    |    |    |
|    |    |    |    |    |    |    |    |моло|    |    |    |    |
|    |    |    |    |    |    |    |    |ке  |    |    |    |    |
|1   |З   |6   |1   |Завт|З   |Заку|1   |Сала|З   |Овощ|200.|3   |
|    |    |    |    |рак |    |ска |    |т   |    |и   |    |    |
|    |    |    |    |    |    |    |    |летн|    |    |    |    |
|    |    |    |    |    |    |    |    |ий  |    |    |    |    |
|1   |З   |6   |1   |Завт|З   |Заку|2   |Сала|З   |Мясо|200.|4   |
|    |    |    |    |рак |    |ска |    |т   |    |    |    |    |
|    |    |    |
Пред.678910След.
скачать работу

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

 

Отправка СМС бесплатно

На правах рекламы


ZERO.kz
 
Модератор сайта RESURS.KZ