Рефераты. Организация Web-доступа к базам данных с использованием SQL-запросов p> Например, если нужно получить значение калорийности всех продуктов, то можно учесть, что при окислении 1 г углеводов или белков в организме освобождается в среднем 4.1 ккал, а при окислении 1 г жиров – 9.3 ккал, и выдать запрос:

SELECT Продукт, ((Белки+Углев)*4.1+Жиры*9.3)
FROM Продукты; результат которого приведен на рис. 2.3,а.
|а) | |Б) | | |в) |
|Продукт | |Продукт | | |Продукт | |
|Говядина|1928.1 |Говядина|Калорий |1928.1 |Зелень |118.9 |
| | | |= | | | |
|Судак |1523. |Судак |Калорий |1523. |Помидоры|196.8 |
| | | |= | | | |
|Масло |8287.5 |Масло |Калорий |8287.5 |Морковь |349.6 |
| | | |= | | | |
|Майонез |6464.7 |Майонез |Калорий |6464.7 |Лук |459.2 |
| | | |= | | | |
|Яйца |1618.9 |Яйца |Калорий |1618.9 |Яблоки |479.7 |
| | | |= | | | |
|Сметана |3011.4 |Сметана |Калорий |3011.4 |Молоко |605.1 |
| | | |= | | | |
|Молоко |605.1 |Молоко |Калорий |605.1 |Кофе |892.4 |
| | | |= | | | |
|Творог |1575. |Творог |Калорий |1575. |Судак |1523. |
| | | |= | | | |
|Морковь |349.6 |Морковь |Калорий |349.6 |Творог |1575. |
| | | |= | | | |
|Лук |459.2 |Лук |Калорий |459.2 |Яйца |1618.9 |
| | | |= | | | |
|Помидоры|196.8 |Помидоры|Калорий |196.8 |Говядина|1928.1 |
| | | |= | | | |
|Зелень |118.9 |Зелень |Калорий |118.9 |Сметана |3011.4 |
| | | |= | | | |
|Рис |3512.1 |Рис |Калорий |3512.1 |Рис |3512.1 |
| | | |= | | | |
|Мука |3556.7 |Мука |Калорий |3556.7 |Мука |3556.7 |
| | | |= | | | |
|Яблоки |479.7 |Яблоки |Калорий |479.7 |Сахар |4091.8 |
| | | |= | | | |
|Сахар |4091.8 |Сахар |Калорий |4091.8 |Майонез |6464.7 |
| | | |= | | | |
|Кофе |892.4 |Кофе |Калорий |892.4 |Масло |8287.5 |
| | | |= | | | |

Рисунок 2.3

