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

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

ая, Блюда Вторая
WHERE Первая.Основа = Вторая.Основа
AND   Первая.Блюдо < Вторая.Блюдо;
Получим результат вида

|Первая.Блюдо           |Вторая.Блюдо           |Основа  |
|Морковь с рисом        |Помидоры с луком       |Овощи   |
|Морковь с рисом        |Салат летний           |Овощи   |
|Морковь с рисом        |Салат витаминный       |Овощи   |
|Помидоры с луком       |Салат витаминный       |Овощи   |
|Помидоры с луком       |Салат летний           |Овощи   |
|Салат витаминный       |Салат летний           |Овощи   |
|Бастурма               |Бефстроганов           |Мясо    |
|Бастурма               |Мясо с гарниром        |Мясо    |
|Бефстроганов           |Мясо с гарниром        |Мясо    |


                            Вложенные подзапросы
                         Виды вложенных подзапросов
      Вложенный подзапрос – это подзапрос, заключенный в  круглые  скобки  и
вложенный в WHERE (HAVING) фразу предложения SELECT или других  предложений,
использующих WHERE фразу. Вложенный подзапрос может содержать в своей  WHERE
(HAVING) фразе другой вложенный подзапрос и т.д.  Нетрудно  догадаться,  что
вложенный подзапрос  создан  для  того,  чтобы  при  отборе  строк  таблицы,
сформированной основным запросом, можно было использовать данные  из  других
таблиц (например, при отборе блюд для меню  использовать  данные  о  наличии
продуктов в кладовой пансионата).
      Существуют  простые  и  коррелированные  вложенные   подзапросы.   Они
включаются в WHERE (HAVING) фразу с помощью условий IN,  EXISTS  или  одного
из условий сравнения ( = | < | < | <= | | = ). Простые вложенные  подзапросы
обрабатываютя  системой  «снизу  вверх».  Первым  обрабатывается   вложенный
подзапрос  самого  нижнего  уровня.   Множество   значений,   полученное   в
результате его выполнения,  используется  при  реализации  подзапроса  более
высокого уровня и т.д.
      Запросы  с  коррелированными  вложенными  подзапросами  обрабатываются
системой в  обратном  порядке.  Сначала  выбирается  первая  строка  рабочей
таблицы, сформированной основным запросом, и из нее выбираются значения  тех
столбцов,  которые   используются   во   вложенном   подзапросе   (вложенных
подзапросах).  Если   эти   значения   удовлетворяют   условиям   вложенного
подзапроса, то выбранная строка включается  в  результат.  Затем  выбирается
вторая строка и т.д.,  пока  в  результат  не  будут  включены  все  строки,
удовлетворяющие   вложенному   подзапросу   (последовательности    вложенных
подзапросов).
      Следует отметить, что SQL обладает большой избыточностью в том смысле,
что он часто предоставляет несколько различных способов формулировки  одного
и  того  же  запроса.  Поэтому  во  многих  примерах  данной   главы   будут
использованы  уже  знакомые   нам   по   предыдущей   главе   концептуальные
формулировки  запросов.  И  несмотря  на  то,  что  часть  из  них  успешнее
реализуется с помощью соединений, здесь все же будут приведены  их  варианты
с  использованием  вложенных  подзапросов.  Это  связано  с   необходимостью
детального  знакомства  с  созданием  и   принципом   выполнения   вложенных
подзапросов, так  как  существует  немало  задач  (особенно  на  удаление  и
изменение данных), которые не могут быть реализованы другим способом.  Кроме
того, разные формулировки одного  и  того  же  запроса  требуют  для  своего
выполнения различных ресурсов  памяти  и  могут  значительно  отличаться  по
времени реализации в разных СУБД.

                        Простые вложенные подзапросы
      Простые вложенные подзапросы используются для представления  множества
значений, исследование которых должно осуществляться в каком-либо  предикате
IN, что  иллюстрируется  в  следующем  примере:  выдать  название  и  статус
поставщиков продукта с номером 11, т.е. помидоров.
|                                |Результат:                    |
|                                |Название      |Статус        |
|SELECT Название, Статус         |              |              |
|FROM Поставщики                 |              |              |
|WHERE ПС IN                     |              |              |
|( SELECT ПС                     |              |              |
|FROM Поставки                   |              |              |
|WHERE ПР = 11 );                |              |              |
|                                |СЫТНЫЙ        |рынок         |
|                                |УРОЖАЙ        |коопторг      |
|                                |ЛЕТО          |агрофирма     |
|                                |КОРЮШКА       |кооператив    |


      При обработке полного запроса система выполняет прежде всего вложенный
подзапрос. Этот подзапрос  выдает  множество  номеров  поставщиков,  которые
поставляют продукт с кодом ПР =  11,  а  именно  множество  (1,  5,  6,  8).
Поэтому первоначальный запрос эквивалентен такому простому запросу:

