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

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

)
FROM  Продукты
ORDER BY 2;
позволит   получить   список   продуктов,   показанный   на   рис.2.3,в    –
переупорядоченный по возрастанию значений калорийности список рис.2.3,а.

                            Агрегирование данных
                                 SQL-функции
      В SQL существует ряд специальных  стандартных  функций  (SQL-функций).
Кроме  специального  случая  COUNT(*)  каждая  из  этих  функций   оперирует
совокупностью значений столбца  некоторой  таблицы  и  создает  единственное
значение, определяемое так:
COUNT
5. число значений в столбце,
SUM
6. сумма значений в столбце,
AVG
7. среднее значение в столбце,
MAX
8. самое большое значение в столбце,
MIN
9. самое малое значение в столбце.
   Для функций SUM и AVG рассматриваемый столбец должен  содержать  числовые
значения.
   Следует отметить, что здесь столбец – это столбец виртуальной таблицы,  в
которой могут содержаться данные не только из столбца базовой таблицы, но  и
данные, полученные путем функционального преобразования и  (или)  связывания
символами  арифметических  операций  значений  из  одного   или   нескольких
столбцов. При этом выражение,  определяющее  столбец  такой  таблицы,  может
быть сколь угодно сложным, но не должно содержать  SQL-функций  (вложенность
SQL-функций не допускается). Однако из SQL-функций  можно  составлять  любые
выражения.
   Аргументу всех функций, кроме  COUNT(*),  может  предшествовать  ключевое
слово  DISTINCT  (различный),  указывающее,   что   избыточные   дублирующие
значения должны быть исключены перед тем,  как  будет  применяться  функция.
Специальная же функция COUNT(*) служит  для  подсчета  всех  без  исключения
строк в таблице (включая дубликаты).

                  Функции без использования фразы GROUP BY
      Если не используется фраза GROUP BY, то  в  перечень  элементов_SELECT
можно включать лишь SQL-функции или  выражения,  содержащие  такие  функции.
Другими словами, нельзя иметь в списке столбцы,  не  являющихся  аргументами
SQL-функций.
      Например, выдать данные о массе лука (ПР=10), проданного поставщиками,
и указать количество этих поставщиков:

|                             |Резул|            |
|                             |ьтат:|            |
|                             |     |            |
|SELECT SUM(К_во),COUNT(К_во) |     |            |
|                             |     |            |
|FROM Поставки                |     |            |
|WHERE ПР = 10;               |     |            |
|                             |SUM(К|COUNT(К_во) |
|                             |_во) |            |
|                             |220  |2           |


      Если бы для вывода в результат еще и номера продукта  был  сформирован
запрос

SELECT      ПР,SUM(К_во),COUNT(К_во)
FROM  Поставки
WHERE ПР = 10;
то было бы получено сообщение об ошибке. Это связано с тем, что  SQL-функция
создает единственное значение из  множества  значений  столбца-аргумента,  а
для «свободного» столбца должно быть выдано все множество его значений.  Без
специального указания (оно задается фразой GROUP BY) SQL не будет  выяснять,
одинаковы значения этого множества (как в данном  примере,  где  ПР=10)  или
различны (как было бы при отсутствии WHERE фразы). Поэтому  подобный  запрос
отвергается системой.
Правда, никто не запрещает дать запрос

SELECT      'Кол-во лука =',SUM(К_во),COUNT(К_во)
FROM  Поставки
WHERE ПР = 10;
|Результат:        |              |             |
|'Кол-во лука ='   |SUM(К_во)     |COUNT(К_во)  |
|Кол-во лука =     |220           |2            |


      Отметим  также,  что  в  столбце-аргументе  перед  применением   любой
функции, кроме  COUNT(*),  исключаются  все  неопределенные  значения.  Если
оказывается, что  аргумент  –  пустое  множество,  функция  COUNT  принимает
значение 0, а остальные – NULL.
      Например,  для  получения  суммы   цен,   средней   цены,   количества
поставляемых  продуктов  и  количества  разных  цен   продуктов,   проданных
коопторгом УРОЖАЙ  (ПС=5),  а  также  для  получения  количества  продуктов,
которые могут поставляться этим коопторгом, можно дать запрос

SELECT      SUM(Цена),AVG(Цена),COUNT(Цена),
      COUNT(DISTINCT  Цена),COUNT(*)
FROM  Поставки
WHERE ПС = 5;
и получить

|SUM(Цена) |AVG(Цена) |COUNT(Цена) |COUNT(DISTINCT Цена)   |COUNT (*)  |
|6.2       |1.24      |5           |4                      |7          |


      В другом примере,  где  надо  узнать  «Сколько  поставлено  моркови  и
сколько поставщиков ее поставляют?»:

SELECT SUM(К_во),COUNT(К_во)
FROM  Поставки
WHER  ПР = 2;
будет получен ответ:
|SUM(К_во)        |COUNT (К_во)     |
|-0-              |0                |


      Наконец, попробуем получить  сумму  массы  поставленного  лука  с  его
средней ценой («Сапоги с яичницей»):
|                      |Результат:         |
|                      |                   |
|SELECT (SUM(К_во)     |                   |
|+AVG(Цена))           |                   |
|FROM Поставки         |                   |
|WHERE ПР = 10;        |                   |
|                      |SUM(К_во)+AVG(Цена)|
|                      |220.6              |


                               Фраза GROUP BY
      Мы  показали,  как  можно  вычислить  массу  определенного   продукта,
