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

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

ока поставщика с номером 1. Тогда значение Поставщики.ПС будет
      в данный момент имеет значение, равное 1, и система обрабатывает
      внутренний запрос

      (     SELECT     ПР
            FROM  Поставки
            WHERE ПС = 1 );
      получая в результате множество (9, 11, 12, 15). Теперь система может
      завершить обработку для поставщика с номером 1. Выборка значений
      Название и Статус для ПС=1 (СЫТНЫЙ и рынок) будет проведена тогда и
      только тогда, когда ПР=11 будет принадлежать этому множеству, что,
      очевидно, справедливо.
   2. Далее система будет повторять обработку такого рода для следующего
      поставщика и т.д. до тех пор, пока не будут рассмотрены все строки
      таблицы Поставщики.
      Подобные подзапросы называются коррелированными, так как их  результат
      зависит от значений, определенных  во  внешнем  подзапросе.  Обработка
      коррелированного подзапроса,  следовательно,  должна  повторяться  для
      каждого значения извлекаемого из внешнего подзапроса, а не выполняться
      раз и навсегда.
      Рассмотрим пример использования одной и той же таблицы во внешнем
подзапросе и коррелированном вложенном подзапросе.
Выдать номера всех продуктов, поставляемых только одним по-ставщиком.
|                                           |Результат:        |
|                                           |X.ПР              |
|SELECT DISTINCT X.ПР                       |                  |
|FROM Поставки X                            |                  |
|WHERE X.ПР NOT IN                          |                  |
|( SELECT Y.ПР                              |                  |
|FROM Поставки Y                            |                  |
|WHERE Y.ПС <> X.ПС );                      |                  |
|                                           |17                |


      Действие этого запроса можно пояснить следующим  образом:  «Поочередно
для каждой строки таблицы  Поставки,  скажем  X,  выделить  значение  номера
продукта (ПР), если и  только  если  это  значение  не  входит  в  некоторую
строку, скажем, Y, той же таблицы, а значение столбца номер поставщика  (ПС)
в строке Y не равно его значению в строке X».
      Отметим, что в этой формулировке должен быть  использован  по  крайней
мере один псевдоним – либо X, либо Y.


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


      Система последовательно выбирает строки таблицы  Поставщики,  выделяет
из них значения столбцов Название и  ПС,  а  затем  проверяет,  является  ли
истинным условие существования, т.е. су-ществует ли в таблице Поставки  хотя
бы одна строка со значением  ПР=11  и  значением  ПС,  равным  значению  ПС,
выбранному из таблицы Поставщики. Если условие  выполняется,  то  полученное
значение столбца Название включается в результат.
      Предположим,  что  первые  значения  полей  Название   и   ПС   равны,
соответственно, 'СЫТНЫЙ' и 1. Так как  в  таблице  Поставки  есть  строка  с
ПР=11 и ПС=1, то значение 'СЫТНЫЙ' должно быть включено в результат.
      Хотя этот первый пример только  показывает  иной  способ  формулировки
запроса для задачи, решаемой и другими путями (с помощью  оператора  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 это означает, что две таблицы можно  объединять  тогда  и  только
тогда, когда:
   1. они имеют одинаковое число столбцов, например, m;
   2. для всех i (i = 1, 2, …, m) i-й столбец первой таблицы и i-й столбец
      второй таблицы имеют в точности одинаковый тип данных.
Например, выдать названия продуктов, в которых нет жиров,  либо  входящих  в
состав блюда с кодом БЛ = 1:
|Результат:                                     |Продукт         |
|  |                                               |Майонез      |
|SE|                                               |             |
|LE|                                               |             |
|CT|                                               |             |
|Пр|                                               |             |
|од|                                               |             |
|ук|                                               |             |
|т |                                               |             |
|FR|                                               |             |
|OM|                                               |             |
|Пр|                                               |             |
|од|                                               |             |
|ук|                                               |             |
|ты|                                               |             |
|  |                                               |             |
|WH|                                               |             |
|ER|                                               |             |
|E |                                               |             |
|Жи|                                               |             |
|ры|                                               |             |
|= |                                               |             |
|0 |                                               |             |
|UN|                                               |             |
|IO|                                               |             |
|N |                                               |             |
|SE|                                               |             |
|LE|                                               |             |
|CT|                                               |             |
|Пр|                                               |             |
|од|                                               |             |
|ук|                                               |             |
|т |                                               |             |
|FR|                                               |             |
|OM|                               
Пред.1112131415След.
скачать работу

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

 

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

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


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