на тему рефераты
 
Главная | Карта сайта
на тему рефераты
РАЗДЕЛЫ

на тему рефераты
ПАРТНЕРЫ

на тему рефераты
АЛФАВИТ
... А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Э Ю Я

на тему рефераты
ПОИСК
Введите фамилию автора:


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


Кроме того, в список ORDER BY можно включать не только имя столбца, а его порядковую позицию в перечне SELECT. Благодаря этому возможно упорядочение результатов на основе вычисляемых столбцов, не имеющих имен.

Например, запрос

SELECT  Продукт, ((Белки+Углев)*4.1+Жиры*9.3)

FROM    Продукты

ORDER   BY 2;

позволит получить список продуктов, показанный на рис.2.3,в – переупорядоченный по возрастанию значений калорийности список рис.2.3,а.

Агрегирование данных

SQL-функции

В SQL существует ряд специальных стандартных функций (SQL-функций). Кроме специального случая COUNT(*) каждая из этих функций оперирует совокупностью значений столбца некоторой таблицы и создает единственное значение, определяемое так:

COUNT

7.    число значений в столбце,

SUM

8.    сумма значений в столбце,

AVG

9.    среднее значение в столбце,

MAX

10.  самое большое значение в столбце,

MIN

11.  самое малое значение в столбце.

Для функций 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. Использование запросов с использованием нескольких таблицы.

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

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

Даже при отсутствии средств одновременного доступа ко многим таблицам нежелателен проект, в котором информация о многих типах сущностей перемешана в одной таблице. 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 Ужин

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10


на тему рефераты
НОВОСТИ на тему рефераты
на тему рефераты
ВХОД на тему рефераты
Логин:
Пароль:
регистрация
забыли пароль?

на тему рефераты    
на тему рефераты
ТЕГИ на тему рефераты

Рефераты бесплатно, реферат бесплатно, курсовые работы, реферат, доклады, рефераты, рефераты скачать, рефераты на тему, сочинения, курсовые, дипломы, научные работы и многое другое.


Copyright © 2012 г.
При использовании материалов - ссылка на сайт обязательна.