Фраза SELECT может включать не только выражения, но и отдельные числовые или текстовые константы. Следует отметить, что текстовые константы должны заключаться в апострофы ('). На рис. 2.3,б приведен результат запроса:

SELECT Продукт, 'Калорий =', ((Белки+Углев)*4.1+Жиры *9.3)
FROM Продукты;

А что произойдет, если какой-либо член выражения не определен, т.е. имеет значение NULL и каким образом появилось такое значение?

Если при загрузке строк таблицы в какой-либо из вводимых строк отсутствует значение для какого-либо столбца, то СУБД введет в такое поле
NULL-значение. NULL-значение «придумано» для того, чтобы представить единым образом «неизвестные значения» для любых типов данных. Действительно, так как при вводе данных в столбец или их изменении СУБД запрещает ввод значений не соответствующих описанию данных этого столбца, то, например, нельзя использовать пробел для отсутствующего значения числа. Нельзя для этих целей использовать и ноль: нет месяца или дня недели равного нулю, да и для чисел ноль не может рассматриваться как неизвестное значение в одном месте и как известное – в другом. При выводе же NULL-значения на экран или печатающее устройство его код воспроизводится каким-либо специально заданным символом или набором символов: например, пробелом (если его нельзя перепутать с текстовым значением пробела) или сочетанием –0-.

С помощью специальной команды можно установить в СУБД один из режимов представления NULL-значений при выполнении числовых расчетов: запрет или разрешение замены NULL-значения нулем. В первом случае любое арифметическое выражение, содержащее неопределенный операнд, будет также иметь неопределенное значение. Во втором случае результат вычислений будет иметь численное значение (если это значение попадает в диапазон представления соответствующего типа данных).
Например, при выполнении запроса

SELECT ПР, Цена, К_во, (Цена * К_во)
FROM Поставки; и разных «настройках» СУБД могут быть получены разные результаты:
|ПР|Цена |К_во |(Цена*К_во) |ПР|Цена |К_во |(Цена*К_во) |
|9 |-0- |-0- |-0- |9 |-0- |-0- |0. |
|11|1.5 |50 |75. |11|1.5 |50 |75. |
|12|3. |10 |30. |12|3. |10 |30. |
|15|2. |170 |340. |15|2. |170 |340. |

Использование BETWEEN

С помощью BETWEEN … AND … (находится в интервале от … до …) можно отобрать строки, в которых значение какого-либо столбца находятся в заданном диапазоне.

Например, выдать перечень продуктов, в которых значение содержания белка находится в диапазоне от 10 до 50:
| |Результат: | |
| | | |
|SELECT Продукт, | | |
|Белки | | |
|FROM Продукты | | |
|WHERE Белки | | |
|BETWEEN 10 AND | | |
|50; | | |
| |Продукт |Белки |
| |Майонез |31. |
| |Сметана |26. |
| |Молоко |28. |
| |Морковь |13. |
| |Лук |17. |


Можно задать и NOT BETWEEN (не принадлежит диапазону между), например:
| |Результа| |
| |т: | |
| | | |
|SELECT Продукт, | | |
|Белки, Жиры | | |
|FROM Продукты | | |
|WHERE Белки NOT | | |
|BETWEEN 10 AND 50| | |
| | | |
|AND Жиры 100; | | |
| |Продукт |Белки |Жиры |
| |Говядина|189. |124. |
| |Масло |60. |825. |
|Яйца |127. |115. | |

BETWEEN особенно удобен при работе с данными, задаваемыми интервалами, начало и конец которых расположен в разных столбцах.

Для примера воспользуемся таблицей «минимальных окладов» (табл. 2.4), величина которых непосредственно связана со студенческой стипендией. В этой таблице для текущего значения минимального оклада установлена запредельная дата окончания 9 сентября 9999 года.

|Миноклад |Начало |Конец |
|2250 |01-01-1993 |31-03-1993 |
|4275 |01-04-1993 |30-06-1993 |
|7740 |01-07-1993 |30-11-1993 |
|14620 |01-12-1993 |30-06-1994 |
|20500 |01-07-1994 |09-09-9999 |

Рисунок 2.4

Если, например, потребовалось узнать, какие изменения минимальных окладов производились в 1993/94 учебном году, то можно выдать запрос

SELECT Начало, Миноклад
FROM Миноклады
WHERE Начало BETWEEN '1-9-1993' AND '31-8-1994' и получить результат:
|Начало |Миноклад |
|01-12-1993 |14620 |
|01-07-1994 |20500 |

Отметим, что при формировании запросов значения дат следует заключать в апострофы, чтобы СУБД не путала их с выражениями и не пыталась вычитать из 31 значение 8, а затем 1994.

Для выявления всех значений минимальных окладов, которые существовали в 1993/94 учебном году, можно сформировать запрос

SELECT *
FROM Миноклады
WHERE Начало BETWEEN '1-9-1993' AND '31-8-1994'
OR Конец BETWEEN '1-9-1993' AND '31-8-1994'
|Миноклад |Начало |Конец |
|7740 |01/07/1993|30/11/1993 |
|14620 |01/12/1993|30/06/1994 |
|20500 |01/07/1994|09/09/9999 |


Наконец, для получения минимального оклада на 15-5-1994:
| |Результат: | |
| |Миноклад |
|SELECT Миноклад | |
|FROM Миноклады | |
|WHERE '15-05-1994' | |
|BETWEEN Начало AND | |
|Конец | |
| |14620 |

Использование IN

Выдать сведения о блюдах на основе яиц, крупы и овощей

SELECT *
FROM Блюда
WHERE Основа IN (Яйца Крупа Овощи);
Результат:
|БЛ|Блюдо |В|Основа |Выход |Труд |
|1 |Салат летний |З|Овощи |200. |3 |
|3 |Салат витаминный |З|Овощи |200. |4 |
|16|Драчена |Г|Яйца |180. |4 |
|17|Морковь с рисом |Г|Овощи |260. |3 |
|19|Омлет с луком |Г|Яйца |200. |5 |
|20|Каша рисовая |Г|Крупа |210. |4 |
|21|Пудинг рисовый |Г|Крупа |160. |6 |
|23|Помидоры с луком |Г|Овощи |260. |4 |

Рассмотренная форма IN является в действительности просто краткой записью последовательности отдельных сравнений, соединенных операторами OR.
Предыдущее предложение эквивалентно такому:

SELECT *
FROM Блюда
WHERE Основа=Яйца OR Основа=Крупа OR Основа=Овощи;

Использование LIKE
Выдать перечень салатов
| |Результат: | |
| |Блюдо |
|SELECT Блюдо | |
|FROM Блюда | |
|WHERE Блюдо LIKE | |
|'Салат%'; | |
| |Салат летний |
| |Салат мясной |
| |Салат витаминный |
| |Салат рыбный |

Обычная форма «имя_столбца LIKE текстовая_константа» для столбца текстового типа позволяет отыскать все значения указанного столбца, соответствующие образцу, заданному «текстовой_константой». Символы этой константы интерпретируются следующим образом: символ _ (подчеркивание) – заменяет любой одиночный символ, символ % (процент) – заменяет любую последовательность из N символов (где N может быть нулем), все другие символы означают просто сами себя.

Следовательно, в приведенном примере SELECT будет осуществлять выборку записей из таблицы Блюда, для которых значение в столбце Блюдо начинается сочетанием 'Салат' и содержит любую последовательность из нуля или более символов, следующих за сочетанием 'Салат'. Если бы среди блюд были «Луковый салат», «Фруктовый салат» и т.п., то они не были бы найдены. Для их отыскания надо изменить фразу WHERE:

WHERE Блюдо LIKE '%салат%' или при отсутствии различий между малыми и большими буквами (такую настройку допускают некоторые СУБД):

WHERE Блюдо LIKE '%Салат%'
Это позволит отыскать все салаты.

Вовлечение неопределенного значения (NULL-значения)

Если при загрузке данных не введено значение в какое-либо поле таблицы, то СУБД поместит в него NULL-значение. Аналогичное значение можно ввести в поле таблицы, выполняя операцию изменения данных. Так, при отсутствии сведений о наличии у поставщиков судака и моркови в столбцы Цена и К_во соответствующих строк таблицы Поставки вводится NULL и там будет храниться код NULL-значения, а не 0, 0. Или пробел. (Отметим, что в распечатке таблицы Поставки в этих местах расположен пробел, установленный в СУБД для представления NULL-значения при выводе на печать).
В этом случае для выявления названий продуктов, отсутствующих в кладовой, шеф-повар может дать запрос
|Результат: |ПР |
|S| |2 |
|E| |9 |
|L| | |
|E| | |
|C| | |
|T| | |
|D| | |
|I| | |
|S| | |
|T| | |
|I| | |
|N| | |
|C| | |
|T| | |
|П| | |
|Р| | |
| | | |
|F| | |
|R| | |
|O| | |
|M| | |
|Н| | |
|а| | |
|л| | |
|и| | |
|ч| | |
|и| | |
|е| | |
| | | |
|W| | |
|H| | |
|E| | |
|R| | |
|E| | |
|К| | |
|_| | |
|в| | |
|о| | |
|I| | |
|S| | |
|N| | |
|U| | |
|L| | |
|L| | |
|;| | |

Естественно, что для выявления продуктов, существующих в кладовой, следует дать запрос

SELECT DISTINCT ПР
FROM Наличие
WHERE К_во IS NOT NULL;
Использование условий

столбец IS NULL и столбец IS NOT NULL вместо, например,

столбец = NULL и столбец < NULL связано с тем, что ничто – и даже само NULL-значение – не считается равным другому NULL-значению. (Несмотря на это, два неопределенных значения рассматриваются, однако, как дубликаты друг друга при исключении дубликатов, и предложение SELECT DISTINCT даст в результате не более одного
NULL-значения.)

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



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.