SELECT      Название, Статус
FROM  Поставщики
WHERE ПС IN (1, 5, 6, 8);
      Подзапрос с несколькими уровнями вложенности  можно  проиллюстрировать
на том же примере. Пусть требуется узнать не поставщиков  продукта  11,  как
это делалось в предыдущих  запросах,  а  поставщиков  помидоров,  являющихся
продуктом с номером 11. Для этого можно дать запрос

SELECT      Название, Статус
FROM  Поставщики
WHERE ПС IN
      (     SELECT     ПС
            FROM Поставки
            WHERE      ПР IN
                 (     SELECT     ПР
                       FROM  Продукты
                       WHERE Продукт = 'Помидоры' ));
      В данном случае результатом  самого  внутреннего  подзапроса  является
только одно значение (11). Как уже было показано выше, подзапрос  следующего
уровня в свою очередь дает в результате множество (1, 5, 6,  8).  Последний,
самый внешний SELECT, вычисляет приведенный  выше  окончательный  результат.
Вообще допускается любая глубина вложенности подзапросов.
Тот же результат можно получить с помощью соединения

SELECT      Название, Статус
FROM  Поставщики, Поставки, Продукты
WHERE Поставщики.ПС = Поставки.ПС
AND   Поставки.ПР = Продукты.ПР
AND   Продукт = 'Помидоры';
      При выполнении этого компактного запроса система  должна  одновременно
обрабатывать данные из трех таблиц,  тогда  как  в  предыдущем  примере  эти
таблицы  обрабатываются  поочередно.  Естественно,  что  для  их  реализации
тебуются  различные  ресурсы  памяти  и  времени,  однако  этого  невозможно
ощутить при работе с  ограниченным  объемом  данных  в  иллюстративной  базе
ПАНСИОН.

   Использование одной и той же таблицы во внешнем и вложенном подзапросе
      Выдать номера поставщиков, которые поставляют хотя  бы  один  продукт,
поставляемый поставщиком 6.
|                               |Результа|
|                               |т:      |
|                               |ПС      |
|SELECT DISTINCT ПС             |        |
|FROM Поставки                  |        |
|WHERE ПР IN                    |        |
|( SELECT ПР                    |        |
|FROM Поставки                  |        |
|WHERE ПС = 6);                 |        |
|                               |1       |
|                               |3       |
|                               |5       |
|                               |6       |
|                               |8       |


      Отметим, что ссылка на Поставки во вложенном подзапросе означает не то
же самое, что ссылка на Поставки во  внешнем  запросе.  В  действительности,
два имени Поставки обозначают  различные  значения.  Чтобы  этот  факт  стал
явным, полезно использовать псевдонимы, например, X и Y:

SELECT      DISTINCT X.ПС
FROM  Поставки X
WHERE X.ПР IN
      (     SELECT     Y.ПР
            FROM Поставки Y
            WHERE      Y.ПС = 6 );
      Здесь X и Y – произвольные псевдонимы таблицы  Поставки,  определяемые
во фразе FROM и используемые как явные уточнители во фразах SELECT и  WHERE.
Напомним, что псевдонимы определены лишь в пределах одного запроса.


         Вложенный подзапрос с оператором сравнения, отличным от IN
      Выдать  номера  поставщиков,  находящихся  в  том  же  городе,  что  и
поставщик с номером 6.
|                                          |Результ|
|                                          |ат:    |
|                                          |ПС     |
|SELECT ПС                                 |       |
|FROM Поставщики                           |       |
|WHERE Город =                             |       |
|( SELECT Город                            |       |
|FROM Поставщики                           |       |
|WHERE  ПС = 6 );                          |       |
|                                          |1      |
|                                          |4      |
|                                          |6      |


      В подобных запросах можно использовать и  другие  операторы  сравнения
(<, <=, <, = или  ),  однако,  если  вложенный  подзапрос  возвращает  более
одного значения и не используется оператор IN, будет возникать ошибка.


                    Коррелированные вложенные подзапросы
      Выдать название и статус поставщиков продукта с номером 11.

SELECT      Название, Статус
FROM  Поставщики
WHERE 11 IN
      (     SELECT     ПР
            FROM Поставки
            WHERE      ПС = Поставщики.ПС );
   Такой подзапрос отличается от обычного тем, что  вложенный  подзапрос  не
может быть обработан прежде, чем  будет  обрабатываться  внешний  подзапрос.
Это  связано  с  тем,  что   вложенный   подзапрос   зависит   от   значения
Поставщики.ПС  а  оно  изменяется  по  мере  того,  как  система   проверяет
различные строки таблицы Поставщики. Следовательно, с  концептуальной  точки
зрения обработка осуществляется следующим образом:
   1. Система проверяет первую строку таблицы Поставщики. Предположим, что
      это стр
Пред.1112131415След.
скачать работу

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

 

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

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


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