поставляемого поставщиками.  Предположим,  что  теперь  требуется  вычислить
общую  массу  каждого  из  продуктов,   поставляемых   в   настоящее   время
поставщиками. Это можно легко сделать с помощью предложения

SELECT      ПР, SUM(К_во)
FROM  Поставки
GROUP BY ПР;
Результат показан на рис. 2.5,а.

|а)    |           |б|      |      | |в)         | |г)          |
|      |           |)|      |      | |           | |            |
|ПР   |     |ПС   |ПР    |Цена |К_во |ПР    |     |ПР   |     |
|9    |0    |1    |9     |-0-  |-0-  |1     |370  |9    |0    |
|11   |150  |3    |9     |-0-  |-0-  |2     |0    |11   |150  |
|12   |30   |5    |9     |-0-  |-0-  |3     |250  |12   |30   |
|15   |370  |1    |11    |1.50 |50   |4     |100  |15   |70   |
|1    |370  |5    |11    |-0-  |-0-  |5     |170  |1    |370  |
|3    |250  |6    |11    |-0-  |-0-  |6     |220  |3    |250  |
|5    |170  |8    |11    |1.00 |100  |7     |200  |5    |70   |
|6    |220  |1    |12    |3.00 |10   |8     |150  |6    |140  |
|8    |150  |3    |12    |2.50 |20   |9     |0    |8    |150  |
|7    |200  |6    |12    |-0-  |-0-  |10    |220  |7    |200  |
|2    |0    |1    |15    |2.00 |170  |11    |150  |2    |0    |
|4    |100  |3    |15    |1.50 |200  |12    |30   |4    |100  |
|13   |190  |2    |1     |3.60 |300  |13    |190  |13   |190  |
|14   |70   |7    |1     |4.20 |70   |14    |70   |14   |70   |
|16   |250  |2    |3     |-0-  |-0-  |15    |370  |16   |250  |
|17   |50   |7    |3     |4.00 |250  |16    |250  |17   |50   |
|10   |220  |. . .|      |     |     |17    |50   |10   |220  |


                                 Рисунок 2.5


      Фраза GROUP BY (группировать по) инициирует  перекомпоновку  указанной
во FROM таблицы по группам, каждая из которых имеет  одинаковые  значения  в
столбце, указанном в GROUP BY.  В  рассматриваемом  примере  строки  таблицы
Поставки группируются так, что в одной  группе  содержатся  все  строки  для
продукта с ПР = 1, в другой – для продукта  с  ПР  =  2  и  т.д.  (см.  рис.
2.5,б). Далее к каждой группе применяется фраза SELECT. Каждое  выражение  в
этой фразе должно принимать  единственное  значение  для  группы,  т.е.  оно
может  быть  либо  значением  столбца,   указанного   в   GROUP   BY,   либо
арифметическим выражением, включающим это значение,  либо  константой,  либо
одной из SQL-функций, которая оперирует всеми значениями столбца в группе  и
сводит эти значения к единственному значению (например, к сумме).
      Отметим,  что  фраза  GROUP  BY  не  предполагает  ORDER   BY.   Чтобы
гарантировать упорядочение по ПР результата рассматриваемого  примера  (рис.
2.5,в) следует дать запрос

SELECT      ПР, SUM(К_во)
FROM  Поставки
GROUP BY ПР
ORDER BY ПР;
      Наконец, отметим, что  строки  таблицы  можно  группировать  по  любой
комбинации ее столбцов. Так, по запросу

SELECT      Т, БЛ, COUNT(БЛ)
FROM  Заказ
GROUP BY Т, БЛ;
можно  узнать  коды  и  количество  порций  блюд,   заказанных   отдыхающими
пансионата (32 человека) на каждую из трапез следующего дня:
|Т     |БЛ    |COUNT(БЛ)    |
|1     |3     |18           |
|1     |6     |14           |
|1     |19    |17           |
|1     |21    |15           |
|…     |      |             |


                         Использование фразы HAVING
      Фраза HAVING (рис. 2.3) играет такую же роль для групп,  что  и  фраза
WHERE для строк: она используется для исключения групп, точно  так  же,  как
WHERE используется для исключения строк. Эта фраза включается в  предложение
лишь при наличии фразы GROUP BY,  а  выражение  в  HAVING  должно  принимать
единственное значение для группы.
      Например,  выдать  коды  продуктов,  поставляемых  более   чем   двумя
поставщиками:
|                   |Результат:  |ПР              |
|SELECT             |            |                |
|FROM Поставки      |            |                |
|GROUP BY ПС        |            |                |
|HAVING COUNT(*)  2;|            |                |
|                   |            |9               |
|                   |            |11              |
|                   |            |12              |
|                   |            |                |



     2.2.3. Использование запросов с использованием нескольких таблицы.


О средствах одновременной работы с множеством таблиц

      Затрагивая вопросы проектирования баз данных, мы  выяснили,  что  базы
данных – это множество взаимосвязанных сущностей или  отношений  (табли
Пред.678910След.
скачать работу

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

 

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

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


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